From f2cf9344e79344466c364591dce71be6c41a78a9 Mon Sep 17 00:00:00 2001 From: Sarah Vaupel Date: Thu, 9 Jun 2022 21:09:18 +0200 Subject: [PATCH] Merge branch master of gitlab2.rz.ifi.lmu.de:uni2work/uni2work --- .babelrc | 9 +- .eslintrc.json | 3 +- CHANGELOG.md | 229 + config/settings.yml | 9 + frontend/src/app.sass | 44 +- .../src/lib/event-manager/event-manager.js | 103 + .../movement-observer/movement-observer.js | 2 +- .../lib/storage-manager/storage-manager.js | 13 +- frontend/src/lib/table/table.js | 2 +- .../src/lib/tooltips/frontend-tooltips.js | 22 + frontend/src/messages.js | 17 + .../src/services/http-client/http-client.js | 12 + .../services/http-client/http-client.spec.js | 10 +- .../services/util-registry/util-registry.js | 55 +- .../util-registry/util-registry.spec.js | 104 +- frontend/src/utils/alerts/alerts.js | 52 +- frontend/src/utils/alerts/alerts.spec.js | 9 +- frontend/src/utils/asidenav/asidenav.js | 22 +- frontend/src/utils/asidenav/asidenav.spec.js | 8 +- frontend/src/utils/async-form/async-form.js | 20 +- .../src/utils/async-form/async-form.spec.js | 8 +- frontend/src/utils/async-table/async-table.js | 84 +- .../src/utils/async-table/async-table.spec.js | 9 +- frontend/src/utils/check-all/check-all.js | 40 +- .../src/utils/check-all/check-all.spec.js | 9 +- .../src/utils/course-teaser/course-teaser.js | 17 +- .../src/utils/exam-correct/exam-correct.js | 56 +- frontend/src/utils/form/auto-submit-button.js | 5 +- .../src/utils/form/auto-submit-button.spec.js | 27 + frontend/src/utils/form/auto-submit-input.js | 17 +- .../src/utils/form/auto-submit-input.spec.js | 30 + .../utils/form/communication-recipients.js | 92 +- frontend/src/utils/form/datepicker.css | 727 - frontend/src/utils/form/datepicker.js | 177 +- frontend/src/utils/form/enter-is-tab.js | 44 +- frontend/src/utils/form/enter-is-tab.md | 8 + frontend/src/utils/form/form-error-remover.js | 15 +- .../src/utils/form/form-error-reporter.js | 35 +- .../src/utils/form/interactive-fieldset.js | 16 +- .../src/utils/form/navigate-away-prompt.js | 30 +- .../src/utils/form/reactive-submit-button.js | 14 +- .../src/utils/hide-columns/hide-columns.js | 48 +- frontend/src/utils/inputs/checkbox.js | 35 +- frontend/src/utils/inputs/checkrange.js | 125 + frontend/src/utils/inputs/checkrange.md | 5 + frontend/src/utils/inputs/file-input.js | 16 +- frontend/src/utils/inputs/file-max-size.js | 13 +- frontend/src/utils/inputs/inputs.js | 2 + frontend/src/utils/inputs/password.js | 41 +- frontend/src/utils/inputs/radio.js | 38 +- frontend/src/utils/mass-input/mass-input.js | 27 +- frontend/src/utils/modal/modal.js | 41 +- frontend/src/utils/navbar/navbar.js | 18 +- frontend/src/utils/pageactions/pageactions.js | 31 +- frontend/src/utils/show-hide/show-hide.js | 19 +- frontend/src/utils/sort-table/sort-table.js | 2 +- frontend/src/utils/tooltips/tooltips.js | 20 +- messages.tar.bz2 | Bin 671822 -> 0 bytes messages/uniworx/categories/admin/en-eu.msg | 4 +- .../categories/authorization/de-de-formal.msg | 17 +- .../categories/authorization/en-eu.msg | 16 +- .../courses/courses/de-de-formal.msg | 5 +- .../categories/courses/courses/en-eu.msg | 9 +- .../courses/exam/exam_office/de-de-formal.msg | 21 + .../courses/exam/exam_office/en-eu.msg | 21 + .../courses/submission/de-de-formal.msg | 5 +- .../categories/courses/submission/en-eu.msg | 4 + messages/uniworx/categories/help/en-eu.msg | 4 +- .../settings/auth_settings/en-eu.msg | 4 +- .../settings/csv_options/de-de-formal.msg | 2 + .../categories/settings/csv_options/en-eu.msg | 2 + .../categories/settings/de-de-formal.msg | 2 + .../uniworx/categories/settings/en-eu.msg | 4 +- .../system_message/de-de-formal.msg | 5 + .../categories/system_message/en-eu.msg | 5 + messages/uniworx/misc/de-de-formal.msg | 4 +- messages/uniworx/misc/en-eu.msg | 4 +- .../navigation/breadcrumbs/de-de-formal.msg | 5 +- .../utils/navigation/breadcrumbs/en-eu.msg | 3 + .../utils/navigation/menu/de-de-formal.msg | 5 +- .../uniworx/utils/navigation/menu/en-eu.msg | 3 + messages/uniworx/utils/site_layout/en-eu.msg | 2 +- .../utils/table_column/de-de-formal.msg | 6 +- messages/uniworx/utils/table_column/en-eu.msg | 6 +- messages/uniworx/utils/utils/de-de-formal.msg | 5 + messages/uniworx/utils/utils/en-eu.msg | 5 + models/exam-office/exam-labels.model | 18 + models/external-apis.model | 9 + models/system-messages.model | 3 +- models/users.model | 8 +- package-lock.json | 21044 +++++----------- package.json | 128 +- package.yaml | 20 +- records.json | 1539 +- routes | 25 +- src/Application.hs | 4 + src/Auth/Dummy.hs | 8 +- src/Auth/LDAP.hs | 10 +- src/Auth/PWHash.hs | 10 +- src/Control/Monad/Trans/Except/Instances.hs | 19 + src/Control/Monad/Trans/Random/Instances.hs | 17 + src/CryptoID.hs | 1 + src/Data/CaseInsensitive/Instances.hs | 10 + src/Data/CryptoID/Instances.hs | 29 + src/Data/HashSet/Instances.hs | 17 + src/Data/NonNull/Instances.hs | 15 + src/Data/SemVer/Instances.hs | 31 + src/Data/Time/Clock/Instances.hs | 13 + src/Data/Time/Clock/Instances/TH.hs | 14 + src/Data/UUID/Instances.hs | 10 + src/Database/Persist/Class/Instances.hs | 5 + src/Foundation/Authorization.hs | 16 +- src/Foundation/I18n.hs | 11 + src/Foundation/Instances.hs | 8 +- src/Foundation/Navigation.hs | 32 +- src/Foundation/Routes.hs | 26 + src/Foundation/Servant.hs | 195 + src/Foundation/Servant/Types.hs | 424 + src/Foundation/SiteLayout.hs | 13 +- src/Foundation/Yesod/Auth.hs | 2 + src/Foundation/Yesod/StaticContent.hs | 4 +- src/Handler/ApiDocs.hs | 35 + src/Handler/Course/Communication.hs | 41 +- src/Handler/Course/Edit.hs | 54 +- src/Handler/Course/List.hs | 8 + src/Handler/Course/Show.hs | 12 +- src/Handler/Course/Users.hs | 18 +- src/Handler/Exam/Form.hs | 15 +- src/Handler/Exam/Users.hs | 7 +- src/Handler/ExamOffice/Exam.hs | 38 +- src/Handler/ExamOffice/Exams.hs | 318 +- src/Handler/Help.hs | 2 +- src/Handler/Info.hs | 5 +- src/Handler/Metrics.hs | 2 +- src/Handler/News.hs | 20 +- src/Handler/Profile.hs | 176 +- src/Handler/Sheet/PersonalisedFiles.hs | 9 +- src/Handler/Submission/Helper.hs | 1 - src/Handler/Submission/List.hs | 24 +- src/Handler/Swagger.hs | 78 + src/Handler/SystemMessage.hs | 51 +- src/Handler/Tutorial/Communication.hs | 20 +- src/Handler/Tutorial/Users.hs | 6 + src/Handler/Users.hs | 17 +- src/Handler/Users/Add.hs | 2 + src/Handler/Utils/Communication.hs | 42 +- src/Handler/Utils/Download.hs | 2 + src/Handler/Utils/ExternalExam/Users.hs | 23 +- src/Handler/Utils/Files.hs | 8 + src/Handler/Utils/Form.hs | 45 +- src/Handler/Utils/Form/MassInput.hs | 2 +- src/Handler/Utils/Random.hs | 66 + src/Handler/Utils/Table/Columns.hs | 9 + src/Handler/Utils/Table/Pagination.hs | 2 +- src/Handler/Utils/Users.hs | 23 +- src/Import/NoModel.hs | 22 +- src/Import/Servant.hs | 9 + src/Import/Servant/NoFoundation.hs | 46 + src/Jobs.hs | 1 + src/Jobs/Crontab.hs | 14 + src/Jobs/Handler/ExternalApis.hs | 15 + src/Jobs/Handler/Files.hs | 18 + src/Jobs/Handler/SendCourseCommunication.hs | 8 +- src/Jobs/Types.hs | 13 +- src/Jose/Jwk/Instances.hs | 73 + src/Jose/Jwt/Instances.hs | 4 + src/Mail.hs | 23 +- src/Model.hs | 3 + src/Model/Tokens/Bearer.hs | 18 +- src/Model/Types.hs | 4 + src/Model/Types/Apis.hs | 61 + src/Model/Types/Common.hs | 76 +- src/Model/Types/Communication.hs | 21 + src/Model/Types/Csv.hs | 20 +- src/Model/Types/ExamOffice.hs | 8 + src/Model/Types/File.hs | 24 +- src/Model/Types/Security.hs | 64 +- src/Model/Types/Submission.hs | 2 +- src/Model/Types/SystemMessage.hs | 6 + src/Model/Types/TH/JSON.hs | 31 + src/Model/Types/User.hs | 3 + src/Network/URI/Instances.hs | 30 + src/Servant/Client/Core/BaseUrl/Instances.hs | 49 + src/Servant/Docs/Internal/Pretty/Instances.hs | 14 + src/Servant/Server/Instances.hs | 13 + src/ServantApi.hs | 14 + src/ServantApi/ExternalApis.hs | 109 + src/ServantApi/ExternalApis/Type.hs | 222 + src/Settings.hs | 14 + src/Settings/Cluster/Volatile.hs | 13 +- src/Utils.hs | 20 +- src/Utils/Form.hs | 221 +- src/Utils/Frontend/Notification.hs | 9 +- src/Utils/Icon.hs | 2 + src/Utils/Lens.hs | 4 + src/Utils/Message.hs | 4 +- src/Utils/Tokens.hs | 87 +- src/Yesod/Core/Instances.hs | 3 - src/Yesod/Servant.hs | 592 + src/Yesod/Servant/HttpApiDataInjective.hs | 90 + stack.yaml | 4 +- stack.yaml.lock | 24 +- templates/course.hamlet | 7 + .../exam-office/exam-result-synced.hamlet | 2 +- templates/i18n/allocation-info/en-eu.hamlet | 2 +- ...count-deletion-during-testing.en-eu.hamlet | 2 +- ...dditional-sheet-notifications.en-eu.hamlet | 2 +- ...urse-accept-substitutes-fixed.en-eu.hamlet | 2 +- ...ion-course-accept-substitutes.en-eu.hamlet | 2 +- ...ation-new-course-notification.en-eu.hamlet | 2 +- ...ly-accept-course-applications.en-eu.hamlet | 2 +- ...ourse-communication-tutorials.en-eu.hamlet | 2 +- ...ourse-participant-detail-page.en-eu.hamlet | 2 +- ...ttons-work-without-javascript.en-eu.hamlet | 2 +- ...munication-attachments.de-de-formal.hamlet | 2 + .../communication-attachments.en-eu.hamlet | 2 + .../cookie-active-auth-tags.en-eu.hamlet | 2 +- .../corrections-csv-export.en-eu.hamlet | 2 +- .../corrector-consider-deficits.en-eu.hamlet | 2 +- .../course-administrator-roles.en-eu.hamlet | 2 +- ...course-associated-study-field.en-eu.hamlet | 2 +- .../course-list-over-all-terms.en-eu.hamlet | 2 +- ...-participants-list-add-sheets.en-eu.hamlet | 2 +- .../course-participants-sex.en-eu.hamlet | 2 +- .../course-register-by-admin.en-eu.hamlet | 2 +- ...rse-shorthands-within-schools.en-eu.hamlet | 2 +- ...-course-participants-features.en-eu.hamlet | 2 +- ...icipants-registered-tutorials.en-eu.hamlet | 2 +- .../csv-option-character-set.en-eu.hamlet | 2 +- .../csv-option-timestamp.en-eu.hamlet | 2 +- ...nload-all-sheet-files-by-type.en-eu.hamlet | 2 +- .../download-all-sheet-files.en-eu.hamlet | 2 +- ...essages-for-table-item-vanish.en-eu.hamlet | 2 +- ...ate-allocated-course-capacity.en-eu.hamlet | 2 +- ...ement-participant-duplication.en-eu.hamlet | 2 +- .../exam-additional-schools.en-eu.hamlet | 2 +- .../exam-automatic-boni.en-eu.hamlet | 2 +- .../exam-automatic-results.en-eu.hamlet | 2 +- ...ribution-better-rules-display.en-eu.hamlet | 2 +- ...oom-distribution-respect-size.en-eu.hamlet | 2 +- ...stribution-unrestricted-rooms.en-eu.hamlet | 2 +- ...m-automatic-room-distribution.en-eu.hamlet | 2 +- .../i18n/changelog/exam-closure.en-eu.hamlet | 2 +- .../changelog/exam-grading-mode.en-eu.hamlet | 2 +- ...exam-office-exam-notification.en-eu.hamlet | 2 +- .../i18n/changelog/exam-offices.en-eu.hamlet | 2 +- .../i18n/changelog/exam-staff.en-eu.hamlet | 2 +- .../export-course-participants.en-eu.hamlet | 2 +- .../file-download-option.en-eu.hamlet | 2 +- .../fix-sheet-bonus-rounding.en-eu.hamlet | 2 +- .../former-course-participants.en-eu.hamlet | 2 +- .../changelog/forms-times-reset.en-eu.hamlet | 2 +- .../changelog/ldap-ad-errors.en-eu.hamlet | 2 +- .../changelog/markdown-emails.en-eu.hamlet | 2 +- .../markdown-html-input.en-eu.hamlet | 2 +- .../non-anonymised-correction.en-eu.hamlet | 2 +- ...-course-participant-via-admin.en-eu.hamlet | 2 +- ...tification-submission-changed.en-eu.hamlet | 2 +- .../passing-by-points-works.en-eu.hamlet | 2 +- .../personal-information.en-eu.hamlet | 2 +- ...matic-correction-distribution.en-eu.hamlet | 2 +- .../changelog/sheet-pass-always.en-eu.hamlet | 2 +- .../sheet-specific-files.en-eu.hamlet | 2 +- ...no-submission-and-zip-control.en-eu.hamlet | 2 +- .../table-forms-work-after-ajax.en-eu.hamlet | 2 +- .../tooltips-without-javascript.en-eu.hamlet | 2 +- .../tutorial-tutor-control.en-eu.hamlet | 2 +- .../upload-mode-empty-ok.en-eu.hamlet | 2 +- .../warning-multiple-semesters.en-eu.hamlet | 2 +- .../workflows-archivation.de-de-formal.hamlet | 11 + .../workflows-archivation.en-eu.hamlet | 13 + templates/i18n/changelog/xlsx.en-eu.hamlet | 2 +- .../i18n/changelog/yaml-ratings.en-eu.hamlet | 2 +- .../en-eu.hamlet | 4 +- .../i18n/faq/no-campus-account.en-eu.hamlet | 18 +- templates/i18n/help-instructions/en-eu.hamlet | 7 +- .../i18n/implementation/de-de-formal.hamlet | 1 + templates/i18n/implementation/en-eu.hamlet | 1 + templates/i18n/imprint/de-de-formal.hamlet | 6 +- templates/i18n/imprint/en.hamlet | 6 +- templates/i18n/info-lecturer/en-eu.hamlet | 2 +- .../de-de-formal.hamlet | 9 + .../en-eu.hamlet | 9 + templates/mail/courseCommunication.hamlet | 2 +- .../profile/exam-office-labels/add.hamlet | 6 + .../profile/exam-office-labels/cell.hamlet | 8 + .../profile/exam-office-labels/layout.hamlet | 17 + templates/tutorial-participants.hamlet | 11 + templates/widgets/aform/aform.hamlet | 12 +- .../communication/recipientLayout.hamlet | 6 +- templates/widgets/exam-office-label.hamlet | 4 + templates/widgets/genericFileField.hamlet | 6 +- .../volatileClusterSettings/add.hamlet | 4 + .../volatileClusterSettings/form.hamlet | 6 + .../volatileClusterSettings/layout.hamlet | 16 + templates/workflows/workflow.hamlet | 11 + test/Database/Fill.hs | 51 + test/Foundation/ServantSpec.hs | 36 + test/FoundationSpec.hs | 20 + test/Jose/Jwk/TestInstances.hs | 34 + test/Model/TypesSpec.hs | 49 + test/ModelSpec.hs | 2 + .../Client/Core/BaseUrl/TestInstances.hs | 20 + test/ServantApi/ExternalApis/TypeSpec.hs | 19 + test/ServantApi/ExternalApisSpec.hs | 48 + test/ServantApiSpec.hs | 36 + test/TestImport.hs | 132 + test/TestInstances.hs | 2 + test/User.hs | 2 + testdata/workflows | 1 - webpack.config.js | 83 +- 311 files changed, 13234 insertions(+), 17548 deletions(-) create mode 100644 frontend/src/lib/event-manager/event-manager.js create mode 100644 frontend/src/lib/tooltips/frontend-tooltips.js create mode 100644 frontend/src/messages.js create mode 100644 frontend/src/utils/form/auto-submit-button.spec.js create mode 100644 frontend/src/utils/form/auto-submit-input.spec.js delete mode 100644 frontend/src/utils/form/datepicker.css create mode 100644 frontend/src/utils/form/enter-is-tab.md create mode 100644 frontend/src/utils/inputs/checkrange.js create mode 100644 frontend/src/utils/inputs/checkrange.md delete mode 100644 messages.tar.bz2 create mode 100644 models/exam-office/exam-labels.model create mode 100644 models/external-apis.model create mode 100644 src/Control/Monad/Trans/Except/Instances.hs create mode 100644 src/Control/Monad/Trans/Random/Instances.hs create mode 100644 src/Data/HashSet/Instances.hs create mode 100644 src/Data/SemVer/Instances.hs create mode 100644 src/Data/Time/Clock/Instances/TH.hs create mode 100644 src/Foundation/Servant.hs create mode 100644 src/Foundation/Servant/Types.hs create mode 100644 src/Handler/ApiDocs.hs create mode 100644 src/Handler/Swagger.hs create mode 100644 src/Handler/Utils/Random.hs create mode 100644 src/Import/Servant.hs create mode 100644 src/Import/Servant/NoFoundation.hs create mode 100644 src/Jobs/Handler/ExternalApis.hs create mode 100644 src/Jose/Jwk/Instances.hs create mode 100644 src/Model/Types/Apis.hs create mode 100644 src/Model/Types/Communication.hs create mode 100644 src/Model/Types/ExamOffice.hs create mode 100644 src/Model/Types/SystemMessage.hs create mode 100644 src/Servant/Client/Core/BaseUrl/Instances.hs create mode 100644 src/Servant/Docs/Internal/Pretty/Instances.hs create mode 100644 src/Servant/Server/Instances.hs create mode 100644 src/ServantApi.hs create mode 100644 src/ServantApi/ExternalApis.hs create mode 100644 src/ServantApi/ExternalApis/Type.hs create mode 100644 src/Yesod/Servant.hs create mode 100644 src/Yesod/Servant/HttpApiDataInjective.hs create mode 100644 templates/i18n/changelog/communication-attachments.de-de-formal.hamlet create mode 100644 templates/i18n/changelog/communication-attachments.en-eu.hamlet create mode 100644 templates/i18n/changelog/workflows-archivation.de-de-formal.hamlet create mode 100644 templates/i18n/changelog/workflows-archivation.en-eu.hamlet create mode 100644 templates/i18n/workflow-archivation-scheduled/de-de-formal.hamlet create mode 100644 templates/i18n/workflow-archivation-scheduled/en-eu.hamlet create mode 100644 templates/profile/exam-office-labels/add.hamlet create mode 100644 templates/profile/exam-office-labels/cell.hamlet create mode 100644 templates/profile/exam-office-labels/layout.hamlet create mode 100644 templates/widgets/exam-office-label.hamlet create mode 100644 templates/widgets/massinput/systemMessage/volatileClusterSettings/add.hamlet create mode 100644 templates/widgets/massinput/systemMessage/volatileClusterSettings/form.hamlet create mode 100644 templates/widgets/massinput/systemMessage/volatileClusterSettings/layout.hamlet create mode 100644 test/Foundation/ServantSpec.hs create mode 100644 test/Jose/Jwk/TestInstances.hs create mode 100644 test/Servant/Client/Core/BaseUrl/TestInstances.hs create mode 100644 test/ServantApi/ExternalApis/TypeSpec.hs create mode 100644 test/ServantApi/ExternalApisSpec.hs create mode 100644 test/ServantApiSpec.hs delete mode 160000 testdata/workflows diff --git a/.babelrc b/.babelrc index c72dfe479..d2c3f85c5 100644 --- a/.babelrc +++ b/.babelrc @@ -1,10 +1,17 @@ { "presets": [ - ["@babel/preset-env", { "useBuiltIns": "usage" }] + ["env", { + "useBuiltIns": "usage", + "targets": { "node": "current" } + } + ] ], "plugins": [ ["@babel/plugin-proposal-decorators", { "legacy": true }], ["@babel/plugin-proposal-class-properties", { "loose": true }], + ["@babel/plugin-proposal-private-methods", { "loose": true }], + ["@babel/plugin-proposal-private-property-in-object", { "loose": true }], + ["@babel/plugin-transform-modules-commonjs"], ["@babel/transform-runtime"] ] } diff --git a/.eslintrc.json b/.eslintrc.json index 6fcc6b0fb..e83826d48 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,9 +11,10 @@ "flatpickr": "readonly", "$": "readonly" }, - "parser": "babel-eslint", + "parser": "@babel/eslint-parser", "parserOptions": { "ecmaVersion": 2018, + "requireConfigFile": false, "ecmaFeatures": { "legacyDecorators": true } diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b4c8497..9433f8c68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,39 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [26.1.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v26.1.0...v26.1.1) (2022-06-06) + +## [26.1.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v26.0.1...v26.1.0) (2022-06-05) + + +### Features + +* **apis:** further integrate servant ([bf2ff2d](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/bf2ff2dc9c4a986e9088feca41c00123bf2c785a)) +* **apis:** integrate servant ([e3d504b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e3d504bd113f76854748929201c7e476c2911ee0)) +* **apis:** support servant-generic ([e8bbaa0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e8bbaa0463afb11998d1a21a9e4ff068ba2b7ea3)) +* **apis:** version negotiation ([76e0bcf](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/76e0bcf693afeb15edae0b8170c3a813b10ae062)) +* **app-settings:** add duration after which finalized WorkflowWorkflows will be archived ([465a92b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/465a92b9829db9a9969cf370c635bbf9407f07f5)) +* **external-apis:** add ExternalApisList ([4216785](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4216785e90931ec54dc723166442a7acbe491851)) +* **external-apis:** create new external api registrations ([559f9db](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/559f9db7d58e26758209e61ef5ac8adc48b25221)) +* **external-apis:** idents, info, pong, delete, and expiry ([90679e0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/90679e00952ee4d6df584b52ceba99c0216e222e)) +* **help:** update help instructions, add support times ([5201a93](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5201a93de67e5589cca8511722f8513ab5f12fb8)) +* link api docs ([b277bd8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b277bd8424bdb8aef6c0c2e22acd70854f6ba18b)) +* **nix:** add postman for api debugging ([5a964f3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5a964f347c9306989f753a69cd56a92404aed699)) +* **servant:** dry-run support ([47df8a3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/47df8a312f72c7d019a536e7f2155ab7bd52febf)) +* **workflows:** add archived timestamp ([088c2f5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/088c2f5c751e868dbe50b7fdc04fc9f3f0206966)) +* **workflows:** implement archive and list page actions ([fac92f9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/fac92f9b5053d9f11dc1d72c81d290acd888cd63)) +* **workflows:** implement archive routes ([4416094](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/441609436a4e4a78f4ff826603a2a2be2dcabb41)) +* **workflows:** implement breadcrumbs for archive routes ([4adaf1e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4adaf1e806cf3bd1181c78c3d75d57692ed62356)) +* **workflows:** implement handlers for listing all workflows ([85c24f7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/85c24f713a974bcb932513da162d5224c2d76fa3)) +* **workflows:** restrict all (except admin) workflow lists on non-archived ([97723ad](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/97723ad895c080819c29105717aeb9cfdd19c7a1)) +* **workflows:** set archived timestamp on state change ([23b1065](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/23b106554567db8d75478389ef043f17b7b43458)) +* **workflows:** show info and warnings about scheduled/performed archivation ([424692d](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/424692d61110042462d7d88310290a8f682bd23a)) + + +### Bug Fixes + +* **lms:** direct upload did not commit to DB ([e7cea4a](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e7cea4aa6c5b05285e5c47d815067a4d45315024)) + ## [25.24.5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.24.4...v25.24.5) (2022-06-07) @@ -42,6 +75,40 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* **async-tabel, async-form:** removed destroyAll call ([236009e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/236009e508245ba10aa5f45b9514c8186ab186cf)) +* **migration:** dont force app settings ([4486a00](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4486a00d45ff9783115064b640b58f006b2e78d7)) +* **test:** add missing workflow instance ([6c92440](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6c92440c6419012ef96a7410e769c8724a8d2206)) +* **workflows:** add missing Hashable instance for WorkflowWorkflowListType ([6e46e4e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6e46e4e9ef34130582a3511ff01b42f4428dd1a1)) +* **workflows:** correct interpolation of archived state in headings ([84d3327](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/84d3327db37aa1177cc2e9b40fa9fc3e03ec7867)) + +## [26.0.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v26.0.0...v26.0.1) (2022-04-22) + + +### Bug Fixes + +* **frontend:** various fe incompatabilities with updated tooling ([46530c6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/46530c6c644bec65c2219fd9b5830bc5bb8e9baf)) + +## [26.0.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.29.3...v26.0.0) (2022-04-22) + + +### ⚠ BREAKING CHANGES + +* **system-message:** fix on-volatile-cluster-settings model default + +### Bug Fixes + +* **system-message:** fix on-volatile-cluster-settings model default ([4027f31](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4027f3144b613dbe67ca44f7a3142c13ff6f4dff)) +* **webpack:** switch to wp-5 assets ([ec4d710](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ec4d710ce0a5429160365397ad17c23b71c0a4cf)) + +## [25.29.3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.29.2...v25.29.3) (2022-04-21) + + +### Bug Fixes +* **system-message:** add volatile cluster setting model default ([6655582](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6655582ace098808bfcea90ca85fce2fe0024d2b)) + +## [25.29.2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.29.1...v25.29.2) (2022-04-21) + +## [25.29.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.29.0...v25.29.1) (2022-04-21) * **uploadcache:** set default to localhost ([eeb22de](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/eeb22dec9737e014c20b852438da4373219884b0)) @@ -52,6 +119,9 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* update lodash.debounce and defer imports ([f03dae6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f03dae66e92a36ca7cea01fa8b508f7f8612200a)) + +## [25.29.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.28.0...v25.29.0) (2022-04-21) * **lms:** correct lms table column sorting key ([9ee4767](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9ee476736ccd361559edd3570dc27ba83ff8a334)) ## [25.23.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.23.0...v25.23.1) (2022-02-23) @@ -61,6 +131,15 @@ All notable changes to this project will be documented in this file. See [standa ### Features +* **workflows:** additional text field types ([4a34344](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4a34344c332291ceaed192ee1f0a73d97d855eeb)) + + +### Bug Fixes + +* **workflows:** always show navigation item ([82a4ecc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/82a4eccaa4fc5d6df3ff0bc71a025973f12c7dfd)) +* **workflows:** properly distinguish anonymous/automatic ([21a1fb5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/21a1fb543b347a871b21db636d217e0816bd5388)) + +## [25.28.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.27.0...v25.28.0) (2022-04-20) * **log:** remove container log setting in order to use stdout ([8f460bd](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8f460bd0a3aba9013f2ee2d20a1465487ecfe629)) ## [25.22.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.24...v25.22.0) (2022-01-12) @@ -69,10 +148,36 @@ All notable changes to this project will be documented in this file. See [standa ### Features * **status:** show instance running time ([8743719](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8743719183abfa10d089c6e7e765e49f6da3c50d)) +* **forms:** honeypots for unauthorized users ([8085c30](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8085c30420dcca9d8c493da8241a5e10d9ef8122)) +* **frontend:** remove deprecated tail.DateTime ([6bfbff4](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6bfbff41f6081dd65b0a4afa9155a125f31de973)) +* **system-msg:** add volatile cluster settings to system message forms ([f8f9dc0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f8f9dc0621a18862bcf83364b874e176553ed7b1)) +* **system-msg:** display system status messages on volatile cluster settings only ([da253f7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/da253f7fbdb919bb9cc52310148dcc28c382cfa4)) +* **system-msg:** display volatile cluster settings in msg list ([32bed15](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/32bed159615b96ebab23766d748a844b1ba42f41)) +* **translation mistakes:** courses and landing page ([9cff722](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9cff7220231a227859c771b720084e8a6952b5c1)) +* **translation mistakes:** done ([229e379](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/229e3793c6266a2936ffb32854cb14e0bb0ba510)) +* **translation mistakes:** megre request ([ff07768](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ff077680b6fde39f4f82ba162781e471a9f3071c)) +* **translation mistakes:** until admin ([43e5f9f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/43e5f9f7aa340d564557ec499859049dcb2ac194)) ### Bug Fixes +* **system-msg:** use correct required features for form elems ([b99cda0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b99cda06aa22b3b9a3c026f80873cb2b68d93cdb)) + +## [25.27.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.26.0...v25.27.0) (2022-02-12) + + +### Features + +* **communication:** add recipient option for course participants in at least one tutorial ([8dabb63](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8dabb63603341c7e2d7dadb95deeb77f864c14a0)) +* **course-users:** export eppn to csv and json ([3c79703](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/3c797039cc0784a2831167c11ed1b7bb8ff78daa)) +* **course-users:** export eppn to csv and json ([6feefeb](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6feefeb3e16c8b2327cdb2746a8263394f9293f9)) +* **courses:** add search bars for shorthands and titles ([8e1b9b9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8e1b9b9abae0c794ce12f10e5f75f410f903d927)) +* **exam-users:** allow resolving exam users by eppn on csv-import ([6a041dc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6a041dc4c9c6ae62c7c7f1641eeb2f5417f32b8d)) +* **exam-users:** allow resolving exam users by eppn on csv-import ([d677d35](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d677d35319332aae28410d1b7cdf09d295920fac)) +* **exam-users:** export eppn for exam users ([ff1fe20](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ff1fe20efed340529a3a12858d82d668e5fe2e85)) +* **exam-users:** export eppn for exam users ([d4ba513](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d4ba513d7948cc6e7136bd05543edb9d9764f78c)) +* **submissions:** add option 'Set corrections as done' ([880eb3b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/880eb3b1ad2d5e4b12f767eb68d29eabfbd79e17)) +* **submissions:** Apply suggestions to reduce lines of code ([2f1ecd3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2f1ecd397936f4e4ac018eb4f9aaf49da37e1e81)) * **smtp:** case-insensitive from-domain comparison for reply-to instead option ([859f5b8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/859f5b8494ce326fcdf13ed8fcca9355273fb42e)) ## [25.21.24](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.23...v25.21.24) (2022-01-07) @@ -88,6 +193,31 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* **exams:** exam results of non-registered users now show correctly ([b294b1c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b294b1cfc4bab4b5ec5247d37097873748759727)) +* **submissions:** add check if users in `groupMembers` are already submittors on submission ([4854d9c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4854d9c8661cc47447a794a4f2963e7e40fe678d)) +* **submissions:** notDE, notEN for unambiguous negation ([ae66fdf](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ae66fdfb8aa51cd7f6e6ad4e263e52cd7043abcb)) +* **submissions:** shorter solution: remove check for `CourseParticipantActive` ([a358cdd](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/a358cdd100065014a1b7dc1055d7fc2ea1265011)) + +## [25.26.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.25.0...v25.26.0) (2022-02-04) + + +### Features + +* **csv:** add export-exam-label as csv option ([de917a8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/de917a8d8646c4df599d945bc4979e226dd5192f)) +* **eo-exams:** select column for exam list in case of actions ([42f58da](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/42f58da44fe1b0cc016979b9cde0300832cc0ae1)) +* **eoexamsr:** implement label sorting ([808c2fc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/808c2fc7708cbf69172cc348e8a2c47c641287b1)) +* **eoexamsr:** introduce GET param to control synced display ([09261ac](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/09261ac7578d8abdcaa39bbdcf12fc6ddad9ce22)) +* **eoexamsr:** use user get-synced setting if no param present ([e60d125](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e60d125e05bcf152b57fa132b4957405c40ae03f)) +* **labels:** actions for setting and removing labels ([9e81f03](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9e81f03742586ef40e8ff896e303ba11d95f120a)) +* **labels:** hide csv export option for non-exam offices ([ec55a40](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ec55a40bc11500105de0b9b9c5cbeb1ba035d53f)) +* **labels:** label filter ([544b9ef](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/544b9ef76260eb9aecb1a5ee2ca3467f08cd99f7)) +* **labels:** set export label on exam csv export ([4557fdd](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4557fdda928fa5f24f4da48aff44fa8b8d955344)) +* **labels:** set export label on external exam csv export ([2071f59](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/2071f5912d4d183abb55f258450b374821f426e6)) +* **profile:** upsert eo-labels on form submit ([cae652b](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/cae652b512137d3a85248d164fb16a6a7d8c097f)) +* **user:** add get-labels to exam office user setting ([5a3c590](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5a3c590b72394fb1fd4544aace2a762300b4551d)) +* **user:** add get-labels user setting ([6a10bd7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6a10bd78f55068eca71a0c190dcee5b066430b93)) +* **user:** introduce exam office user settings ([6788f92](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6788f923ed10759a4d5235c119b94e4c2a35a8b4)) + * **email:** rename settings parameter and switch to safe default ([5aa096f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5aa096f56acb37269b681abafef67b8a375f4d64)) ## [25.21.22](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.21...v25.21.22) (2022-01-06) @@ -104,6 +234,27 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* fix typo ([0dffa04](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/0dffa04caa141e8e5c060ba342610ebd0049d548)) +* **subs:** primarily order subs list by assigned time ([803d8b3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/803d8b30df9d8764dd515476f942c0e08e1da1f6)) +* avoid column-off-by-one with URL-links to tr elems ([dbdd3dc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/dbdd3dc5652ea274c91efc1c25f161c6fd3d850d)) +* hlint ([2286086](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/22860863e59f0f927d6424552b913297fee24f14)) +* **eo-exams:** display exams without label ([5fe01ce](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5fe01ce8dc87e4a318be1885a053b7403813cffa)) +* **eo-exams:** fix eo-labels query ([eba56e4](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/eba56e4d621aa62fdee7535c8b83e0b61f0352d8)) +* **labels:** correct forced bool value for no export label ([7b16351](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/7b16351e4b84eba0be1db7d723b4953e991b42b5)) +* **labels:** fix exam-label delete action ([b1991ee](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b1991eead90a21a296fa0436485ea2532223c72d)) +* **labels:** implement label deletion on ProfileR ([da39b05](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/da39b05627058a1472929b46ae1c2adb0b1fe2c9)) +* **tests:** complete test user definition ([11b7786](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/11b77867acd83a1fe23341d6aa9b0e3fd66506c0)) + +## [25.25.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.24.1...v25.25.0) (2022-01-21) + + +### Features + +* **communication:** support attachments in course/tutorial comm's ([5bd9ea8](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5bd9ea85e8f0e4387cf47116bf42c4441bdbe8b3)) +* **file-field:** cumulative size limit ([b749039](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b749039636c61157b5fc0bea9848ab9828ee671c)) + +## [25.24.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.24.0...v25.24.1) (2021-12-29) + * **email:** instead of sender set reply-to only ([4c8f7e1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4c8f7e1267fe50196d664d733eb794ffaf55aa1c)) * **ldap:** fix type in department descriptor ([9697d8c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/9697d8c7fa8bbe6db6418107acb21c387cd4672c)) * **ldap:** update phone numbers and company data from ldap ([991ee9c](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/991ee9c704dea31e65bb347af582f8a81a72aca4)) @@ -129,6 +280,29 @@ All notable changes to this project will be documented in this file. See [standa ### Bug Fixes +* **courses:** enhanced description of study modules ([89fadb2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/89fadb242037151ea792667cab85fc502b135f57)) + +## [25.24.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.23.0...v25.24.0) (2021-12-28) + + +### Features + +* **course:** show study module on course overview page ([dbc5e99](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/dbc5e99109285d4427832820a77a6b47a8098f62)) +* **course:** study modules as new course property ([cb00de7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/cb00de7960c91d87f5f8fb7ecb29dd15cb61a5a3)) + +## [25.23.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.22.4...v25.23.0) (2021-12-14) + + +### Features + +* **check-all:** added shift click functionality ([da1c8b5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/da1c8b54510ee1436fefe97ba32372a08299b83e)) +* **checkrange:** added tooltip ([ce6f09d](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ce6f09dd857f53dc8c350d7d29b2164c78645b59)) +* **checkrange:** new util checkrange ([337bf73](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/337bf73067f2b98450d0388a1c064f0d2f9c456c)) +* **checkrange:** unchecking a range is possible ([154f2e3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/154f2e35cc0e154ff80002b2e0aff3a76afa1ed6)) +* **erweiterung such-filter usersr:** first try ([da3b339](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/da3b3391bd5aa9990dfb2818847cf8524ee68a9d)) +* **messages:** added frontend translation class ([61c773f](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/61c773f51cddb65dd0529f17799cbf7871023137)) +* **tooltips:** added translatable tooltip ([e74b610](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e74b61065a5de811bd411c0e863fddf9b9baada0)) + * **status:** module imports fixed ([c59ecf5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c59ecf5019af67c849f32962b8ce9485a7adab1c)) * **status:** nix files inaccessible on build server ([1bb500a](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/1bb500ab027993a97848d357a3382c8975f113eb)) @@ -158,6 +332,12 @@ All notable changes to this project will be documented in this file. See [standa * **build:** bump version numbers for containers ([6678ddc](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6678ddcf1aef920e2b04a491f086ac721cae07c9)) ## [25.21.14](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.13...v25.21.14) (2021-10-07) +* **check-all:** correct constructor argument ([02ce82e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/02ce82e9d2026730fd4716a2c0b070c38a6fc53f)) +* **frontend-tooltips:** icon is shown ([86ee2fb](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/86ee2fb14c05e3b6a78c6c51bf961b6c41d3e5c5)) +* **modal:** modals are never destroyed ([7dbe1ac](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/7dbe1ac08aacbda3b145a0da394706273dd6c639)) +* **modal:** modals are never destroyed ([53dab90](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/53dab90810675f743ece284883da9c4c0e84270e)) + +## [25.22.4](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.22.3...v25.22.4) (2021-10-26) ### Bug Fixes @@ -167,6 +347,9 @@ All notable changes to this project will be documented in this file. See [standa * **holidays:** minor improvement to memoization ([f411fde](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f411fde42d913d5a9ef357674ab77934c8e1ba42)) ## [25.21.13](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.12...v25.21.13) (2021-10-05) +* **routes:** make access to workflows free ([29c54db](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/29c54db06f01659a3a6419009964a85cd11d5441)) + +## [25.22.3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.22.2...v25.22.3) (2021-10-21) ### Bug Fixes @@ -205,6 +388,52 @@ All notable changes to this project will be documented in this file. See [standa ## [25.21.2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.1...v25.21.2) (2021-09-20) ## [25.21.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.0...v25.21.1) (2021-09-20) +* **navigation:** always link workflows nav to instances ([adf9709](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/adf9709567d9a320f2c17d3c5dde940c2f9d8862)) + +## [25.22.2](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.22.1...v25.22.2) (2021-10-13) + +## [25.22.1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.22.0...v25.22.1) (2021-10-02) + + +### Bug Fixes + +* **course-admins:** display course admins as admins instead of assistants ([f1fe444](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f1fe4447fbe7e96e55aaf284c7083338b5135ab6)) + +## [25.22.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.21.0...v25.22.0) (2021-08-30) + + +### Features + +* **event-manager:** added method to register a list of listeners ([1a8fb23](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/1a8fb230441f73b9b1fe593f4df1005a06d9628e)) +* **event-manager:** mutation observers can be managed via the event manager ([34b4f48](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/34b4f48386c8fff4569b12eb3f7919e7c77d33c0)) +* **http-client:** added possibility to remove specific interceptors ([0823df3](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/0823df33b5f157af290aca9a65f1df429048e53b)) +* **tutoriumsdaten:** application restore ([d4a73e6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d4a73e699a399b02cadcea03e614c789671ee6d1)) +* **tutoriumsdaten:** firts draft ([e972788](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/e972788f540a9ce6c3fdf841313057b62a579d72)) +* **tutoriumsdaten:** termin ([ebcb234](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/ebcb23429ff09c56ba4a00a6cb8f082ee83e1fe8)) +* **util_registry:** impelmented destroyAll(scope) method in the utilRegistry ([f1ef2e5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f1ef2e5ec776ad8a1fb7737eb0ed4f79218afd61)) +* implemented an event manager ([c1c3536](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c1c35369d1ae017971e6d8cbafc06844f02fd00d)) + + +### Bug Fixes + +* **async-form:** destroy all after response is processed ([14a16c7](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/14a16c7283483ff22ce22b070a430a61d24a7f35)) +* **communication-recipients:** fixed undefined error with context and a few minor issues ([03ac803](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/03ac80342e0f3fcb1db2adf34f86a2c0d8fabf0f)) +* **enter-is-tab.js:** implemented destroy method in enter-is-tab Util ([d1b9952](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/d1b995269060c670d85f715671bfc9947b9f3e9a)) +* **hide-columns:** removed clear storage from destroy method ([b3b0d65](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/b3b0d6585068ecbc665e819b31c94f4d96a0fec5)) +* **hide-colums:** small fix ([50a3ac1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/50a3ac1790f26c1e6f983d3687352d7811173110)) +* **http-client:** strict equality check ([5078b56](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5078b56c16513f3b289bc4824ce0c7914b1a220d)) +* **interactive-fieldset:** small fix ([4c2c683](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/4c2c68327e75f5f51271853159c232fdd7bba21e)) +* **navigate-away-promp:** removed unnecessary destroyAll ([7a07159](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/7a0715906c8336ed64bbfabdf614746ade9f661f)) +* **password:** added cleanUP ([204ce39](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/204ce39f7c2f9c405971aa59da068a5389dda417)) +* **show-hide:** storage manager is not cleared ([9453689](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/945368972da36f4ff0da99f38c71ea9a1c7157d7)) +* **storage-manager:** clear is working without options as well ([f1c50e1](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/f1c50e137f4f11140c1171dd9d86bc5511b9e771)) +* **tooltips:** correct regex match ([c8d36ea](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/c8d36ea52dbef0a2e1aaec6aedaf7edd524975dc)) +* **tooltips:** removed else case ([8d0241e](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/8d0241e727efb5051e5848f2a0c835d7a8d3ae6b)) +* **util-registry:** filtering activeUtilInstances when a util is destroyed ([5b4ac75](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/5b4ac7587438e7adb21e0ff3d9d629b6ff00263a)) +* **util-registry:** handle negative indices correctly ([cbc03f5](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/cbc03f57c56df9c96a84da15a68d26904b75a65f)) +* fixed a few minor issues ([6320cd9](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/6320cd927a84445f056dc782fb440d276cb26009)) +* prompt not shwowing up after submit/close ([abe8415](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/abe84156d508dca8fce549b24d5902d24afc0dbf)) +* smaller fixes and typos ([1f978e6](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/commit/1f978e65a82a91fb728a7ee2970a4fd9e6beb521)) ## [25.21.0](https://gitlab2.rz.ifi.lmu.de/uni2work/uni2work/compare/v25.20.2...v25.21.0) (2021-08-20) diff --git a/config/settings.yml b/config/settings.yml index b768528bc..db1a04844 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -226,6 +226,10 @@ cookies: http-only: true secure: "_env:COOKIES_SECURE:true" +external-apis-ping-interval: 300 +external-apis-pong-timeout: 600 +external-apis-expiry: 1200 + user-defaults: max-favourites: 0 max-favourite-terms: 2 @@ -236,6 +240,8 @@ user-defaults: download-files: false warning-days: 1209600 show-sex: false + exam-office-get-synced: true + exam-office-get-labels: true # During central allocations lecturer-given ratings of applications (as # ExamGrades) are combined with a central priority. @@ -292,5 +298,8 @@ file-source-prewarm: bot-mitigations: - only-logged-in-table-sorting + - unauthorized-form-honeypots volatile-cluster-settings-cache-time: 10 + +communication-attachments-max-size: 20971520 # 20MiB diff --git a/frontend/src/app.sass b/frontend/src/app.sass index 70d767b22..61bd618f3 100644 --- a/frontend/src/app.sass +++ b/frontend/src/app.sass @@ -10,6 +10,8 @@ --color-success-dark: #1ca64c --color-info: #c4c4c4 --color-info-dark: #919191 + --color-nonactive: #efefef + --color-nonactive-dark: #9a989e --color-lightblack: #1A2A36 --color-lightwhite: #fcfffa --color-grey: #B1B5C0 @@ -165,7 +167,7 @@ h4 margin-top: var(--current-header-height) margin-left: 0 - :target:not(table, .show-hide__toggle)::before + :target:not(table, tr, .show-hide__toggle)::before content: "" display: block height: var(--current-header-height) @@ -740,6 +742,9 @@ section .notification-success color: var(--color-success-dark) +.notification-nonactive + color: var(--color-nonactive) + // "Heated" element. // Set custom property "--hotness" to a value from 0 to 1 to turn // the element's background to a color on a gradient from green to red. @@ -1444,6 +1449,15 @@ a.breadcrumbs__home &__label grid-area: label +.apidocs + pre + display: block + box-shadow: inset 0 0 4px 4px var(--color-grey-light) + white-space: pre-wrap + overflow-x: auto + tab-size: 2 + padding: 10px + .news__system-messages overflow-y: auto max-height: 75vh @@ -1476,6 +1490,9 @@ a.breadcrumbs__home &--success border-left-color: var(--color-success) + + &--disabled + border-left-color: var(--color-nonactive) .active-allocations__wrapper @@ -1737,3 +1754,28 @@ video font-size: .5em font-family: var(--font-monospace) color: var(--color-fontsec) + +.exam-office-label + --lbl-padding-vert: 5px + --lbl-padding-hori: 15px + padding: var(--lbl-padding-vert) var(--lbl-padding-hori) + border-radius: 20px 20px 20px 20px + font-weight: 600 + text-align: center + width: fit-content + margin: 0 auto + &.success + background-color: var(--color-success-dark) + color: var(--color-lightwhite) + &.error + background-color: var(--color-error) + color: var(--color-lightwhite) + &.warning + background-color: var(--color-warning) + color: var(--color-lightwhite) + &.info + background-color: var(--color-lightblack) + color: var(--color-lightwhite) + &.nonactive + background-color: var(--color-nonactive) + color: var(--color-nonactive-dark) diff --git a/frontend/src/lib/event-manager/event-manager.js b/frontend/src/lib/event-manager/event-manager.js new file mode 100644 index 000000000..7b464c176 --- /dev/null +++ b/frontend/src/lib/event-manager/event-manager.js @@ -0,0 +1,103 @@ + +export const EVENT_TYPE = { + CLICK : 'click', + KEYDOWN : 'keydown', + INVALID : 'invalid', + CHANGE : 'change', + MOUSE_OVER : 'mouseover', + MOUSE_OUT : 'mouseout', + SUBMIT : 'submit', + INPUT : 'input', + FOCUS_OUT : 'focusout', + BEFOREUNLOAD : 'beforeunload', + HASH_CHANGE : 'hashchange', +}; + + + +export class EventManager { + _registeredListeners; + _mutationObservers; + + + constructor() { + this._registeredListeners = []; + this._mutationObservers = []; + } + + registerNewListener(eventWrapper) { + this._debugLog('registerNewListener', eventWrapper); + let element = eventWrapper.element; + element.addEventListener(eventWrapper.eventType, eventWrapper.eventHandler, eventWrapper.options); + this._registeredListeners.push(eventWrapper); + } + + registerListeners(eventWrappers) { + eventWrappers.forEach((eventWrapper) => this.registerNewListener(eventWrapper)); + } + + registerNewMutationObserver(callback, domNode, config) { + let observer = new MutationObserver(callback); + observer.observe(domNode, config); + this._mutationObservers.push(observer); + } + + removeAllEventListenersFromUtil() { + this._debugLog('removeAllEventListenersFromUtil'); + for (let eventWrapper of this._registeredListeners) { + let element = eventWrapper.element; + element.removeEventListener(eventWrapper.eventType, eventWrapper.eventHandler); + } + this._registeredListeners = []; + } + + removeAllObserversFromUtil() { + this._mutationObservers.forEach((observer) => observer.disconnect()); + this.mutationObservers = []; + } + + cleanUp() { + this.removeAllObserversFromUtil(); + this.removeAllEventListenersFromUtil(); + } + + + + _debugLog() {} + //_debugLog(fName, ...args) { + // console.log(`[DEBUGLOG] EventManager.${fName}`, { args: args, instance: this }); + //} +} + +export class EventWrapper { + _eventType; + _eventHandler; + _element; + _options; + + constructor(_eventType, _eventHandler, _element, _options) { + if(!_eventType || !_eventHandler || !_element) { + throw new Error('Not enough arguments!'); + } + this._eventType = _eventType; + this._eventHandler = _eventHandler; + this._element = _element; + this._options = _options; + } + + get eventType() { + return this._eventType; + } + + get eventHandler() { + return this._eventHandler; + } + + get element() { + return this._element; + } + + get options() { + return this._options; + } +} \ No newline at end of file diff --git a/frontend/src/lib/movement-observer/movement-observer.js b/frontend/src/lib/movement-observer/movement-observer.js index b6846c10e..b322346c3 100644 --- a/frontend/src/lib/movement-observer/movement-observer.js +++ b/frontend/src/lib/movement-observer/movement-observer.js @@ -1,4 +1,4 @@ -import * as debounce from 'lodash.debounce'; +import debounce from 'lodash.debounce'; export const MOVEMENT_INDICATOR_ELEMENT_CLASS = 'movement-indicator'; const MOVEMENT_DEBOUNCE = 250; diff --git a/frontend/src/lib/storage-manager/storage-manager.js b/frontend/src/lib/storage-manager/storage-manager.js index f2ee68589..f42b4d464 100644 --- a/frontend/src/lib/storage-manager/storage-manager.js +++ b/frontend/src/lib/storage-manager/storage-manager.js @@ -1,6 +1,6 @@ /* global global:writable */ -import * as semver from 'semver'; +import semver from 'semver'; import sodium from 'sodium-javascript'; import { HttpClient } from '../../services/http-client/http-client'; @@ -186,14 +186,14 @@ export class StorageManager { } } - clear(options) { + clear(options=this._options) { this._debugLog('clear', options); if (options && options.location !== undefined && !Object.values(LOCATION).includes(options.location)) { throw new Error('StorageManager.clear called with unsupported location option'); } - const locations = options && options.location !== undefined ? [options.location] : LOCATION_SHADOWING; + const locations = ((options !== undefined) && options.location !== undefined)? [options.location] : this._location_shadowing; for (const location of locations) { switch (location) { @@ -204,7 +204,10 @@ export class StorageManager { case LOCATION.WINDOW: return this._clearWindow(); case LOCATION.HISTORY: - return this._clearHistory(options && options.history); + if(options && options.history) + return this._clearHistory(options.history); + else + return; default: console.error('StorageManager.clear cannot clear with unsupported location'); } @@ -466,7 +469,7 @@ export class StorageManager { }, body: JSON.stringify(requestBody), }).then( - (response) => response.json() + (response) => response.json(), ).then((response) => { console.log('storage-manager got key from response:', response, 'with options:', options); if (response.salt !== requestBody.salt || response.timestamp !== requestBody.timestamp) { diff --git a/frontend/src/lib/table/table.js b/frontend/src/lib/table/table.js index 33c03cc80..56ac25f19 100644 --- a/frontend/src/lib/table/table.js +++ b/frontend/src/lib/table/table.js @@ -1,6 +1,6 @@ const DEBUG_MODE = /localhost/.test(window.location.href) ? 0 : 0; -import * as defer from 'lodash.defer'; +import defer from 'lodash.defer'; class Overhang { colSpan; diff --git a/frontend/src/lib/tooltips/frontend-tooltips.js b/frontend/src/lib/tooltips/frontend-tooltips.js new file mode 100644 index 000000000..75535ddae --- /dev/null +++ b/frontend/src/lib/tooltips/frontend-tooltips.js @@ -0,0 +1,22 @@ +export class FrontendTooltips { + + static addToolTip(element, text) { + let tooltipWrap = document.createElement('span'); + tooltipWrap.className = 'tooltip'; + + let tooltipContent = document.createElement('span'); + tooltipContent.className = 'tooltip__content'; + tooltipContent.appendChild(document.createTextNode(text)); + tooltipWrap.append(tooltipContent); + + let tooltipHandle = document.createElement('span'); + tooltipHandle.className = 'tooltip__handle'; + let icon = document.createElement('i'); + icon.classList.add('fas'); + icon.classList.add('fa-question-circle'); + tooltipHandle.append(icon); + tooltipWrap.append(tooltipHandle); + + element.append(tooltipWrap); + } +} \ No newline at end of file diff --git a/frontend/src/messages.js b/frontend/src/messages.js new file mode 100644 index 000000000..1f1ce3574 --- /dev/null +++ b/frontend/src/messages.js @@ -0,0 +1,17 @@ +export class Translations { + static translations = { + 'checkrangeTooltip' : { + 'de' : 'Shift-Klick, um mehrere Zellen zu markieren.', + 'en' : 'Shift-click to mark multiple cells.', + }, + }; + + static getTranslation(key, language) { + let json = Translations.translations[key]; + if(language === 'en') { + return json.en; + } else { + return json.de; + } + } +}; \ No newline at end of file diff --git a/frontend/src/services/http-client/http-client.js b/frontend/src/services/http-client/http-client.js index 274f86cdb..81f72485e 100644 --- a/frontend/src/services/http-client/http-client.js +++ b/frontend/src/services/http-client/http-client.js @@ -15,6 +15,18 @@ export class HttpClient { } } + removeResponseInterceptor(interceptor) { + //performs a reference check. if the interceptor is bound, when adding it, the reference of the bound function needs to be the same when removing it later. + + if (typeof interceptor !== 'function') { + throw new Error(`Cannot remove Interceptor ${interceptor}, because it is not of type function`); + } + if(this._responseInterceptors.filter(el => el == interceptor).length === 0) { + throw new Error(`Could not find Response Interceptor ${interceptor}.`); + } + this._responseInterceptors = this._responseInterceptors.filter(el => el !== interceptor); + } + _baseUrl; setBaseUrl(baseUrl) { diff --git a/frontend/src/services/http-client/http-client.spec.js b/frontend/src/services/http-client/http-client.spec.js index a0f76584d..594f7096c 100644 --- a/frontend/src/services/http-client/http-client.spec.js +++ b/frontend/src/services/http-client/http-client.spec.js @@ -75,7 +75,7 @@ describe('HttpClient', () => { expect(httpClient._responseInterceptors.length).toBe(2); }); - describe('get called', () => { + describe('get called and removed', () => { let intercepted1; let intercepted2; const interceptors = { @@ -111,6 +111,14 @@ describe('HttpClient', () => { done(); }); }); + + it('can be removed', () => { + expect(httpClient._responseInterceptors.length).toBe(2); + httpClient.removeResponseInterceptor(interceptors.interceptor1); + expect(httpClient._responseInterceptors.length).toBe(1); + expect(() => {httpClient.removeResponseInterceptor(interceptors.interceptor1);}).toThrow(); + expect(httpClient._responseInterceptors.length).toBe(1); + }); }); }); }); diff --git a/frontend/src/services/util-registry/util-registry.js b/frontend/src/services/util-registry/util-registry.js index 65e9326cc..5644d8719 100644 --- a/frontend/src/services/util-registry/util-registry.js +++ b/frontend/src/services/util-registry/util-registry.js @@ -1,11 +1,11 @@ -import * as toposort from 'toposort'; +import toposort from 'toposort'; const DEBUG_MODE = /localhost/.test(window.location.href) ? 1 : 0; export class UtilRegistry { - _registeredUtils = new Array(); - _activeUtilInstances = new Array(); + _registeredUtilClasses = new Array(); //{utilClass} + _activeUtilInstancesWrapped = new Array(); //{utilClass, scope, element, instance} _appInstance; /** @@ -33,7 +33,7 @@ export class UtilRegistry { console.log('registering util "' + util.name + '"'); console.log({ util }); } - this._registeredUtils.push(util); + this._registeredUtilClasses.push(util); } deregister(name, destroy) { @@ -44,7 +44,7 @@ export class UtilRegistry { this._destroyUtilInstances(name); } - this._registeredUtils.splice(utilIndex, 1); + this._registeredUtilClasses.splice(utilIndex, 1); } } @@ -54,7 +54,7 @@ export class UtilRegistry { initAll(scope = document.body) { let startedInstances = new Array(); - const setupInstances = this._registeredUtils.map((util) => this.setup(util, scope)).flat(); + const setupInstances = this._registeredUtilClasses.map((util) => this.setup(util, scope)).flat(); const orderedInstances = setupInstances.filter(_isStartOrdered); @@ -97,6 +97,20 @@ export class UtilRegistry { return startedInstances; } + destroyAll(scope = document.body) { + let utilsInScope = this._getUtilInstancesWithinScope(scope); + + utilsInScope.forEach((util) => { + if(DEBUG_MODE > 2) { + console.log('Destroying Util: ', {util}); + } + util.destroy(); + this._activeUtilInstancesWrapped = this._activeUtilInstancesWrapped.filter(utilWrapped => { + return utilWrapped.element === util._element; + }); + }); + } + setup(util, scope = document.body) { if (DEBUG_MODE > 2) { console.log('setting up util', { util }); @@ -130,12 +144,12 @@ export class UtilRegistry { }); } - this._activeUtilInstances.push(...instances); + this._activeUtilInstancesWrapped.push(...instances); return instances; } find(name) { - return this._registeredUtils.find((util) => util.name === name); + return this._registeredUtilClasses.find((util) => util.name === name); } _findUtilElements(util, scope) { @@ -146,24 +160,33 @@ export class UtilRegistry { } _findUtilIndex(name) { - return this._registeredUtils.findIndex((util) => util.name === name); + return this._registeredUtilClasses.findIndex((util) => util.name === name); + } + + _getUtilInstancesWithinScope(scope) { + let utilInstances = []; + + for (let activeUtilInstance of this._activeUtilInstancesWrapped) { + let util = activeUtilInstance.util; + if(this._findUtilElements(util, scope).length > 0) { + utilInstances.push(activeUtilInstance.instance); + } + } + return utilInstances; } _destroyUtilInstances(name) { - this._activeUtilInstances + this._activeUtilInstancesWrapped .map((util, index) => ({ util: util, index: index, })) - .filter((activeUtil) => activeUtil.util.name === name) + .filter((activeUtil) => activeUtil.util.util.name === name) .forEach((activeUtil) => { // destroy util instance - activeUtil.util.destroy(); - delete this._activeUtilInstances[activeUtil.index]; + activeUtil.util.instance.destroy(); + this._activeUtilInstancesWrapped = this._activeUtilInstancesWrapped.splice(activeUtil.index, 1); }); - - // get rid of now empty array slots - this._activeUtilInstances = this._activeUtilInstances.filter((util) => !!util); } } diff --git a/frontend/src/services/util-registry/util-registry.spec.js b/frontend/src/services/util-registry/util-registry.spec.js index 07b9e2627..18506be99 100644 --- a/frontend/src/services/util-registry/util-registry.spec.js +++ b/frontend/src/services/util-registry/util-registry.spec.js @@ -24,24 +24,6 @@ describe('UtilRegistry', () => { }); }); - describe('deregister()', () => { - it('should remove util', () => { - // register util - utilRegistry.register(TestUtil1); - let foundUtil = utilRegistry.find(TestUtil1.name); - expect(foundUtil).toBeTruthy(); - - // deregister util - utilRegistry.deregister(TestUtil1.name); - foundUtil = utilRegistry.find(TestUtil1.name); - expect(foundUtil).toBeFalsy(); - }); - - it('should destroy util instances if requested', () => { - pending('TBD'); - }); - }); - describe('setup()', () => { it('should catch errors thrown by the utility', () => { @@ -107,6 +89,51 @@ describe('UtilRegistry', () => { }); }); + describe('deregister()', () => { + let testScope; + let testElement1; + let testElement2; + + beforeEach(() => { + testScope = document.createElement('div'); + testElement1 = document.createElement('div'); + testElement2 = document.createElement('div'); + testElement1.classList.add('util1'); + testElement2.classList.add('util1'); + testScope.appendChild(testElement1); + testScope.appendChild(testElement2); + }); + + it('should remove util', () => { + // register util + utilRegistry.register(TestUtil1); + let foundUtil = utilRegistry.find(TestUtil1.name); + expect(foundUtil).toBeTruthy(); + + // deregister util + utilRegistry.deregister(TestUtil1.name); + foundUtil = utilRegistry.find(TestUtil1.name); + expect(foundUtil).toBeFalsy(); + }); + + it('should destroy util instances if requested', () => { + utilRegistry.register(TestUtil1); + let foundUtil = utilRegistry.find(TestUtil1.name); + expect(foundUtil).toBeTruthy(); + + utilRegistry.setup(TestUtil1, testScope); + let firstActiveUtil = utilRegistry._activeUtilInstancesWrapped[0]; + expect(utilRegistry._activeUtilInstancesWrapped.length).toEqual(2); + expect(utilRegistry._activeUtilInstancesWrapped[0].element).toEqual(testElement1); + + spyOn(firstActiveUtil.instance, 'destroy'); + + utilRegistry.deregister(TestUtil1.name, true); + expect(utilRegistry._activeUtilInstancesWrapped[0]).toBeFalsy(); + expect(firstActiveUtil.instance.destroy).toHaveBeenCalled(); + }); + }); + describe('initAll()', () => { it('should setup all the utilities', () => { spyOn(utilRegistry, 'setup'); @@ -172,6 +199,44 @@ describe('UtilRegistry', () => { }); }); }); + + describe('destroyAll()', () => { + let testScope; + let testElement; + let firstUtil; + + beforeEach( () => { + testScope = document.createElement('div'); + testElement = document.createElement('div'); + testElement.classList.add('util3'); + testScope.appendChild(testElement); + + utilRegistry.register(TestUtil3); + utilRegistry.initAll(testScope); + + firstUtil = utilRegistry._activeUtilInstancesWrapped[0]; + spyOn(firstUtil.instance, 'destroy'); + }); + + it('Util should be destroyed', () => { + utilRegistry.destroyAll(testScope); + expect(utilRegistry._activeUtilInstancesWrapped.length).toBe(0); + expect(firstUtil.instance.destroy).toHaveBeenCalled(); + }); + + it('Util out of scope should not be destroyed', () => { + let outOfScope = document.createElement('div'); + expect(utilRegistry._activeUtilInstancesWrapped.length).toEqual(1); + + utilRegistry.destroyAll(outOfScope); + + expect(utilRegistry._activeUtilInstancesWrapped.length).toEqual(1); + expect(utilRegistry._activeUtilInstancesWrapped[0]).toBe(firstUtil); + expect(firstUtil.instance.destroy).not.toHaveBeenCalled(); + + }); + }); + }); // test utilities @@ -181,6 +246,8 @@ class TestUtil1 { this.element = element; this.app = app; } + + destroy() {} } @Utility({ selector: '#util2' }) @@ -190,6 +257,7 @@ class TestUtil2 { } class TestUtil3 { constructor() {} start() {} + destroy() {} } @Utility({ selector: '#throws' }) diff --git a/frontend/src/utils/alerts/alerts.js b/frontend/src/utils/alerts/alerts.js index dcecc915b..0131a6e41 100644 --- a/frontend/src/utils/alerts/alerts.js +++ b/frontend/src/utils/alerts/alerts.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './alerts.sass'; const ALERTS_INITIALIZED_CLASS = 'alerts--initialized'; @@ -32,6 +33,9 @@ export class Alerts { _element; _app; + _eventManager; + _boundResponseInterceptor; + constructor(element, app) { if (!element) { throw new Error('Alerts util has to be called with an element!'); @@ -40,6 +44,9 @@ export class Alerts { this._element = element; this._app = app; + this._eventManager = new EventManager(); + this._boundResponseInterceptor = this._responseInterceptor.bind(this); + if (this._element.classList.contains(ALERTS_INITIALIZED_CLASS)) { return false; } @@ -47,21 +54,30 @@ export class Alerts { this._togglerElement = this._element.querySelector('.' + ALERTS_TOGGLER_CLASS); this._alertElements = this._gatherAlertElements(); - if (this._togglerElement) { - this._initToggler(); - } - - this._initAlerts(); - - // register http client interceptor to filter out Alerts Header - this._setupHttpInterceptor(); - // mark initialized this._element.classList.add(ALERTS_INITIALIZED_CLASS); } + start() { + if (this._togglerElement) { + this._initToggler(); + } + this._initAlerts(); + + // register http client interceptor to filter out Alerts Header + this._setupHttpInterceptor(); + } + destroy() { - console.log('TBD: Destroy Alert'); + this._eventManager.cleanUp(); + this._app.httpClient.removeResponseInterceptor(this._boundResponseInterceptor); + + if(this._alertElements) { + this._alertElements.forEach(element => element.remove()); + } + + if(this._element.classList.contains(ALERTS_INITIALIZED_CLASS)) + this._element.classList.remove(ALERTS_INITIALIZED_CLASS); } _gatherAlertElements() { @@ -71,10 +87,12 @@ export class Alerts { } _initToggler() { - this._togglerElement.addEventListener('click', () => { + let clickListenerToggler = new EventWrapper(EVENT_TYPE.CLICK, () => { this._alertElements.forEach((alertEl) => this._toggleAlert(alertEl, true)); this._togglerElement.classList.remove(ALERTS_TOGGLER_VISIBLE_CLASS); - }); + }, this._togglerElement); + + this._eventManager.registerNewListener(clickListenerToggler); } _initAlerts() { @@ -88,9 +106,11 @@ export class Alerts { } const closeEl = alertElement.querySelector('.' + ALERT_CLOSER_CLASS); - closeEl.addEventListener('click', () => { + const closeAlertEvent = new EventWrapper(EVENT_TYPE.CLICK, (() => { this._toggleAlert(alertElement); - }); + }).bind(this), closeEl); + + this._eventManager.registerNewListener(closeAlertEvent); if (autoHideDelay > 0 && alertElement.matches(ALERT_AUTOCLOSING_MATCHER)) { window.setTimeout(() => this._toggleAlert(alertElement), autoHideDelay * 1000); @@ -118,7 +138,7 @@ export class Alerts { } _setupHttpInterceptor() { - this._app.httpClient.addResponseInterceptor(this._responseInterceptor.bind(this)); + this._app.httpClient.addResponseInterceptor(this._boundResponseInterceptor); } _elevateAlerts() { @@ -145,7 +165,7 @@ export class Alerts { this._elevateAlerts(); } - } + }; _createAlertElement(type, content, icon = 'info-circle') { const alertElement = document.createElement('div'); diff --git a/frontend/src/utils/alerts/alerts.spec.js b/frontend/src/utils/alerts/alerts.spec.js index 0b4749e97..db14c7361 100644 --- a/frontend/src/utils/alerts/alerts.spec.js +++ b/frontend/src/utils/alerts/alerts.spec.js @@ -1,8 +1,9 @@ -import { Alerts } from './alerts'; +import { Alerts, ALERTS_INITIALIZED_CLASS } from './alerts'; const MOCK_APP = { httpClient: { addResponseInterceptor: () => {}, + removeResponseInterceptor: () => {}, }, }; @@ -19,6 +20,12 @@ describe('Alerts', () => { expect(alerts).toBeTruthy(); }); + it('should destory alerts', () => { + alerts.destroy(); + expect(alerts._eventManager._registeredListeners.length).toBe(0); + expect(alerts._element.classList).not.toContain(ALERTS_INITIALIZED_CLASS); + }); + it('should throw if called without an element', () => { expect(() => { new Alerts(); diff --git a/frontend/src/utils/asidenav/asidenav.js b/frontend/src/utils/asidenav/asidenav.js index 6bf425ffa..324fc3fd8 100644 --- a/frontend/src/utils/asidenav/asidenav.js +++ b/frontend/src/utils/asidenav/asidenav.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './asidenav.sass'; const FAVORITES_BTN_CLASS = 'navbar__list-item--favorite'; @@ -15,6 +16,7 @@ export class Asidenav { _element; _asidenavSubmenus; + _eventManager; constructor(element) { if (!element) { @@ -23,6 +25,8 @@ export class Asidenav { this._element = element; + this._eventManager = new EventManager(); + if (this._element.classList.contains(ASIDENAV_INITIALIZED_CLASS)) { return false; } @@ -35,19 +39,24 @@ export class Asidenav { } destroy() { - this._asidenavSubmenus.forEach((union) => { - union.listItem.removeEventListener(union.hoverHandler); - }); + + this._eventManager.cleanUp(); + + if(this._element.classList.contains(ASIDENAV_INITIALIZED_CLASS)) + this._element.classList.remove(ASIDENAV_INITIALIZED_CLASS); } _initFavoritesButton() { const favoritesBtn = document.querySelector('.' + FAVORITES_BTN_CLASS); if (favoritesBtn) { - favoritesBtn.addEventListener('click', (event) => { + + const favoritesButtonEvent = new EventWrapper(EVENT_TYPE.CLICK, (event) => { favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS); this._element.classList.toggle(ASIDENAV_EXPANDED_CLASS); event.preventDefault(); - }, true); + }, favoritesBtn, true); + + this._eventManager.registerNewListener(favoritesButtonEvent); } } @@ -62,7 +71,8 @@ export class Asidenav { this._asidenavSubmenus.forEach((union) => { union.hoverHandler = this._createMouseoverHandler(union); - union.listItem.addEventListener('mouseover', union.hoverHandler); + let currentHoverEvent = new EventWrapper(EVENT_TYPE.MOUSE_OVER, union.hoverHandler, union.listItem); + this._eventManager.registerNewListener(currentHoverEvent); }); } diff --git a/frontend/src/utils/asidenav/asidenav.spec.js b/frontend/src/utils/asidenav/asidenav.spec.js index bdc7aee68..3bd468b28 100644 --- a/frontend/src/utils/asidenav/asidenav.spec.js +++ b/frontend/src/utils/asidenav/asidenav.spec.js @@ -1,4 +1,4 @@ -import { Asidenav } from './asidenav'; +import { Asidenav, ASIDENAV_INITIALIZED_CLASS } from './asidenav'; describe('Asidenav', () => { @@ -13,6 +13,12 @@ describe('Asidenav', () => { expect(asidenav).toBeTruthy(); }); + it('should destory asidenav', () => { + asidenav.destroy(); + expect(asidenav._eventManager._registeredListeners.length).toBe(0); + expect(asidenav._element.classList).not.toContain(ASIDENAV_INITIALIZED_CLASS); + }); + it('should throw if called without an element', () => { expect(() => { new Asidenav(); diff --git a/frontend/src/utils/async-form/async-form.js b/frontend/src/utils/async-form/async-form.js index 6c0da95c0..6bfc37c26 100644 --- a/frontend/src/utils/async-form/async-form.js +++ b/frontend/src/utils/async-form/async-form.js @@ -1,5 +1,6 @@ import { Utility } from '../../core/utility'; import { Datepicker } from '../form/datepicker'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './async-form.sass'; const ASYNC_FORM_INITIALIZED_CLASS = 'check-all--initialized'; @@ -20,6 +21,8 @@ export class AsyncForm { _element; _app; + _eventManager; + constructor(element, app) { if (!element) { throw new Error('Async Form Utility cannot be setup without an element!'); @@ -28,17 +31,23 @@ export class AsyncForm { this._element = element; this._app = app; + this._eventManager = new EventManager(); + if (this._element.classList.contains(ASYNC_FORM_INITIALIZED_CLASS)) { return false; } - this._element.addEventListener('submit', this._submitHandler); + const submitEvent = new EventWrapper(EVENT_TYPE.SUBMIT, this._submitHandler.bind(this), this._element); + this._eventManager.registerNewListener(submitEvent); this._element.classList.add(ASYNC_FORM_INITIALIZED_CLASS); } destroy() { - // TODO + this._eventManager.cleanUp(); + + if(this._element.classList.contains(ASYNC_FORM_INITIALIZED_CLASS)) + this._element.classList.remove(ASYNC_FORM_INITIALIZED_CLASS); } _processResponse(response) { @@ -85,14 +94,13 @@ export class AsyncForm { headers: headers, body: body, }).then( - (response) => response.json() + (response) => response.json(), ).then( - (response) => this._processResponse(response[0]) + (response) => this._processResponse(response[0]), ).catch(() => { const failureMessage = this._app.i18n.get('asyncFormFailure'); this._processResponse({ content: failureMessage }); - this._element.classList.remove(ASYNC_FORM_LOADING_CLASS); }); - } + }; } diff --git a/frontend/src/utils/async-form/async-form.spec.js b/frontend/src/utils/async-form/async-form.spec.js index f01280b8a..aeb7ce4ba 100644 --- a/frontend/src/utils/async-form/async-form.spec.js +++ b/frontend/src/utils/async-form/async-form.spec.js @@ -1,4 +1,4 @@ -import { AsyncForm } from './async-form'; +import { AsyncForm, ASYNC_FORM_INITIALIZED_CLASS } from './async-form'; describe('AsyncForm', () => { @@ -13,6 +13,12 @@ describe('AsyncForm', () => { expect(asyncForm).toBeTruthy(); }); + it('should destroy asyncForm', () => { + asyncForm.destroy(); + expect(asyncForm._eventManager._registeredListeners.length).toBe(0); + expect(asyncForm._element.classList).not.toContain(ASYNC_FORM_INITIALIZED_CLASS); + }); + it('should throw if called without an element', () => { expect(() => { new AsyncForm(); diff --git a/frontend/src/utils/async-table/async-table.js b/frontend/src/utils/async-table/async-table.js index 93d3bcf99..28ffae657 100644 --- a/frontend/src/utils/async-table/async-table.js +++ b/frontend/src/utils/async-table/async-table.js @@ -2,8 +2,9 @@ import { Utility } from '../../core/utility'; import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager'; import { Datepicker } from '../form/datepicker'; import { HttpClient } from '../../services/http-client/http-client'; -import * as debounce from 'lodash.debounce'; -import * as throttle from 'lodash.throttle'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; +import debounce from 'lodash.debounce'; +import throttle from 'lodash.throttle'; import './async-table-filter.sass'; import './async-table.sass'; @@ -30,6 +31,8 @@ export class AsyncTable { _element; _app; + _eventManager; + _asyncTableHeader; _asyncTableId; @@ -66,6 +69,8 @@ export class AsyncTable { this._element = element; this._app = app; + this._eventManager = new EventManager(); + if (this._element.classList.contains(ASYNC_TABLE_INITIALIZED_CLASS)) { return false; } @@ -144,7 +149,11 @@ export class AsyncTable { } destroy() { - console.log('TBD: Destroy AsyncTable'); + this._windowStorage.clear(this._windowStorage._options); + this._eventManager.cleanUp(); + this._active = false; + if (this._element.classList.contains(ASYNC_TABLE_INITIALIZED_CLASS)) + this._element.classList.remove(ASYNC_TABLE_INITIALIZED_CLASS); } _startSortableHeaders() { @@ -156,7 +165,8 @@ export class AsyncTable { this._windowStorage.save('horizPos', (this._scrollTable || {}).scrollLeft); this._linkClickHandler(event); }; - th.element.addEventListener('click', th.clickHandler); + const linkClickEvent = new EventWrapper(EVENT_TYPE.CLICK, th.clickHandler.bind(this), th.element); + this._eventManager.registerNewListener(linkClickEvent); }); } @@ -179,7 +189,9 @@ export class AsyncTable { } this._linkClickHandler(event); }; - link.element.addEventListener('click', link.clickHandler); + + const clickEvent = new EventWrapper(EVENT_TYPE.CLICK, link.clickHandler.bind(this), link.element); + this._eventManager.registerNewListener(clickEvent); }); } } @@ -190,7 +202,8 @@ export class AsyncTable { if (this._pagesizeForm) { const pagesizeSelect = this._pagesizeForm.querySelector('[name=' + this._asyncTableId + '-pagesize]'); - pagesizeSelect.addEventListener('change', this._changePagesizeHandler); + const pageSizeChangeEvent = new EventWrapper(EVENT_TYPE.CHANGE, this._changePagesizeHandler.bind(this), pagesizeSelect); + this._eventManager.registerNewListener(pageSizeChangeEvent); } } @@ -227,17 +240,7 @@ export class AsyncTable { const debouncedUpdateFromTableFilter = throttle((() => this._updateFromTableFilter(tableFilterForm)).bind(this), FILTER_DEBOUNCE, { leading: true, trailing: false }); [...this._tableFilterInputs.search, ...this._tableFilterInputs.input].forEach((input) => { - const submitLockObserver = new MutationObserver((mutations, observer) => { - for (const mutation of mutations) { - // if the submit lock has been released, trigger an update and disconnect this observer - if (mutation.target === input && mutation.attributeName === ATTR_SUBMIT_LOCKED && mutation.oldValue === 'true' && mutation.target.getAttribute(mutation.attributeName) === 'false') { - debouncedUpdateFromTableFilter(); - observer.disconnect(); - break; - } - } - }); - this._cancelPendingUpdates.push(() => { submitLockObserver.disconnect(); }); + this._cancelPendingUpdates.push(() => { this._eventManager.removeAllObserversFromUtil();}); const debouncedInput = debounce(() => { const submitLockedAttr = input.getAttribute(ATTR_SUBMIT_LOCKED); @@ -246,7 +249,16 @@ export class AsyncTable { debouncedUpdateFromTableFilter(); } else if (submitLockedAttr === 'true') { // observe the submit lock of the input element - submitLockObserver.observe(input, { + this._eventManager.registerNewMutationObserver(((mutations, observer) => { + for (const mutation of mutations) { + // if the submit lock has been released, trigger an update and disconnect this observer + if (mutation.target === input && mutation.attributeName === ATTR_SUBMIT_LOCKED && mutation.oldValue === 'true' && mutation.target.getAttribute(mutation.attributeName) === 'false') { + debouncedUpdateFromTableFilter(); + observer.disconnect(); + break; + } + } + }).bind(this), input, { attributes: true, attributeFilter: [ATTR_SUBMIT_LOCKED], attributeOldValue: true, @@ -254,33 +266,42 @@ export class AsyncTable { } }, INPUT_DEBOUNCE); this._cancelPendingUpdates.push(debouncedInput.cancel); - - input.addEventListener('input', () => { + + const inputHandler =() => { this._ignoreRequest = true; debouncedInput(); - }); + }; + const inputEvent = new EventWrapper(EVENT_TYPE.INPUT, inputHandler.bind(this), input ); + this._eventManager.registerNewListener(inputEvent); }); this._tableFilterInputs.change.forEach((input) => { - input.addEventListener('change', () => { + + const changeHandler = () => { //if (this._element.classList.contains(ASYNC_TABLE_LOADING_CLASS)) this._ignoreRequest = true; debouncedUpdateFromTableFilter(); - }); + }; + const changeEvent = new EventWrapper(EVENT_TYPE.CHANGE, changeHandler.bind(this), input); + this._eventManager.registerNewListener(changeEvent); }); this._tableFilterInputs.select.forEach((input) => { - input.addEventListener('change', () => { + const selectChangeHandler = () => { this._ignoreRequest = true; debouncedUpdateFromTableFilter(); - }); + }; + const selectEvent = new EventWrapper(EVENT_TYPE.CHANGE, selectChangeHandler.bind(this), input); + this._eventManager.registerNewListener(selectEvent); }); - tableFilterForm.addEventListener('submit', (event) =>{ + const submitEventHandler = (event) =>{ event.preventDefault(); this._ignoreRequest = true; debouncedUpdateFromTableFilter(); - }); + }; + const submitEvent = new EventWrapper(EVENT_TYPE.SUBMIT, submitEventHandler.bind(this), tableFilterForm); + this._eventManager.registerNewListener(submitEvent); } _updateFromTableFilter(tableFilterForm) { @@ -362,7 +383,7 @@ export class AsyncTable { url = window.location.origin + window.location.pathname + url; } this._updateTableFrom(url); - } + }; _getClickDestination(el) { if (!el.matches('a') && !el.querySelector('a')) { @@ -386,7 +407,7 @@ export class AsyncTable { } this._updateTableFrom(url.href); - } + }; // fetches new sorted element from url with params and replaces contents of current element _updateTableFrom(url, callback, isPopState) { @@ -425,6 +446,7 @@ export class AsyncTable { this._active = false; this._element.classList.remove(ASYNC_TABLE_INITIALIZED_CLASS); this._element.dataset['currentTableUrl'] = url.href; + // update table with new this._element.innerHTML = response.element.innerHTML; @@ -435,12 +457,12 @@ export class AsyncTable { callback(this._element); this._windowStorage.remove('cssIdPrefix'); } - }).catch((err) => console.error(err) + }).catch((err) => console.error(err), ).finally(() => this._element.classList.remove(ASYNC_TABLE_LOADING_CLASS)); } _debugLog() {} - // _debugLog(fName, ...args) { + //_debugLog(fName, ...args) { // console.log(`[DEBUGLOG] AsyncTable.${fName}`, { args: args, instance: this }); // } } diff --git a/frontend/src/utils/async-table/async-table.spec.js b/frontend/src/utils/async-table/async-table.spec.js index 7f008ac49..de5dc9b98 100644 --- a/frontend/src/utils/async-table/async-table.spec.js +++ b/frontend/src/utils/async-table/async-table.spec.js @@ -1,4 +1,4 @@ -import { AsyncTable } from './async-table'; +import { AsyncTable, ASYNC_TABLE_INITIALIZED_CLASS } from './async-table'; const AppTestMock = { httpClient: { @@ -50,4 +50,11 @@ describe('AsyncTable', () => { new AsyncTable(); }).toThrow(); }); + + it('should destroy Async Table', () => { + asyncTable.start(); + asyncTable.destroy(); + expect(asyncTable._eventManager._registeredListeners.length).toBe(0); + expect(asyncTable._element.classList).not.toContain(ASYNC_TABLE_INITIALIZED_CLASS); + }); }); diff --git a/frontend/src/utils/check-all/check-all.js b/frontend/src/utils/check-all/check-all.js index b9796eeb5..35695d6f3 100644 --- a/frontend/src/utils/check-all/check-all.js +++ b/frontend/src/utils/check-all/check-all.js @@ -2,6 +2,7 @@ const DEBUG_MODE = /localhost/.test(window.location.href) ? 0 : 0; import { Utility } from '../../core/utility'; import { TableIndices } from '../../lib/table/table'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const CHECKBOX_SELECTOR = '[type="checkbox"]'; @@ -13,11 +14,15 @@ const CHECK_ALL_INITIALIZED_CLASS = 'check-all--initialized'; export class CheckAll { _element; + _eventManager; + _columns = new Array(); _checkAllColumns = new Array(); _tableIndices; + _lastCheckedCell = null; + constructor(element, app) { if (!element) { throw new Error('Check All utility cannot be setup without an element!'); @@ -25,6 +30,8 @@ export class CheckAll { this._element = element; + this._eventManager = new EventManager(); + if (this._element.classList.contains(CHECK_ALL_INITIALIZED_CLASS)) { return false; } @@ -36,12 +43,25 @@ export class CheckAll { if (DEBUG_MODE > 0) console.log(this._columns); - this._findCheckboxColumns().forEach(columnId => this._checkAllColumns.push(new CheckAllColumn(this._element, app, this._columns[columnId]))); + let checkboxColumns = this._findCheckboxColumns(); + + checkboxColumns.forEach(columnId => this._checkAllColumns.push(new CheckAllColumn(this._element, app, this._columns[columnId], this._eventManager))); // mark initialized this._element.classList.add(CHECK_ALL_INITIALIZED_CLASS); } + destroy() { + this._eventManager.cleanUp(); + this._checkAllColumns.forEach((column) => { + if (column._checkAllCheckBox !== undefined) + column._checkAllCheckBox.remove(); + }); + + if(this._element.classList.contains(CHECK_ALL_INITIALIZED_CLASS)) + this._element.classList.remove(CHECK_ALL_INITIALIZED_CLASS); + } + _gatherColumns() { for (const rowIndex of Array(this._tableIndices.maxRow + 1).keys()) { for (const colIndex of Array(this._tableIndices.maxCol + 1).keys()) { @@ -81,14 +101,17 @@ class CheckAllColumn { _app; _table; _column; + + _eventManager; _checkAllCheckbox; _checkboxId = 'check-all-checkbox-' + Math.floor(Math.random() * 100000); - constructor(table, app, column) { + constructor(table, app, column, eventManager) { this._column = column; this._table = table; this._app = app; + this._eventManager = eventManager; const th = this._column.filter(element => element.tagName == 'TH')[0]; if (!th) @@ -97,12 +120,14 @@ class CheckAllColumn { this._checkAllCheckbox = document.createElement('input'); this._checkAllCheckbox.setAttribute('type', 'checkbox'); this._checkAllCheckbox.setAttribute('id', this._checkboxId); + th.insertBefore(this._checkAllCheckbox, th.firstChild); // set up new checkbox this._app.utilRegistry.initAll(th); - this._checkAllCheckbox.addEventListener('input', this._onCheckAllCheckboxInput.bind(this)); + const checkBoxInputEvent = new EventWrapper(EVENT_TYPE.INPUT, this._onCheckAllCheckboxInput.bind(this), this._checkAllCheckbox); + this._eventManager.registerNewListener(checkBoxInputEvent); this._setupCheckboxListeners(); } @@ -113,14 +138,15 @@ class CheckAllColumn { _setupCheckboxListeners() { this._column .flatMap(cell => cell.tagName == 'TH' ? new Array() : Array.from(cell.querySelectorAll(CHECKBOX_SELECTOR))) - .forEach(checkbox => - checkbox.addEventListener('input', this._updateCheckAllCheckboxState.bind(this)) - ); + .forEach(checkbox => { + const checkBoxUpdateEvent = new EventWrapper(EVENT_TYPE.INPUT, this._updateCheckAllCheckboxState.bind(this), checkbox); + this._eventManager.registerNewListener(checkBoxUpdateEvent); + }); } _updateCheckAllCheckboxState() { const allChecked = this._column.every(cell => - cell.tagName == 'TH' || cell.querySelector(CHECKBOX_SELECTOR).checked + cell.tagName == 'TH' || cell.querySelector(CHECKBOX_SELECTOR).checked, ); this._checkAllCheckbox.checked = allChecked; } diff --git a/frontend/src/utils/check-all/check-all.spec.js b/frontend/src/utils/check-all/check-all.spec.js index 9b8d30f77..431dd5993 100644 --- a/frontend/src/utils/check-all/check-all.spec.js +++ b/frontend/src/utils/check-all/check-all.spec.js @@ -1,4 +1,4 @@ -import { CheckAll } from './check-all'; +import { CheckAll, CHECK_ALL_INITIALIZED_CLASS } from './check-all'; const MOCK_APP = { utilRegistry: { @@ -24,4 +24,11 @@ describe('CheckAll', () => { new CheckAll(); }).toThrow(); }); + + it('should destroy CheckAll', () => { + checkAll.destroy(); + expect(checkAll._eventManager._registeredListeners.length).toBe(0); + expect(checkAll._element.classList).not.toEqual(jasmine.arrayContaining([CHECK_ALL_INITIALIZED_CLASS])); + }); + }); diff --git a/frontend/src/utils/course-teaser/course-teaser.js b/frontend/src/utils/course-teaser/course-teaser.js index 0419dcbda..717435d43 100644 --- a/frontend/src/utils/course-teaser/course-teaser.js +++ b/frontend/src/utils/course-teaser/course-teaser.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './course-teaser.sass'; const COURSE_TEASER_INITIALIZED_CLASS = 'course-teaser--initialized'; @@ -12,16 +13,30 @@ const COURSE_TEASER_CHEVRON_CLASS = 'course-teaser__chevron'; export class CourseTeaser { _element; + _eventManager; constructor(element) { if (!element) { throw new Error('CourseTeaser utility cannot be setup without an element!'); } + this._eventManager = new EventManager(); if (element.classList.contains(COURSE_TEASER_INITIALIZED_CLASS)) { return false; } this._element = element; - element.addEventListener('click', e => this._onToggleExpand(e)); + const clickHandler = e => this._onToggleExpand(e); + const clickEvent = new EventWrapper(EVENT_TYPE.CLICK, clickHandler.bind(this), element); + this._eventManager.registerNewListener(clickEvent); + } + + destroy() { + this._eventManager.cleanUp(); + if(this._element.classList.contains(COURSE_TEASER_EXPANDED_CLASS)) { + this._element.classList.remove(COURSE_TEASER_EXPANDED_CLASS); + } + if (this._element.classList.contains(COURSE_TEASER_INITIALIZED_CLASS)) { + this._element.classList.remove(COURSE_TEASER_INITIALIZED_CLASS); + } } _onToggleExpand(event) { diff --git a/frontend/src/utils/exam-correct/exam-correct.js b/frontend/src/utils/exam-correct/exam-correct.js index cf23c911d..e99e2a83c 100644 --- a/frontend/src/utils/exam-correct/exam-correct.js +++ b/frontend/src/utils/exam-correct/exam-correct.js @@ -1,5 +1,6 @@ import { Utility } from '../../core/utility'; import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import { HttpClient } from '../../services/http-client/http-client'; import moment from 'moment'; @@ -58,6 +59,7 @@ export class ExamCorrect { _lastColumnIndex; _storageManager; + _eventManager; constructor(element, app) { if (!element) { @@ -71,6 +73,8 @@ export class ExamCorrect { this._element = element; this._app = app; + this._eventManager = new EventManager(); + // TODO work in progress // this._storageManager = new StorageManager('EXAM_CORRECT', '0.0.0', { location: LOCATION.SESSION, encryption: { all: { tag: 'exam-correct', exam: this._element.getAttribute('uw-exam-correct') } } }); this._storageManager = new StorageManager('EXAM_CORRECT', '0.0.0', { location: LOCATION.WINDOW }); @@ -88,20 +92,28 @@ export class ExamCorrect { this._resultPassSelect = resultDetailCell && resultDetailCell.querySelector('select.uw-exam-correct__pass'); this._partDeleteBoxes = [...this._element.querySelectorAll('input.uw-exam-correct--delete-exam-part')]; - if (this._sendBtn) - this._sendBtn.addEventListener('click', this._sendCorrectionHandler.bind(this)); - else console.error('ExamCorrect utility could not detect send button!'); + if (this._sendBtn){ + const sendClickEvent = new EventWrapper(EVENT_TYPE.CLICK, this._sendCorrectionHandler.bind(this), this._sendBtn); + this._eventManager.registerNewListener(sendClickEvent); + } else { + console.error('ExamCorrect utility could not detect send button!'); + } - if (this._userInput) - this._userInput.addEventListener('focusout', this._validateUserInput.bind(this)); - else throw new Error('ExamCorrect utility could not detect user input!'); + if (this._userInput) { + const focusOutEvent = new EventWrapper(EVENT_TYPE.FOCUS_OUT, this._validateUserInput.bind(this), this._userInput); + this._eventManager.registerNewListener(focusOutEvent); + } else { + throw new Error('ExamCorrect utility could not detect user input!'); + } for (let deleteBox of this._partDeleteBoxes) { - deleteBox.addEventListener('change', (() => { this._updatePartDeleteDisabled(deleteBox); }).bind(this)); + const deleteBoxChangeEvent = new EventWrapper(EVENT_TYPE.CHANGE, (() => { this._updatePartDeleteDisabled(deleteBox); }).bind(this), deleteBox); + this._eventManger.registerNewListener(deleteBoxChangeEvent); } for (let input of [this._userInput, ...this._partInputs]) { - input.addEventListener('keypress', this._inputKeypress.bind(this)); + const inputKeyDownEvent = new EventWrapper(EVENT_TYPE.KEYDOWN, this._inputKeypress.bind(this), input); + this._eventManager.registerNewListener(inputKeyDownEvent); } if (!this._userInputStatus) { @@ -121,27 +133,29 @@ export class ExamCorrect { this._cIndices = new Map( [...this._element.querySelectorAll('[uw-exam-correct-header]')] - .map((header) => [header.getAttribute('uw-exam-correct-header'), header.cellIndex]) + .map((header) => [header.getAttribute('uw-exam-correct-header'), header.cellIndex]), ); if (this._resultSelect && this._resultGradeSelect) { - this._resultSelect.addEventListener('change', () => { + const resultSelectEvent = new EventWrapper(EVENT_TYPE.CHANGE, (() => { if (this._resultSelect.value !== 'grade') this._resultGradeSelect.classList.add('grade-hidden'); else this._resultGradeSelect.classList.remove('grade-hidden'); - }); + }).bind(this), this._resultSelect ); + this._eventManager.registerNewListener(resultSelectEvent); if (this._resultSelect.value !== 'grade') this._resultGradeSelect.classList.add('grade-hidden'); } if (this._resultSelect && this._resultPassSelect) { - this._resultSelect.addEventListener('change', () => { + const resultPassSelectEvent = new EventWrapper(EVENT_TYPE.CHANGE, (() => { if (this._resultSelect.value !== 'pass') this._resultPassSelect.classList.add('pass-hidden'); else this._resultPassSelect.classList.remove('pass-hidden'); - }); + }).bind(this), this._resultSelect); + this._eventManager.registerNewListener(resultPassSelectEvent); if (this._resultSelect.value !== 'pass') this._resultPassSelect.classList.add('pass-hidden'); @@ -158,9 +172,7 @@ export class ExamCorrect { } destroy() { - this._sendBtn.removeEventListener('click', this._sendCorrectionHandler); - this._userInput.removeEventListener('change', this._validateUserInput); - // TODO destroy handlers on user input candidate elements + this._eventManager.cleanUp(); } _updatePartDeleteDisabled(deleteBox) { @@ -208,9 +220,9 @@ export class ExamCorrect { headers: EXAM_CORRECT_HEADERS, body: JSON.stringify(body), }).then( - (response) => response.json() + (response) => response.json(), ).then( - (response) => this._processResponse(body, response, body.user) + (response) => this._processResponse(body, response, body.user), ).catch((error) => { console.error('Error while validating user input', error); }); @@ -300,9 +312,9 @@ export class ExamCorrect { headers: EXAM_CORRECT_HEADERS, body: JSON.stringify(body), }).then( - (response) => response.json() + (response) => response.json(), ).then( - (response) => this._processResponse(body, response, user, undefined, { results: results, result: result }) + (response) => this._processResponse(body, response, user, undefined, { results: results, result: result }), ).catch((error) => { console.error('Error while processing response', error); }); @@ -541,8 +553,8 @@ export class ExamCorrect { headers: EXAM_CORRECT_HEADERS, body: JSON.stringify(body), }).then( - (response) => response.json() - ).then((response) => this._processResponse(body, response, userElem.getAttribute(EXAM_CORRECT_USER_ATTR), row, { results: results.partResults, result: results.result }) + (response) => response.json(), + ).then((response) => this._processResponse(body, response, userElem.getAttribute(EXAM_CORRECT_USER_ATTR), row, { results: results.partResults, result: results.result }), ).catch(console.error); } diff --git a/frontend/src/utils/form/auto-submit-button.js b/frontend/src/utils/form/auto-submit-button.js index bf7544d30..77e942f28 100644 --- a/frontend/src/utils/form/auto-submit-button.js +++ b/frontend/src/utils/form/auto-submit-button.js @@ -9,8 +9,10 @@ const AUTO_SUBMIT_BUTTON_HIDDEN_CLASS = 'hidden'; selector: AUTO_SUBMIT_BUTTON_UTIL_SELECTOR, }) export class AutoSubmitButton { + _element; constructor(element) { + this._element = element; if (!element) { throw new Error('Auto Submit Button utility needs to be passed an element!'); } @@ -24,6 +26,7 @@ export class AutoSubmitButton { } destroy() { - // TODO + this._element.classList.remove(AUTO_SUBMIT_BUTTON_INITIALIZED_CLASS); + this._element.classList.remove(AUTO_SUBMIT_BUTTON_HIDDEN_CLASS); } } diff --git a/frontend/src/utils/form/auto-submit-button.spec.js b/frontend/src/utils/form/auto-submit-button.spec.js new file mode 100644 index 000000000..b1436c867 --- /dev/null +++ b/frontend/src/utils/form/auto-submit-button.spec.js @@ -0,0 +1,27 @@ +import { AutoSubmitButton, AUTO_SUBMIT_BUTTON_INITIALIZED_CLASS, AUTO_SUBMIT_BUTTON_HIDDEN_CLASS } from './auto-submit-button.js'; + +describe('Auto-submit-button', () => { + + let autoSubmitButton; + + beforeEach(() => { + const element = document.createElement('div'); + autoSubmitButton = new AutoSubmitButton(element); + }); + + it('should create', () => { + expect(autoSubmitButton).toBeTruthy(); + }); + + it('should destory auto-submit-button', () => { + autoSubmitButton.destroy(); + expect(autoSubmitButton._element.classList).not.toContain(AUTO_SUBMIT_BUTTON_INITIALIZED_CLASS); + expect(autoSubmitButton._element.classList).not.toContain(AUTO_SUBMIT_BUTTON_HIDDEN_CLASS); + }); + + it('should throw if called without an element', () => { + expect(() => { + new AutoSubmitButton(); + }).toThrow(); + }); + }); \ No newline at end of file diff --git a/frontend/src/utils/form/auto-submit-input.js b/frontend/src/utils/form/auto-submit-input.js index f442f2960..37f17d405 100644 --- a/frontend/src/utils/form/auto-submit-input.js +++ b/frontend/src/utils/form/auto-submit-input.js @@ -1,5 +1,6 @@ -import * as debounce from 'lodash.debounce'; +import debounce from 'lodash.debounce'; import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; export const AUTO_SUBMIT_INPUT_UTIL_SELECTOR = '[uw-auto-submit-input]'; @@ -12,6 +13,8 @@ export class AutoSubmitInput { _element; + _eventManager; + _form; _debouncedHandler; @@ -22,6 +25,8 @@ export class AutoSubmitInput { this._element = element; + this._eventManager = new EventManager(); + if (this._element.classList.contains(AUTO_SUBMIT_INPUT_INITIALIZED_CLASS)) { return false; } @@ -33,15 +38,19 @@ export class AutoSubmitInput { this._debouncedHandler = debounce(this.autoSubmit, 500); - this._element.addEventListener('input', this._debouncedHandler); + const inputEvent = new EventWrapper(EVENT_TYPE.INPUT, this._debouncedHandler.bind(this), this._element); + this._eventManager.registerNewListener(inputEvent); + this._element.classList.add(AUTO_SUBMIT_INPUT_INITIALIZED_CLASS); } destroy() { - this._element.removeEventListener('input', this._debouncedHandler); + this._eventManager.cleanUp(); + if(this._element.classList.contains(AUTO_SUBMIT_INPUT_INITIALIZED_CLASS)) + this._element.classList.remove(AUTO_SUBMIT_INPUT_INITIALIZED_CLASS); } - autoSubmit = () => { + autoSubmit() { this._form.submit(); } } diff --git a/frontend/src/utils/form/auto-submit-input.spec.js b/frontend/src/utils/form/auto-submit-input.spec.js new file mode 100644 index 000000000..26c59cdd2 --- /dev/null +++ b/frontend/src/utils/form/auto-submit-input.spec.js @@ -0,0 +1,30 @@ +import { AutoSubmitInput, AUTO_SUBMIT_INPUT_INITIALIZED_CLASS } from './auto-submit-input.js'; + +describe('Auto-submit-input', () => { + + let autoSubmitInput; + + beforeEach(() => { + const form = document.createElement('form'); + const element = document.createElement('input'); + element.setAttribute('type', 'text'); + form.append(element); + autoSubmitInput = new AutoSubmitInput(element); + }); + + it('should create', () => { + expect(autoSubmitInput).toBeTruthy(); + }); + + it('should destory auto-submit-button', () => { + autoSubmitInput.destroy(); + expect(autoSubmitInput._eventManager._registeredListeners.length).toBe(0); + expect(autoSubmitInput._element.classList).not.toEqual(jasmine.arrayContaining([AUTO_SUBMIT_INPUT_INITIALIZED_CLASS])); + }); + + it('should throw if called without an element', () => { + expect(() => { + new AutoSubmitInput(); + }).toThrow(); + }); + }); \ No newline at end of file diff --git a/frontend/src/utils/form/communication-recipients.js b/frontend/src/utils/form/communication-recipients.js index 2a9367f47..b6d754e09 100644 --- a/frontend/src/utils/form/communication-recipients.js +++ b/frontend/src/utils/form/communication-recipients.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const MASS_INPUT_SELECTOR = '.massinput'; const RECIPIENT_CATEGORIES_SELECTOR = '.recipient-categories'; @@ -14,62 +15,81 @@ const RECIPIENT_CATEGORY_CHECKED_COUNTER_SELECTOR = '.recipient-category__checke }) export class CommunicationRecipients { massInputElement; + _element; + + _eventManager; constructor(element) { if (!element) { throw new Error('Communication Recipient utility cannot be setup without an element!'); } - - this.massInputElement = element.closest(MASS_INPUT_SELECTOR); + this._element = element; + this._eventManager = new EventManager(); + this.massInputElement = this._element.closest(MASS_INPUT_SELECTOR); this.setupRecipientCategories(); - const recipientObserver = new MutationObserver(this.setupRecipientCategories.bind(this)); - recipientObserver.observe(this.massInputElement, { childList: true }); + this._eventManager.registerNewMutationObserver(this.setupRecipientCategories.bind(this), this.massInputElement, { childList: true }); } setupRecipientCategories() { - Array.from(this.massInputElement.querySelectorAll(RECIPIENT_CATEGORY_SELECTOR)).forEach(setupRecipientCategory); + Array.from(this.massInputElement.querySelectorAll(RECIPIENT_CATEGORY_SELECTOR)).forEach(this.setupRecipientCategory.bind(this)); } -} -function setupRecipientCategory(recipientCategoryElement) { - const categoryCheckbox = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_CHECKBOX_SELECTOR); - const categoryOptions = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_OPTIONS_SELECTOR); + _removeCheckedCounter() { + let checkedCounters = this._element.querySelectorAll(RECIPIENT_CATEGORY_CHECKED_COUNTER_SELECTOR); + checkedCounters.forEach((checkedCounter) => { + checkedCounter.innerHTML = ''; + }); + } - if (categoryOptions) { - const categoryCheckboxes = Array.from(categoryOptions.querySelectorAll('[type="checkbox"]')); - const toggleAllCheckbox = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_TOGGLE_ALL_SELECTOR); + destroy() { + this._eventManager.cleanUp(); + this._removeCheckedCounter(); + } - // setup category checkbox to toggle all child checkboxes if changed - categoryCheckbox.addEventListener('change', () => { - categoryCheckboxes.filter(checkbox => !checkbox.disabled).forEach(checkbox => { - checkbox.checked = categoryCheckbox.checked; - }); - updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); - updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); - }); - // update counter and toggle checkbox initially - updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); - updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); - - // register change listener for individual checkboxes - categoryCheckboxes.forEach(checkbox => { - checkbox.addEventListener('change', () => { - updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); - updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); - }); - }); - - // register change listener for toggle all checkbox - if (toggleAllCheckbox) { - toggleAllCheckbox.addEventListener('change', () => { + setupRecipientCategory(recipientCategoryElement) { + const categoryCheckbox = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_CHECKBOX_SELECTOR); + const categoryOptions = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_OPTIONS_SELECTOR); + + if (categoryOptions) { + const categoryCheckboxes = Array.from(categoryOptions.querySelectorAll('[type="checkbox"]')); + const toggleAllCheckbox = recipientCategoryElement.querySelector(RECIPIENT_CATEGORY_TOGGLE_ALL_SELECTOR); + + // setup category checkbox to toggle all child checkboxes if changed + const categoryToggleEvent = new EventWrapper(EVENT_TYPE.CHANGE,(() => { categoryCheckboxes.filter(checkbox => !checkbox.disabled).forEach(checkbox => { - checkbox.checked = toggleAllCheckbox.checked; + checkbox.checked = categoryCheckbox.checked; }); updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); + updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); + }).bind(this), categoryCheckbox ); + this._eventManager.registerNewListener(categoryToggleEvent); + + // update counter and toggle checkbox initially + updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); + updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); + + // register change listener for individual checkboxes + categoryCheckboxes.forEach(checkbox => { + const individualToggleEvent = new EventWrapper(EVENT_TYPE.CHANGE, (() => { + updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); + updateToggleAllCheckbox(toggleAllCheckbox, categoryCheckboxes); + }).bind(this), checkbox); + this._eventManager.registerNewListener(individualToggleEvent); }); + + // register change listener for toggle all checkbox + if (toggleAllCheckbox) { + const toggleAllEvent = new EventWrapper(EVENT_TYPE.CHANGE, (() => { + categoryCheckboxes.filter(checkbox => !checkbox.disabled).forEach(checkbox => { + checkbox.checked = toggleAllCheckbox.checked; + }); + updateCheckedCounter(recipientCategoryElement, categoryCheckboxes); + }).bind(this), toggleAllCheckbox); + this._eventManager.registerNewListener(toggleAllEvent); + } } } } diff --git a/frontend/src/utils/form/datepicker.css b/frontend/src/utils/form/datepicker.css deleted file mode 100644 index b052a1e7c..000000000 --- a/frontend/src/utils/form/datepicker.css +++ /dev/null @@ -1,727 +0,0 @@ -@charset "UTF-8"; -/* - | tail.datetime - The vanilla way to select dates and times! - | @file ./less/tail.datetime-default-green.less - | @author SamBrishes - | @version 0.4.13 - Beta - | - | @website https://github.com/pytesNET/tail.DateTime - | @license X11 / MIT License - | @copyright Copyright © 2018 - 2019 SamBrishes, pytesNET - */ - -/* @start MAIN CALENDAR */ -.tail-datetime-calendar, .tail-datetime-calendar *, .tail-datetime-calendar *:before, -.tail-datetime-calendar *:after{ - box-sizing: border-box; - -webkit-box-sizing: border-box; -} -.tail-datetime-calendar{ - top: 0; - left: 0; - width: 275px; - height: auto; - margin: 15px; - padding: 0; - z-index: 15; - display: block; - position: absolute; - visibility: hidden; - direction: ltr; - border-collapse: separate; - /* font-family: "Open Sans", Calibri, Arial, sans-serif; */ - background-color: white; - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3125); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3125); -} -.tail-datetime-calendar:after{ - clear: both; - content: ""; - display: block; - font-size: 0; - visibility: hidden; -} -.tail-datetime-calendar.calendar-static{ - top: auto; - left: auto; - margin-left: auto; - margin-right: auto; - position: static; - visibility: visible; -} -.tail-datetime-calendar button.calendar-close{ - top: 100%; - right: 15px; - color: #303438; - width: 35px; - height: 25px; - margin: 1px 0 0 0; - padding: 5px 10px; - opacity: 0.5; - outline: none; - display: inline-block; - position: absolute; - font-size: 14px; - line-height: 1.125em; - text-shadow: none; - background-color: white; - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC\ - 9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDEyIDE2Ij48cGF0aCBmaWxsPSIjMzAzNDM4IiBkP\ - SJNNy40OCA4bDMuNzUgMy43NS0xLjQ4IDEuNDhMNiA5LjQ4bC0zLjc1IDMuNzUtMS40OC0xLjQ4TDQuNTIgOCAuNzcgNC4y\ - NWwxLjQ4LTEuNDhMNiA2LjUybDMuNzUtMy43NSAxLjQ4IDEuNDhMNy40OCA4eiIvPjwvc3ZnPg=="); - background-repeat: no-repeat; - background-position: center center; - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 0 0 3px 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3125); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3125); - transition: opacity 142ms linear; - -webkit-transition: opacity 142ms linear; -} -.tail-datetime-calendar button.calendar-close:hover{ - opacity: 1; -} -/* @end MAIN CALENDAR */ - -/* @start CALENDAR TOOLTIP */ -.tail-datetime-calendar .calendar-tooltip{ - color: white; - width: auto; - margin: 0; - padding: 0; - display: block; - position: absolute; - background-color: #202428; - border-radius: 3px; -} -.tail-datetime-calendar .calendar-tooltip:before{ - top: -7px; - left: 50%; - width: 0; - height: 0; - margin: 0 0 0 -6px; - content: ""; - display: block; - position: absolute; - border-width: 0 7px 7px 7px; - border-style: solid; - border-color: transparent transparent #202428 transparent; -} -.tail-datetime-calendar .calendar-tooltip .tooltip-inner{ - width: auto; - margin: 0; - padding: 4px 7px; - display: block; - font-size: 12px; - line-height: 14px; -} -/* @end CALENDAR TOOLTIP */ - -/* @start CALENDAR ACTIONs */ -.tail-datetime-calendar .calendar-actions{ - color: white; - width: 100%; - height: 36px; - margin: 0; - padding: 0; - display: table; - overflow: hidden; - border-spacing: 0; - border-collapse: separate; - background-color: var(--color-primary); - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 3px 3px 0 0; -} -.tail-datetime-calendar .calendar-actions span{ - margin: 0; - padding: 0; - display: table-cell; - position: relative; - text-align: center; - line-height: 36px; - text-shadow: -1px -1px 0 var(--color-dark); - background-repeat: no-repeat; - background-position: center center; -} -.tail-datetime-calendar .calendar-actions span[data-action]{ - cursor: pointer; -} -.tail-datetime-calendar .calendar-actions span.action{ - width: 36px; - font-size: 22px; -} -.tail-datetime-calendar .calendar-actions span.label{ - width: auto; -} -.tail-datetime-calendar .calendar-actions span:first-child:before{ - right: -1px; -} -.tail-datetime-calendar .calendar-actions span:last-child:before{ - left: -1px; -} -.tail-datetime-calendar .calendar-actions span:first-child:hover:before, -.tail-datetime-calendar .calendar-actions span:last-child:hover:before{ - display: none; -} -.tail-datetime-calendar .calendar-actions span[data-action]:hover{ - background-color: var(--color-dark); -} -.tail-datetime-calendar .calendar-actions span.action-prev{ - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC\ - 9zdmciIHdpZHRoPSI2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgNiAxNiI+PHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iT\ - TYgMkwwIDhsNiA2VjJ6Ii8+PC9zdmc+"); -} -.tail-datetime-calendar .calendar-actions span.action-next{ - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC\ - 9zdmciIHdpZHRoPSI2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgNiAxNiI+PHBhdGggZmlsbD0iI2ZmZmZmZiIgZD0iT\ - TAgMTRsNi02LTYtNnYxMnoiLz48L3N2Zz4="); -} -.tail-datetime-calendar .calendar-actions span.action-submit{ - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC\ - 9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDEyIDE2Ij48cGF0aCBmaWxsPSIjZmZmZmZmIiBkP\ - SJNMTIgNWwtOCA4LTQtNCAxLjUtMS41TDQgMTBsNi41LTYuNUwxMiA1eiIvPjwvc3ZnPg=="); -} -.tail-datetime-calendar .calendar-actions span.action-cancel{ - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC\ - 9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDEyIDE2Ij48cGF0aCBmaWxsPSIjZmZmZmZmIiBkP\ - SJNNy40OCA4bDMuNzUgMy43NS0xLjQ4IDEuNDhMNiA5LjQ4bC0zLjc1IDMuNzUtMS40OC0xLjQ4TDQuNTIgOCAuNzcgNC4y\ - NWwxLjQ4LTEuNDhMNiA2LjUybDMuNzUtMy43NSAxLjQ4IDEuNDhMNy40OCA4eiIvPjwvc3ZnPg=="); -} -/* @end CALENDAR ACTIONs */ - -/* @start CALENDAR DATEPICKER */ -.tail-datetime-calendar .calendar-datepicker{ - width: 100%; - margin: 0; - padding: 0; - display: block; - position: relative; -} -.tail-datetime-calendar .calendar-datepicker table{ - width: 100%; - margin: 0; - padding: 0; - border-spacing: 0; - border-collapse: separate; -} -.tail-datetime-calendar .calendar-datepicker table tr th, -.tail-datetime-calendar .calendar-datepicker table tr td{ - color: #303438; - height: 30px; - padding: 0; - position: relative; - font-size: 13px; - text-align: center; - font-weight: normal; - text-shadow: none; - line-height: 30px; - background-color: transparent; - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 0px; -} -.tail-datetime-calendar .calendar-datepicker table tr th{ - color: white; - background-color: var(--color-lightblack); -} -.tail-datetime-calendar .calendar-datepicker table tr td{ - cursor: pointer; -} -.tail-datetime-calendar .calendar-datepicker table tr td span.inner{ - margin: 0; - padding: 0; - display: inline-block; -} -.tail-datetime-calendar .calendar-datepicker table tr td.date-disabled{ - cursor: not-allowed; - color: #909498; - background-color: #F0F0F0; -} -.tail-datetime-calendar .calendar-datepicker table tr td.date-disabled:after{ - left: 3px; - bottom: 3px; - width: 35px; - height: 1px; - margin: 0; - padding: 0; - content: ""; - display: inline-block; - position: absolute; - background-color: #bfbfbf; - transform-origin: 2px -5px; - transform: rotate(-45deg); - -moz-transform: rotate(-45deg); - -webkit-transform: rotate(-45deg); -} -.tail-datetime-calendar .calendar-datepicker table tr td.date-previous, -.tail-datetime-calendar .calendar-datepicker table tr td.date-next{ - color: #909498; - background-color: #F0F0F0; -} -.tail-datetime-calendar .calendar-datepicker table tr td.date-today:before, -.tail-datetime-calendar .calendar-datepicker table tr td .tooltip-tick{ - top: 5px; - width: 5px; - height: 5px; - margin: 0; - padding: 0; - z-index: 20; - content: ""; - display: inline-block; - position: absolute; - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 50%; -} -.tail-datetime-calendar .calendar-datepicker table tr td.date-today:before{ - left: 5px; - background-color: #E67D1E; -} -.tail-datetime-calendar .calendar-datepicker table tr td .tooltip-tick{ - right: 5px; - background-color: #202428; -} -.tail-datetime-calendar .calendar-datepicker table tr td .tooltip-tick:before, -.tail-datetime-calendar .calendar-datepicker table tr td .tooltip-tick:after{ - display: none; -} -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day{ - width: 14.28571429%; - height: 35px; -} -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day span.inner{ - width: 31px; - height: 31px; - line-height: 29px; - border-width: 1px; - border-style: solid; - border-color: transparent; - border-radius: 50%; -} -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week:hover span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day:hover span.inner{ - border-color: #cccccc; -} -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week.date-disabled span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day.date-disabled span.inner, -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week.date-disabled:hover span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day.date-disabled:hover span.inner{ - border-color: transparent; -} -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week.date-select span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day.date-select span.inner, -.tail-datetime-calendar .calendar-datepicker table tr th.calendar-week.date-select:hover span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-day.date-select:hover span.inner{ - color: var(--color-fontsec); - border-color: var(--color-fontsec); -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade{ - width: 33.33333333%; - height: 40px; - transition: color 142ms linear; - -webkit-transition: color 142ms linear; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month.date-today:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year.date-today:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade.date-today:before{ - left: 50%; - margin-left: -2.5px; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year span.inner, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner{ - width: auto; - height: 31px; - line-height: 29px; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner:after{ - width: 20px; - height: 20px; - content: ""; - z-index: 15; - display: inline-block; - position: absolute; - border-width: 1px; - border-style: solid; - border-color: transparent; - transition: all 142ms linear; - -webkit-transition: all 142ms linear; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner:before{ - top: 0; - left: 0; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month:hover span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year:hover span.inner:before, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade:hover span.inner:before{ - top: 6px; - left: 6px; - border-top-color: #cccccc; - border-left-color: #cccccc; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner:after{ - right: 0; - bottom: 0; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-month:hover span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year:hover span.inner:after, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade:hover span.inner:after{ - right: 6px; - bottom: 6px; - border-right-color: #cccccc; - border-bottom-color: #cccccc; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-year, -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade{ - width: 25%; -} -.tail-datetime-calendar .calendar-datepicker table tr td.calendar-decade span.inner{ - height: 54px; - padding: 7px 15px; - text-align: left; - line-height: 20px; -} -/* @end CALENDAR DATEPICKER */ - -/* @start CALENDAR TIMEPICKER */ -.tail-datetime-calendar .calendar-timepicker{ - width: 100%; - margin: 0; - padding: 0; - display: block; - text-align: center; - border-width: 1px 0 0 0; - border-style: solid; - border-color: #d9d9d9; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field{ - width: 28%; - margin: 0; - padding: 15px 0 7px 0; - display: inline-block; - position: relative; - text-align: center; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field:first-of-type{ - text-align: right; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field:last-of-type{ - text-align: left; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input[type="text"]{ - color: #303438; - width: 100%; - height: 29px; - margin: 0; - z-index: 4; - padding: 3px 20px 3px 5px; - outline: 0; - display: inline-block; - position: relative; - font-size: 12px; - text-align: center; - line-height: 23px; - appearance: textfield; - -moz-appearance: textfield; - -webkit-appearance: textfield; - background-color: #F0F0F0; - border-width: 0; - border-style: solid; - border-color: transparent; - border-radius: 3px; - box-shadow: none; - -webkit-box-shadow: none; - transition: color 142ms linear, border 142ms linear, background 142ms linear; - -webkit-transition: color 142ms linear, border 142ms linear, background 142ms linear; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input[type="text"]:hover{ - color: #303438; - background-color: #E0E0E0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input[type="text"]:focus{ - color: #303438; - background-color: #E0E0E0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input[type="text"]:disabled{ - cursor: not-allowed; - color: #A0A4A8; - background-color: #F6F6F6; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step{ - min-width: 0px; - width: 20px; - height: 15px; - right: 0; - margin: 0; - padding: 0; - z-index: 15; - display: inline-block; - position: absolute; - background-color: #F0F0F0; - box-shadow: none; - -webkit-box-shadow: none; - transition: border 142ms linear, background 142ms linear; - -webkit-transition: border 142ms linear, background 142ms linear; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step:before{ - top: 4px; - left: 50%; - width: 0; - height: 0; - margin: 0 0 0 -4px; - padding: 0; - content: ""; - display: inline-block; - position: absolute; - transition: border 142ms linear; - -webkit-transition: border 142ms linear; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-up{ - top: 15px; - border-width: 0 0 1px 1px; - border-style: solid; - border-color: white; - border-radius: 0 2px 0 0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-up:hover{ - background-color: #E0E0E0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-up:before{ - border-width: 0 4px 5px 4px; - border-style: solid; - border-color: transparent transparent #303438 transparent; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-down{ - top: 29px; - border-width: 1px 0 0 1px; - border-style: solid; - border-color: white; - border-radius: 0 0 2px 0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-down:hover{ - background-color: #E0E0E0; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field button.picker-step.step-down:before{ - border-width: 5px 4px 0 4px; - border-style: solid; - border-color: #303438 transparent transparent transparent; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button.step-up{ - border-color: rgba(255, 255, 255, 0.8); - background-color: var(--color-primary); -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button.step-up:hover{ - background-color: var(--color-dark); -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button.step-up:before{ - border-bottom-color: white; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button + button.step-down{ - border-color: rgba(255, 255, 255, 0.8); - background-color: var(--color-primary); -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button + button.step-down:hover{ - background-color: var(--color-dark); -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:focus + button + button.step-down:before{ - border-top-color: white; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button.step-up{ - cursor: not-allowed; - border-color: rgba(255, 255, 255, 0.8); - background-color: #F6F6F6; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button.step-up:hover{ - background-color: #F6F6F6; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button.step-up:before{ - border-bottom-color: #A0A4A8; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button + button.step-down{ - cursor: not-allowed; - border-color: rgba(255, 255, 255, 0.8); - background-color: #F6F6F6; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button + button.step-down:hover{ - background-color: #F6F6F6; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field input:disabled + button + button.step-down:before{ - border-top-color: #A0A4A8; -} -.tail-datetime-calendar .calendar-timepicker .timepicker-field label{ - color: #303438; - margin: 0; - padding: 0; - display: block; - font-size: 12px; - text-align: center; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch{ - cursor: pointer; - margin: 15px 0 -5px 0; - display: block; - text-align: center; - vertical-align: top; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch:before, -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch:after{ - width: auto; - margin: 0; - padding: 0 5px; - font-size: 12px; - line-height: 16px; - vertical-align: top; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch:before{ - content: attr(data-am); -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch:after{ - content: attr(data-pm); -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"]{ - display: none; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"] + span{ - display: inline-block; - position: relative; - vertical-align: top; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"] + span:before{ - width: 50px; - height: 16px; - content: ""; - display: inline-block; - vertical-align: top; - border-width: 1px; - border-style: solid; - border-color: var(--color-primary); - border-radius: 14px; - transition: border 284ms linear; - -webkit-transition: border 284ms linear; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"] + span:after{ - top: 3px; - left: 4px; - right: 30px; - width: auto; - height: 10px; - margin: 0; - padding: 0; - content: ""; - display: inline-block; - position: absolute; - background-color: var(--color-primary); - border-radius: 15px; - vertical-align: top; - transition: left 284ms linear, right 284ms linear 284ms, background 284ms linear; - -webkit-transition: left 284ms linear, right 284ms linear 284ms, background 284ms linear; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"]:checked + span:before{ - border-color: #E67D1E; -} -.tail-datetime-calendar .calendar-timepicker label.timepicker-switch input[type="checkbox"]:checked + span:after{ - left: 30px; - right: 4px; - background-color: #E67D1E; - transition: right 284ms linear, left 284ms linear 284ms, background 284ms linear; - -webkit-transition: right 284ms linear, left 284ms linear 284ms, background 284ms linear; -} -.tail-datetime-calendar .calendar-actions + .calendar-timepicker{ - border-width: 0; -} -/* @end CALENDAR TIMEPICKER */ - -/* @start RTL */ -.tail-datetime-calendar.rtl{ - direction: rtl; -} -.tail-datetime-calendar.rtl .calendar-actions span.action-next, -.tail-datetime-calendar.rtl .calendar-actions span.action-prev{ - transform: rotate(180deg); - -moz-transform: rotate(180deg); - -webkit-transform: rotate(180deg); -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.date-disabled:after{ - right: 3px; - transform: rotate(45deg); - -moz-transform: rotate(45deg); - -webkit-transform: rotate(45deg); -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.date-today:before{ - right: 5px; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td .tooltip-tick{ - left: 5px; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-month.date-today:before, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-year.date-today:before, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-decade.date-today:before{ - right: 50%; - margin-right: -2.5px; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-month:hover span.inner:before, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-year:hover span.inner:before, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-decade:hover span.inner:before{ - right: 6px; - border-right-color: #cccccc; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-month span.inner:after, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-year span.inner:after, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-decade span.inner:after{ - left: 0; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-month:hover span.inner:after, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-year:hover span.inner:after, -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-decade:hover span.inner:after{ - left: 6px; - border-left-color: #cccccc; -} -.tail-datetime-calendar.rtl .calendar-datepicker table tr td.calendar-decade span.inner{ - text-align: right; -} -.tail-datetime-calendar.rtl .calendar-timepicker .timepicker-field:first-child{ - text-align: left; - padding-left: 0; - padding-right: 25px; -} -.tail-datetime-calendar.rtl .calendar-timepicker .timepicker-field:last-child{ - text-align: right; - padding-left: 25px; - padding-right: 0; -} -.tail-datetime-calendar.rtl .calendar-timepicker .timepicker-field:first-child input[type="text"]{ - margin-left: -1px; - margin-right: 0; - border-radius: 0 3px 3px 0; -} -.tail-datetime-calendar.rtl .calendar-timepicker .timepicker-field:last-child input[type="text"]{ - margin-left: 0; - margin-right: -1px; - border-radius: 3px 0 0 3px; -} -/* @end RTL */ - -/*# sourceMappingURL=tail.datetime-default-green.map */ diff --git a/frontend/src/utils/form/datepicker.js b/frontend/src/utils/form/datepicker.js index 21b09eb19..a32294162 100644 --- a/frontend/src/utils/form/datepicker.js +++ b/frontend/src/utils/form/datepicker.js @@ -1,16 +1,9 @@ -import datetime from 'tail.datetime'; -import './datepicker.css'; import { Utility } from '../../core/utility'; import moment from 'moment'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; -import * as defer from 'lodash.defer'; +import defer from 'lodash.defer'; -const KEYCODE_ESCAPE = 27; -const Z_INDEX_MODAL = 9999; - -// should be the same as ATTR_SUBMIT_LOCKED in async-table util -// TODO move to global config -const ATTR_DATEPICKER_OPEN = 'submit-locked'; // INTERNAL (Uni2work specific) formats for formatting dates and/or times const FORM_DATE_FORMAT = { @@ -19,10 +12,6 @@ const FORM_DATE_FORMAT = { 'datetime-local': moment.HTML5_FMT.DATETIME_LOCAL_SECONDS, }; -// FANCY (tail.datetime specific) formats for displaying dates and/or times -const FORM_DATE_FORMAT_DATE_DT = 'dd.mm.YYYY'; -const FORM_DATE_FORMAT_TIME_DT = 'HH:ii:ss'; - // FANCY (moment specific) formats for displaying dates and/or times const FORM_DATE_FORMAT_DATE_MOMENT = 'DD.MM.YYYY'; const FORM_DATE_FORMAT_TIME_MOMENT = 'HH:mm:ss'; @@ -35,38 +24,7 @@ const FORM_DATE_FORMAT_MOMENT = { const DATEPICKER_UTIL_SELECTOR = 'input[type="date"], input[type="time"], input[type="datetime-local"]'; const DATEPICKER_INITIALIZED_CLASS = 'datepicker--initialized'; -const DATEPICKER_OPEN_CLASS = 'calendar-open'; -const DATEPICKER_CONFIG = { - 'global': { - // set default time to 00:00:00 - timeHours: 0, - timeMinutes: 0, - timeSeconds: 0, - - weekStart: 1, - dateFormat: FORM_DATE_FORMAT_DATE_DT, - timeFormat: FORM_DATE_FORMAT_TIME_DT, - - // prevent the instance from closing when selecting a date before selecting a time - stayOpen: true, - - // hide the close button (we handle closing the datepicker manually by clicking outside) - closeButton: false, - - // disable the decades view because nobody will ever need it (i.e. cap the switch to the more relevant year view) - viewDecades: false, - }, - 'datetime-local': {}, - 'date': { - // disable date picker - timeFormat: false, - }, - 'time': { - // disable time picker - dateFormat: false, - }, -}; @Utility({ selector: DATEPICKER_UTIL_SELECTOR, @@ -76,12 +34,13 @@ export class Datepicker { // singleton Map that maps a formID to a Map of Datepicker objects static datepickerCollections; - datepickerInstance; _element; elementType; initialValue; _locale; + _eventManager; + _unloadIsDueToSubmit = false; constructor(element) { @@ -102,54 +61,18 @@ export class Datepicker { this._element = element; + this._eventManager = new EventManager(); + // store the previously set type to select the input format this.elementType = this._element.getAttribute('type'); // store initial value prior to changing type this.initialValue = this._element.value || this._element.getAttribute('value'); - // manually set the type attribute to text because datepicker handles displaying the date - this._element.setAttribute('type', 'text'); - - // get all relevant config options for this datepicker type - const datepickerGlobalConfig = DATEPICKER_CONFIG['global']; - const datepickerConfig = DATEPICKER_CONFIG[this.elementType]; - - // additional position config (optional data-datepicker-position attribute in html) that can specialize the global config - const datepickerPosition = this._element.dataset.datepickerPosition; - if (datepickerPosition) { - datepickerGlobalConfig.position = datepickerPosition; - } - - if (!datepickerConfig || !FORM_DATE_FORMAT[this.elementType]) { + if (!FORM_DATE_FORMAT[this.elementType]) { throw new Error('Datepicker utility called on unsupported element!'); } - // FIXME dirty hack below; fix tail.datetime instead - - // get date object from internal format before datetime does nasty things with it - let parsedMomentDate = moment(this.initialValue, [ FORM_DATE_FORMAT[this.elementType], FORM_DATE_FORMAT_MOMENT[this.elementType] ], true); - if (parsedMomentDate && parsedMomentDate.isValid()) { - parsedMomentDate = parsedMomentDate.toDate(); - } else { - parsedMomentDate = undefined; - } - - // initialize tail.datetime (datepicker) instance and let it do weird stuff with the element value - this.datepickerInstance = datetime(this._element, { ...datepickerGlobalConfig, ...datepickerConfig, locale: this._locale }); - - // reset date to something sane - if (parsedMomentDate) - this.datepickerInstance.selectDate(parsedMomentDate); - - // insert the datepicker element (dt) after the form - this._element.form.parentNode.insertBefore(this.datepickerInstance.dt, this._element.form.nextSibling); - - // if the input element is in any open modal, increase the z-index of the datepicker - if (this._element.closest('.modal--open')) { - this.datepickerInstance.dt.style.zIndex = Z_INDEX_MODAL; - } - // register this datepicker instance with the formID of the given element in the datepicker collection const formID = this._element.form.id; const elemID = this._element.id; @@ -166,90 +89,14 @@ export class Datepicker { } start() { - const setDatepickerDate = () => { - // try to parse the current input element value with fancy and internal format string - const parsedMomentDate = moment(this._element.value, FORM_DATE_FORMAT_MOMENT[this.elementType]); - const parsedMomentDateInternal = moment(this._element.value, FORM_DATE_FORMAT[this.elementType]); - - // only set the datepicker date if the input is either in valid fancy format or in valid internal format - if (parsedMomentDate.isValid()) { - this.datepickerInstance.selectDate(parsedMomentDate.toDate()); - } else if (parsedMomentDateInternal.isValid()) { - this.datepickerInstance.selectDate(parsedMomentDateInternal.toDate()); - } - - // reregister change event to prevent event loop - this._element.addEventListener('change', setDatepickerDate, { once: true }); - }; - // change the selected date in the tail.datetime instance if the value of the input element is changed - this._element.addEventListener('change', setDatepickerDate, { once: true }); - - - // create a mutation observer that observes the datepicker instance class and sets - // the datepicker-open DOM attribute of the input element if the datepicker has been opened - const datepickerInstanceObserver = new MutationObserver((mutations) => { - for (const mutation of mutations) { - if (!mutation.oldValue.includes(DATEPICKER_OPEN_CLASS) && this.datepickerInstance.dt.getAttribute('class').includes(DATEPICKER_OPEN_CLASS)) { - this._element.setAttribute(ATTR_DATEPICKER_OPEN, true); - break; - } - } - }); - datepickerInstanceObserver.observe(this.datepickerInstance.dt, { - attributes: true, - attributeFilter: ['class'], - attributeOldValue: true, - }); - - - // close the instance on focusout of any element if another input is focussed that is neither the timepicker nor _element - window.addEventListener('focusout', event => { - const hasFocus = event.relatedTarget !== null; - const focussedIsNotTimepicker = !this.datepickerInstance.dt.contains(event.relatedTarget); - const focussedIsNotElement = event.relatedTarget !== this._element; - const focussedIsInDocument = window.document.contains(event.relatedTarget); - if (hasFocus && focussedIsNotTimepicker && focussedIsNotElement && focussedIsInDocument) - this.closeDatepickerInstance(); - }); - - // close the instance on click on any element outside of the datepicker (except the input element itself) - window.addEventListener('click', event => { - const targetIsOutside = !this.datepickerInstance.dt.contains(event.target) - && event.target !== this.datepickerInstance.dt; - const targetIsInDocument = window.document.contains(event.target); - const targetIsNotElement = event.target !== this._element; - if (targetIsOutside && targetIsInDocument && targetIsNotElement) - this.closeDatepickerInstance(); - }); - - // close the instance on escape keydown events - this._element.addEventListener('keydown', event => { - if (event.keyCode === KEYCODE_ESCAPE) { - this.closeDatepickerInstance(); - } - }); - // format the date value of the form input element of this datepicker before form submission - this._element.form.addEventListener('submit', this._submitHandler.bind(this)); + const submitEvent = new EventWrapper(EVENT_TYPE.SUBMIT, this._submitHandler.bind(this), this._element.form); + this._eventManager.registerNewListener(submitEvent); } destroy() { - this.datepickerInstance.remove(); - } - - - // DATEPICKER INSTANCE CONTROL - - /** - * Closes the datepicker instance, releasing the lock on the input element. - */ - closeDatepickerInstance() { - if (!this._element.datepicker-open) { - throw new Error('Cannot close already closed datepicker instance!'); - } - - this._element.setAttribute(ATTR_DATEPICKER_OPEN, false); - this.datepickerInstance.close(); + this._eventManager.cleanUp(); + this._element.classList.remove(DATEPICKER_INITIALIZED_CLASS); } @@ -267,11 +114,13 @@ export class Datepicker { _submitHandler() { this._unloadIsDueToSubmit = true; + this._element.setAttribute('type', 'text'); this.formatElementValue(false); defer(() => { // Restore state after event loop is settled this._unloadIsDueToSubmit = false; this.formatElementValue(true); + this._element.setAttribute('type', this.elementType); }); } diff --git a/frontend/src/utils/form/enter-is-tab.js b/frontend/src/utils/form/enter-is-tab.js index 4e171c87b..b3097d50d 100644 --- a/frontend/src/utils/form/enter-is-tab.js +++ b/frontend/src/utils/form/enter-is-tab.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const ENTER_IS_TAB_INITIALIZED_CLASS = 'enter-as-tab--initialized'; const AREA_SELECTOR = 'input, textarea'; @@ -10,6 +11,8 @@ const AREA_SELECTOR = 'input, textarea'; export class EnterIsTab { _element; + _eventManager; + constructor(element) { if(!element) { @@ -17,6 +20,8 @@ export class EnterIsTab { } this._element = element; + + this._eventManager = new EventManager(); if (this._element.classList.contains(ENTER_IS_TAB_INITIALIZED_CLASS)) { return false; @@ -27,27 +32,32 @@ export class EnterIsTab { start() { - this._element.addEventListener('keydown', (e) => { - if(e.key === 'Enter') { - e.preventDefault(); - let currentInputFieldId = this._element.id; - let inputAreas = document.querySelectorAll(AREA_SELECTOR); - let nextInputArea = null; - for (let i = 0; i < inputAreas.length; i++) { - if(inputAreas[i].id === currentInputFieldId) { - nextInputArea = inputAreas[i+1]; - break; - } - } - - if(nextInputArea) { - nextInputArea.focus(); + let eventWrapper = new EventWrapper(EVENT_TYPE.KEYDOWN, this._captureEnter.bind(this), this._element); + this._eventManager.registerNewListener(eventWrapper); + } + + _captureEnter (e) { + if(e.key === 'Enter') { + e.preventDefault(); + let currentInputFieldId = this._element.id; + let inputAreas = document.querySelectorAll(AREA_SELECTOR); + let nextInputArea = null; + for (let i = 0; i < inputAreas.length; i++) { + if(inputAreas[i].id === currentInputFieldId) { + nextInputArea = inputAreas[i+1]; + break; } } - }); + + if(nextInputArea) { + nextInputArea.focus(); + } + } } destroy() { - console.log('TBD: Destroy EnterIsTab'); + this._eventManager.cleanUp(); + if(this._element.classList.contains(ENTER_IS_TAB_INITIALIZED_CLASS)) + this._element.classList.remove(ENTER_IS_TAB_INITIALIZED_CLASS); } } \ No newline at end of file diff --git a/frontend/src/utils/form/enter-is-tab.md b/frontend/src/utils/form/enter-is-tab.md new file mode 100644 index 000000000..67fd7e2c4 --- /dev/null +++ b/frontend/src/utils/form/enter-is-tab.md @@ -0,0 +1,8 @@ +# Enter is Tab Utility +When the user presses enter on a form that uses this utility, the enter is converted to a tab in order to not send the form. + +## Attribute: +`uw-enter-as-tab` + +## Example usage: + \ No newline at end of file diff --git a/frontend/src/utils/form/form-error-remover.js b/frontend/src/utils/form/form-error-remover.js index 1b1509c2d..f05e96fae 100644 --- a/frontend/src/utils/form/form-error-remover.js +++ b/frontend/src/utils/form/form-error-remover.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const FORM_ERROR_REMOVER_INITIALIZED_CLASS = 'form-error-remover--initialized'; const FORM_ERROR_REMOVER_INPUTS_SELECTOR = 'input:not([type="hidden"]), textarea, select'; @@ -13,6 +14,8 @@ export class FormErrorRemover { _element; + _eventManager; + constructor(element) { if (!element) throw new Error('Form Error Remover utility needs to be passed an element!'); @@ -24,6 +27,7 @@ export class FormErrorRemover { return; this._element = element; + this._eventManager = new EventManager(); this._element.classList.add(FORM_ERROR_REMOVER_INITIALIZED_CLASS); } @@ -35,11 +39,18 @@ export class FormErrorRemover { const inputElements = Array.from(this._element.querySelectorAll(FORM_ERROR_REMOVER_INPUTS_SELECTOR)); inputElements.forEach((inputElement) => { - inputElement.addEventListener('input', () => { + const inputEvent = new EventWrapper(EVENT_TYPE.INPUT, (() => { if (!inputElement.willValidate || inputElement.validity.vaild) { FORM_GROUP_WITH_ERRORS_CLASSES.forEach(c => { this._element.classList.remove(c); }); } - }); + }).bind(this), inputElement); + this._eventManager.registerNewListener(inputEvent); }); } + + destroy() { + this._eventManager.cleanUp(); + this._element.classList.remove(FORM_ERROR_REMOVER_INITIALIZED_CLASS); + } + } diff --git a/frontend/src/utils/form/form-error-reporter.js b/frontend/src/utils/form/form-error-reporter.js index dff3f00d2..3f453b5e6 100644 --- a/frontend/src/utils/form/form-error-reporter.js +++ b/frontend/src/utils/form/form-error-reporter.js @@ -1,5 +1,6 @@ import { Utility } from '../../core/utility'; -import * as defer from 'lodash.defer'; +import defer from 'lodash.defer'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const FORM_ERROR_REPORTER_INITIALIZED_CLASS = 'form-error-remover--initialized'; @@ -10,12 +11,16 @@ export class FormErrorReporter { _element; _err; + _eventManager; + constructor(element) { if (!element) throw new Error('Form Error Reporter utility needs to be passed an element!'); this._element = element; + this._eventManager = new EventManager(); + if (this._element.classList.contains(FORM_ERROR_REPORTER_INITIALIZED_CLASS)) return; @@ -24,11 +29,23 @@ export class FormErrorReporter { start() { if (this._element.willValidate) { - this._element.addEventListener('invalid', this.report.bind(this)); - this._element.addEventListener('change', () => { defer(this.report.bind(this)); } ); + let invalidElementEvent = new EventWrapper(EVENT_TYPE.INVALID, this.report.bind(this), this._element); + this._eventManager.registerNewListener(invalidElementEvent); + + let changedElementEvent = new EventWrapper(EVENT_TYPE.CHANGE, () => { defer(this.report.bind(this)); }, this._element); + this._eventManager.registerNewListener(changedElementEvent); } } + destroy() { + this._eventManager.cleanUp(); + + this._removeError(); + + if(this._element.classList.contains(FORM_ERROR_REPORTER_INITIALIZED_CLASS)) + this._element.classList.remove(FORM_ERROR_REPORTER_INITIALIZED_CLASS); + } + report() { const msg = this._element.validity.valid ? null : this._element.validationMessage; @@ -37,10 +54,7 @@ export class FormErrorReporter { if (!target) return; - if (this._err && this._err.parentNode) { - this._err.parentNode.removeChild(this._err); - this._err = undefined; - } + this._removeError(); if (!msg) { target.classList.remove('standalone-field--has-error', 'form-group--has-error'); @@ -65,4 +79,11 @@ export class FormErrorReporter { } } } + + _removeError() { + if (this._err && this._err.parentNode) { + this._err.parentNode.removeChild(this._err); + this._err = undefined; + } + } } diff --git a/frontend/src/utils/form/interactive-fieldset.js b/frontend/src/utils/form/interactive-fieldset.js index 7e912ab90..2c8ff4eb9 100644 --- a/frontend/src/utils/form/interactive-fieldset.js +++ b/frontend/src/utils/form/interactive-fieldset.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const INTERACTIVE_FIELDSET_UTIL_TARGET_SELECTOR = '.interactive-fieldset__target'; @@ -15,6 +16,8 @@ export class InteractiveFieldset { _element; + _eventManager; + conditionalInput; conditionalValue; target; @@ -28,6 +31,8 @@ export class InteractiveFieldset { this._element = element; + this._eventManager = new EventManager(); + if (this._element.classList.contains(INTERACTIVE_FIELDSET_INITIALIZED_CLASS)) { return false; } @@ -62,13 +67,11 @@ export class InteractiveFieldset { this.childInputs = Array.from(this._element.querySelectorAll(INTERACTIVE_FIELDSET_CHILD_SELECTOR)).filter(child => child.closest('[uw-interactive-fieldset]') === this._element); // add event listener - const observer = new MutationObserver(this._updateVisibility.bind(this)); - observer.observe(this.conditionalInput, { attributes: true, attributeFilter: ['data-interactive-fieldset-hidden'] }); - this.conditionalInput.addEventListener('input', this._updateVisibility.bind(this)); - + this._eventManager.registerNewMutationObserver(this._updateVisibility.bind(this), this.conditionalInput, { attributes: true, attributeFilter: ['data-interactive-fieldset-hidden'] }); + const inputEvent = new EventWrapper(EVENT_TYPE.INPUT, this._updateVisibility.bind(this), this.conditionalInput); + this._eventManager.registerNewListener(inputEvent); // mark as initialized this._element.classList.add(INTERACTIVE_FIELDSET_INITIALIZED_CLASS); - } start() { @@ -77,7 +80,8 @@ export class InteractiveFieldset { } destroy() { - // TODO + this._eventManager.cleanUp(); + this._element.classList.remove(INTERACTIVE_FIELDSET_INITIALIZED_CLASS); } _updateVisibility() { diff --git a/frontend/src/utils/form/navigate-away-prompt.js b/frontend/src/utils/form/navigate-away-prompt.js index 8890e198e..077279e13 100644 --- a/frontend/src/utils/form/navigate-away-prompt.js +++ b/frontend/src/utils/form/navigate-away-prompt.js @@ -1,11 +1,12 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import { AUTO_SUBMIT_BUTTON_UTIL_SELECTOR } from './auto-submit-button'; import { AUTO_SUBMIT_INPUT_UTIL_SELECTOR } from './auto-submit-input'; import { InteractiveFieldset } from './interactive-fieldset'; import { Datepicker } from './datepicker'; -import * as defer from 'lodash.defer'; +import defer from 'lodash.defer'; /** * Key generator from an arbitrary number of FormData objects. @@ -26,16 +27,21 @@ const NAVIGATE_AWAY_PROMPT_UTIL_OPTOUT = '[uw-no-navigate-away-prompt]'; export class NavigateAwayPrompt { _element; + _app; + + _eventManager; _initFormData; _unloadDueToSubmit = false; - constructor(element) { + constructor(element, app) { if (!element) { throw new Error('Navigate Away Prompt utility needs to be passed an element!'); } this._element = element; + this._app = app; + this._eventManager = new EventManager(); if (this._element.classList.contains(NAVIGATE_AWAY_PROMPT_INITIALIZED_CLASS)) { return; @@ -65,15 +71,18 @@ export class NavigateAwayPrompt { return; this._initFormData = new FormData(this._element); - window.addEventListener('beforeunload', this._beforeUnloadHandler.bind(this)); + const beforeUnloadEvent = new EventWrapper(EVENT_TYPE.BEFOREUNLOAD, this._beforeUnloadHandler.bind(this), window); + this._eventManager.registerNewListener(beforeUnloadEvent); - this._element.addEventListener('submit', () => { + const submitEvent = new EventWrapper(EVENT_TYPE.SUBMIT, (() => { this._unloadDueToSubmit = true; defer(() => { this._unloadDueToSubmit = false; } ); // Restore state after event loop is settled - }); + }).bind(this), this._element); + this._eventManager.registerNewListener(submitEvent); } destroy() { + this._eventManager.cleanUp(); this._element.classList.remove(NAVIGATE_AWAY_PROMPT_INITIALIZED_CLASS); } @@ -98,7 +107,7 @@ export class NavigateAwayPrompt { // allow the event to happen if the form was not touched by the // user (i.e. if the current FormData is equal to the initial FormData) // or the unload event was initiated by a form submit - if (!formDataHasChanged || this._unloadDueToSubmit) + if (!formDataHasChanged || this.unloadDueToSubmit || this._parentModalIsClosed()) return; // cancel the unload event. This is the standard to force the prompt to appear. @@ -108,4 +117,13 @@ export class NavigateAwayPrompt { // for all non standard compliant browsers we return a truthy value to activate the prompt. return true; } + + _parentModalIsClosed() { + const parentModal = this._element.closest('.modal'); + if (!parentModal) + return false; + + const modalClosed = !parentModal.classList.contains('modal--open'); + return modalClosed; + } } diff --git a/frontend/src/utils/form/reactive-submit-button.js b/frontend/src/utils/form/reactive-submit-button.js index e46eed77e..c5bc3c642 100644 --- a/frontend/src/utils/form/reactive-submit-button.js +++ b/frontend/src/utils/form/reactive-submit-button.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const REACTIVE_SUBMIT_BUTTON_INITIALIZED_CLASS = 'reactive-submit-button--initialized'; @@ -12,12 +13,15 @@ export class ReactiveSubmitButton { _requiredInputs; _submitButton; + _eventManager; + constructor(element) { if (!element) { throw new Error('Reactive Submit Button utility cannot be setup without an element!'); } this._element = element; + this._eventManager = new EventManager(); if (this._element.classList.contains(REACTIVE_SUBMIT_BUTTON_INITIALIZED_CLASS)) { return false; @@ -51,16 +55,18 @@ export class ReactiveSubmitButton { } destroy() { - // TODO + this._eventManager.removeAllEventListenersFromUtil(); + this._element.classList.remove(REACTIVE_SUBMIT_BUTTON_INITIALIZED_CLASS); } setupInputs() { this._requiredInputs.forEach((el) => { const checkbox = el.getAttribute('type') === 'checkbox'; - const eventType = checkbox ? 'change' : 'input'; - el.addEventListener(eventType, () => { + const eventType = checkbox ? EVENT_TYPE.CHANGE : EVENT_TYPE.INPUT; + const valEvent = new EventWrapper(eventType,(() => { this.updateButtonState(); - }); + }).bind(this), el ); + this._eventManager.registerNewListener(valEvent); }); } diff --git a/frontend/src/utils/hide-columns/hide-columns.js b/frontend/src/utils/hide-columns/hide-columns.js index 7661ac92b..3d6286b2e 100644 --- a/frontend/src/utils/hide-columns/hide-columns.js +++ b/frontend/src/utils/hide-columns/hide-columns.js @@ -1,5 +1,7 @@ import { Utility } from '../../core/utility'; import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; + import './hide-columns.sass'; import { TableIndices } from '../../lib/table/table'; @@ -29,6 +31,7 @@ const HIDE_COLUMNS_INITIALIZED = 'uw-hide-columns--initialized'; export class HideColumns { _storageManager = new StorageManager('HIDE_COLUMNS', '1.1.0', { location: LOCATION.LOCAL }); + _eventManager; _element; _elementWrapper; @@ -36,8 +39,6 @@ export class HideColumns { _autoHide; - _mutationObserver; - _tableIndices; headerToHider = new Map(); @@ -62,6 +63,7 @@ export class HideColumns { return false; this._element = element; + this._eventManager = new EventManager(); this._tableIndices = new TableIndices(this._element); @@ -82,12 +84,17 @@ export class HideColumns { [...this._element.querySelectorAll('th')].filter(th => !th.hasAttribute(HIDE_COLUMNS_NO_HIDE)).forEach(th => this.setupHideButton(th)); - this._mutationObserver = new MutationObserver(this._tableMutated.bind(this)); - this._mutationObserver.observe(this._element, { childList: true, subtree: true }); + this._eventManager.registerNewMutationObserver(this._tableMutated.bind(this), this._element, { childList: true, subtree: true }); this._element.classList.add(HIDE_COLUMNS_INITIALIZED); } + destroy() { + this._eventManager.cleanUp(); + this._tableUtilContainer.remove(); + this._element.classList.remove(HIDE_COLUMNS_INITIALIZED); + } + setupHideButton(th) { const preHidden = this.isHiddenTH(th); @@ -104,34 +111,41 @@ export class HideColumns { this.addHeaderHider(th, hider); - th.addEventListener('mouseover', () => { + const mouseOverEvent = new EventWrapper(EVENT_TYPE.MOUSE_OVER, (() => { hider.classList.add(TABLE_HIDER_VISIBLE_CLASS); - }); - th.addEventListener('mouseout', () => { + }).bind(this), th); + this._eventManager.registerNewListener(mouseOverEvent); + + const mouseOutEvent = new EventWrapper(EVENT_TYPE.MOUSE_OUT, (() => { if (hider.classList.contains(TABLE_HIDER_CLASS)) { hider.classList.remove(TABLE_HIDER_VISIBLE_CLASS); } - }); + }).bind(this), th); + this._eventManager.registerNewListener(mouseOutEvent); - hider.addEventListener('click', (event) => { + const hideClickEvent = new EventWrapper(EVENT_TYPE.CLICK, ((event) => { event.preventDefault(); event.stopPropagation(); this.switchColumnDisplay(th); // this._tableHiderContainer.getElementsByClassName(TABLE_HIDER_CLASS).forEach(hider => this.hideHiderBehindHeader(hider)); - }); + }).bind(this), hider); + this._eventManager.registerNewListener(hideClickEvent); - hider.addEventListener('mouseover', () => { + const mouseOverHider = new EventWrapper(EVENT_TYPE.MOUSE_OVER, (() => { hider.classList.add(TABLE_HIDER_VISIBLE_CLASS); const currentlyHidden = this.hiderStatus(th); this.updateHiderIcon(hider, !currentlyHidden); - }); - hider.addEventListener('mouseout', () => { + }).bind(this), hider); + this._eventManager.registerNewListener(mouseOverHider); + + const mouseOutHider = new EventWrapper(EVENT_TYPE.MOUSE_OUT, (() => { if (hider.classList.contains(TABLE_HIDER_CLASS)) { hider.classList.remove(TABLE_HIDER_VISIBLE_CLASS); } const currentlyHidden = this.hiderStatus(th); this.updateHiderIcon(hider, currentlyHidden); - }); + }).bind(this), hider); + this._eventManager.registerNewListener(mouseOutHider); new ResizeObserver(() => { this.repositionHider(hider); }).observe(th); @@ -144,12 +158,12 @@ export class HideColumns { switchColumnDisplay(th, hidden) { hidden = typeof(hidden) === 'undefined' ? !this.isHiddenTH(th) : !!hidden; - this.cellColumns(th).forEach(columnIndex => this.updateColumnDisplay(columnIndex, hidden)); + Array.from(this.cellColumns(th)).forEach(columnIndex => this.updateColumnDisplay(columnIndex, hidden)); } updateColumnDisplay(columnIndex, hidden) { // console.debug('updateColumnDisplay', { columnIndex, hidden }); - this._element.rows.forEach(row => { + Array.from(this._element.rows).forEach(row => { const cell = this.getCol(row, columnIndex); if (cell) { @@ -221,7 +235,7 @@ export class HideColumns { } updateHiderIcon(hider, hidden) { - hider.getElementsByClassName('fas').forEach(hiderIcon => { + Array.from(hider.getElementsByClassName('fas')).forEach(hiderIcon => { hiderIcon.classList.remove(hidden ? 'fa-eye' : 'fa-eye-slash'); hiderIcon.classList.add(hidden ? 'fa-eye-slash' : 'fa-eye'); }); diff --git a/frontend/src/utils/inputs/checkbox.js b/frontend/src/utils/inputs/checkbox.js index 9b1b541ff..ebf721667 100644 --- a/frontend/src/utils/inputs/checkbox.js +++ b/frontend/src/utils/inputs/checkbox.js @@ -9,43 +9,54 @@ const CHECKBOX_INITIALIZED_CLASS = 'checkbox--initialized'; selector: 'input[type="checkbox"]:not([uw-no-checkbox]), input[type="radio"]:not([uw-no-radiobox])', }) export class Checkbox { + + _element; + _wrapperEl; + constructor(element) { if (!element) { throw new Error('Checkbox utility cannot be setup without an element!'); } + this._element = element; - const isRadio = element.type === 'radio'; + const isRadio = this._element.type === 'radio'; const box_class = isRadio ? RADIOBOX_CLASS : CHECKBOX_CLASS; - if (isRadio && element.closest('.radio-group')) { + if (isRadio && this._element.closest('.radio-group')) { // Don't initialize radiobox, if radio is part of a group return false; } - if (element.classList.contains(CHECKBOX_INITIALIZED_CLASS)) { + if (this._element.classList.contains(CHECKBOX_INITIALIZED_CLASS)) { // throw new Error('Checkbox utility already initialized!'); return false; } - if (element.parentElement.classList.contains(box_class)) { + if (this._element.parentElement.classList.contains(box_class)) { // throw new Error('Checkbox element\'s wrapper already has class '' + box_class + ''!'); return false; } - const siblingEl = element.nextSibling; - const parentEl = element.parentElement; + const siblingEl = this._element.nextSibling; + const parentEl = this._element.parentElement; - const wrapperEl = document.createElement('div'); - wrapperEl.classList.add(box_class); + this._wrapperEl = document.createElement('div'); + this._wrapperEl.classList.add(box_class); const labelEl = document.createElement('label'); labelEl.setAttribute('for', element.id); - wrapperEl.appendChild(element); - wrapperEl.appendChild(labelEl); + this._wrapperEl.appendChild(element); + this._wrapperEl.appendChild(labelEl); - parentEl.insertBefore(wrapperEl, siblingEl); + parentEl.insertBefore(this._wrapperEl, siblingEl); - element.classList.add(CHECKBOX_INITIALIZED_CLASS); + this._element.classList.add(CHECKBOX_INITIALIZED_CLASS); + } + + destroy() { + if (this._wrapperEl !== undefined) + this._wrapperEl.remove(); + this._element.classList.remove(CHECKBOX_INITIALIZED_CLASS); } } diff --git a/frontend/src/utils/inputs/checkrange.js b/frontend/src/utils/inputs/checkrange.js new file mode 100644 index 000000000..1957c0fee --- /dev/null +++ b/frontend/src/utils/inputs/checkrange.js @@ -0,0 +1,125 @@ +import { Utility } from '../../core/utility'; +import { TableIndices } from '../../lib/table/table'; +import { FrontendTooltips } from '../../lib/tooltips/frontend-tooltips'; +import { Translations } from '../../messages'; + + +const CHECKRANGE_INITIALIZED_CLASS = 'checkrange--initialized'; +const CHECKBOX_SELECTOR = '[type="checkbox"]'; + + +@Utility({ + selector: 'table:not([uw-no-check-all])', + }) +export class CheckRange { + _lastCheckedCell = null; + _element; + _tableIndices; + _columns = new Array(); + + constructor(element) { + if(!element) { + throw new Error('Check Range Utility cannot be setup without an element'); + } + + this._element = element; + + if (this._element.classList.contains(CHECKRANGE_INITIALIZED_CLASS)) + return false; + + this._tableIndices = new TableIndices(this._element); + + this._gatherColumns(); + + let checkboxColumns = this._findCheckboxColumns(); + + checkboxColumns.forEach(columnId => this._setUpShiftClickOnColumn(columnId)); + + this._element.classList.add(CHECKRANGE_INITIALIZED_CLASS); + } + + _setUpShiftClickOnColumn(columnId) { + if (!this._columns || columnId < 0 || columnId >= this._columns.length) return; + let column = this._columns[columnId]; + let language = document.documentElement.lang; + let toolTipMessage = Translations.getTranslation('checkrangeTooltip', language); + FrontendTooltips.addToolTip(column[0], toolTipMessage); + column.forEach(el => el.addEventListener('click', (ev) => { + + if(ev.shiftKey && this.lastCheckedCell !== null) { + let lastClickedIndex = this._tableIndices.rowIndex(this._lastCheckedCell); + let currentCellIndex = this._tableIndices.rowIndex(el); + let cell = this._columns[columnId][currentCellIndex]; + if(currentCellIndex > lastClickedIndex) + this._handleCellsInBetween(cell, lastClickedIndex, currentCellIndex, columnId); + else + this._handleCellsInBetween(cell, currentCellIndex, lastClickedIndex, columnId); + } else { + this._lastCheckedCell = el; + } + })); + } + + _handleCellsInBetween(cell, firstRowIndex, lastRowIndex, columnId) { + if(this._isChecked(cell)) { + this._uncheckMultipleCells(firstRowIndex, lastRowIndex, columnId); + } else { + this._checkMultipleCells(firstRowIndex, lastRowIndex, columnId); + } + } + + _checkMultipleCells(firstRowIndex, lastRowIndex, columnId) { + for(let i=firstRowIndex; i<=lastRowIndex; i++) { + let cell = this._columns[columnId][i]; + if (cell.tagName !== 'TH') { + cell.querySelector(CHECKBOX_SELECTOR).checked = true; + } + } + } + + _uncheckMultipleCells(firstRowIndex, lastRowIndex, columnId) { + for(let i=firstRowIndex; i<=lastRowIndex; i++) { + let cell = this._columns[columnId][i]; + if (cell.tagName !== 'TH') { + cell.querySelector(CHECKBOX_SELECTOR).checked = false; + } + } + } + + _isChecked(cell) { + return cell.querySelector(CHECKBOX_SELECTOR).checked; + } + + + _gatherColumns() { + for (const rowIndex of Array(this._tableIndices.maxRow + 1).keys()) { + for (const colIndex of Array(this._tableIndices.maxCol + 1).keys()) { + + const cell = this._tableIndices.getCell(rowIndex, colIndex); + + if (!cell) + continue; + + if (!this._columns[colIndex]) + this._columns[colIndex] = new Array(); + + this._columns[colIndex][rowIndex] = cell; + } + } + } + + _findCheckboxColumns() { + let checkboxColumnIds = new Array(); + this._columns.forEach((col, i) => { + if (this._isCheckboxColumn(col)) { + checkboxColumnIds.push(i); + } + }); + return checkboxColumnIds; + } + + _isCheckboxColumn(col) { + return col.every(cell => cell.tagName == 'TH' || cell.querySelector(CHECKBOX_SELECTOR)) + && col.some(cell => cell.querySelector(CHECKBOX_SELECTOR)); + } +} \ No newline at end of file diff --git a/frontend/src/utils/inputs/checkrange.md b/frontend/src/utils/inputs/checkrange.md new file mode 100644 index 000000000..894a3bd4f --- /dev/null +++ b/frontend/src/utils/inputs/checkrange.md @@ -0,0 +1,5 @@ +# Checkrange Utility +Is set on the table header of a specific row. Remembers the last checked checkbox. When the users shift-clicks another checkbox in the same row, all checkboxes in between are also checked. + +# Attribute: table:not([uw-no-check-all] +(will be setup on all tables which use the util check-all) \ No newline at end of file diff --git a/frontend/src/utils/inputs/file-input.js b/frontend/src/utils/inputs/file-input.js index e84d2ce26..300a15fa4 100644 --- a/frontend/src/utils/inputs/file-input.js +++ b/frontend/src/utils/inputs/file-input.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './file-input.sass'; const FILE_INPUT_CLASS = 'file-input'; @@ -19,6 +20,8 @@ export class FileInput { _fileList; _label; + _eventManager; + constructor(element, app) { if (!element) { throw new Error('FileInput utility cannot be setup without an element!'); @@ -27,6 +30,8 @@ export class FileInput { this._element = element; this._app = app; + this._eventManager = new EventManager(); + if (this._element.classList.contains(FILE_INPUT_INITIALIZED_CLASS)) { throw new Error('FileInput utility already initialized!'); } @@ -40,11 +45,11 @@ export class FileInput { this._label = this._createFileLabel(); this._updateLabel(); - // add change listener - this._element.addEventListener('change', () => { + const changeInputEv = new EventWrapper(EVENT_TYPE.CHANGE,(() => { this._updateLabel(); this._renderFileList(); - }); + }).bind(this), this._element ); + this._eventManager.registerNewListener(changeInputEv); // add util class for styling and mark as initialized this._element.classList.add(FILE_INPUT_CLASS); @@ -52,7 +57,10 @@ export class FileInput { } destroy() { - // TODO + this._eventManager.cleanUp(); + this._fileList.remove(); + this._label.remove(); + this._element.classList.remove(FILE_INPUT_INITIALIZED_CLASS); } _renderFileList() { diff --git a/frontend/src/utils/inputs/file-max-size.js b/frontend/src/utils/inputs/file-max-size.js index 653cca287..d0b8e75f5 100644 --- a/frontend/src/utils/inputs/file-max-size.js +++ b/frontend/src/utils/inputs/file-max-size.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const FILE_MAX_SIZE_INITIALIZED_CLASS = 'file-max-size--initialized'; @@ -9,6 +10,8 @@ export class FileMaxSize { _element; _app; + _eventManager; + constructor(element, app) { if (!element) throw new Error('FileMaxSize utility cannot be setup without an element!'); @@ -16,6 +19,8 @@ export class FileMaxSize { this._element = element; this._app = app; + this._eventManager = new EventManager(); + if (this._element.classList.contains(FILE_MAX_SIZE_INITIALIZED_CLASS)) { throw new Error('FileMaxSize utility already initialized!'); } @@ -24,7 +29,13 @@ export class FileMaxSize { } start() { - this._element.addEventListener('change', this._change.bind(this)); + const changeEv = new EventWrapper(EVENT_TYPE.CHANGE, this._change.bind(this), this._element); + this._eventManager.registerNewListener(changeEv); + } + + destroy() { + this._eventManager.cleanUp(); + this._element.classList.remove(FILE_MAX_SIZE_INITIALIZED_CLASS); } _change() { diff --git a/frontend/src/utils/inputs/inputs.js b/frontend/src/utils/inputs/inputs.js index a072c2196..13d241895 100644 --- a/frontend/src/utils/inputs/inputs.js +++ b/frontend/src/utils/inputs/inputs.js @@ -2,6 +2,7 @@ import { Checkbox } from './checkbox'; import { FileInput } from './file-input'; import { FileMaxSize } from './file-max-size'; import { Password } from './password'; +import { CheckRange } from './checkrange'; import './inputs.sass'; import './radio-group.sass'; @@ -11,4 +12,5 @@ export const InputUtils = [ FileInput, FileMaxSize, Password, + CheckRange, ]; diff --git a/frontend/src/utils/inputs/password.js b/frontend/src/utils/inputs/password.js index 2bb750802..0659ab57e 100644 --- a/frontend/src/utils/inputs/password.js +++ b/frontend/src/utils/inputs/password.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const PASSWORD_INITIALIZED_CLASS = 'password-input--initialized'; @@ -9,6 +10,9 @@ export class Password { _element; _iconEl; _toggleContainerEl; + _wrapperEl; + + _eventManager; constructor(element) { if (!element) @@ -18,25 +22,26 @@ export class Password { return false; this._element = element; + this._eventManager = new EventManager(); this._element.classList.add('password-input__input'); const siblingEl = this._element.nextSibling; const parentEl = this._element.parentElement; - const wrapperEl = document.createElement('div'); - wrapperEl.classList.add('password-input__wrapper'); - wrapperEl.appendChild(this._element); + this._wrapperEl = document.createElement('div'); + this._wrapperEl.classList.add('password-input__wrapper'); + this._wrapperEl.appendChild(this._element); this._toggleContainerEl = document.createElement('div'); this._toggleContainerEl.classList.add('password-input__toggle'); - wrapperEl.appendChild(this._toggleContainerEl); + this._wrapperEl.appendChild(this._toggleContainerEl); this._iconEl = document.createElement('i'); this._iconEl.classList.add('fas', 'fa-fw'); this._toggleContainerEl.appendChild(this._iconEl); - parentEl.insertBefore(wrapperEl, siblingEl); + parentEl.insertBefore(this._wrapperEl, siblingEl); this._element.classList.add(PASSWORD_INITIALIZED_CLASS); } @@ -44,17 +49,31 @@ export class Password { start() { this.updateVisibleIcon(this.isVisible()); - this._toggleContainerEl.addEventListener('mouseover', () => { + const mouseOverEv = new EventWrapper(EVENT_TYPE.MOUSE_OVER, (() => { this.updateVisibleIcon(!this.isVisible()); - }); - this._toggleContainerEl.addEventListener('mouseout', () => { + }).bind(this), this._toggleContainerEl); + + const mouseOutEv = new EventWrapper(EVENT_TYPE.MOUSE_OUT, (() => { this.updateVisibleIcon(this.isVisible()); - }); - this._toggleContainerEl.addEventListener('click', (event) => { + }).bind(this), this._toggleContainerEl); + + const clickEv = new EventWrapper(EVENT_TYPE.CLICK, ((event) => { event.preventDefault(); event.stopPropagation(); this.setVisible(!this.isVisible()); - }); + }).bind(this), this._toggleContainerEl ); + + this._eventManager.registerListeners([mouseOverEv, mouseOutEv, clickEv]); + } + + destroy() { + this._eventManager.cleanUp(); + this._iconEl.remove(); + this._toggleContainerEl.remove(); + this._wrapperEl.remove(); + this._iconEl.remove(); + + this._element.classList.remove(PASSWORD_INITIALIZED_CLASS); } isVisible() { diff --git a/frontend/src/utils/inputs/radio.js b/frontend/src/utils/inputs/radio.js index 38a3f0f2f..311f3fb53 100644 --- a/frontend/src/utils/inputs/radio.js +++ b/frontend/src/utils/inputs/radio.js @@ -9,39 +9,51 @@ const RADIO_INITIALIZED_CLASS = 'radio--initialized'; }) export class Radio { + _element; + _wrapperEl; + _labelEl; + constructor(element) { if (!element) { throw new Error('Radio utility cannot be setup without an element!'); } - if (element.closest('.radio-group')) { + this._element = element; + + if (this._element.closest('.radio-group')) { return false; } - if (element.classList.contains(RADIO_INITIALIZED_CLASS)) { + if (this._element.classList.contains(RADIO_INITIALIZED_CLASS)) { // throw new Error('Radio utility already initialized!'); return false; } - if (element.parentElement.classList.contains(RADIO_CLASS)) { + if (this._element.parentElement.classList.contains(RADIO_CLASS)) { // throw new Error('Radio element\'s wrapper already has class '' + RADIO_CLASS + ''!'); return false; } - const siblingEl = element.nextSibling; - const parentEl = element.parentElement; + const siblingEl = this._element.nextSibling; + const parentEl = this._element.parentElement; - const wrapperEl = document.createElement('div'); - wrapperEl.classList.add(RADIO_CLASS); + this._wrapperEl = document.createElement('div'); + this._wrapperEl.classList.add(RADIO_CLASS); - const labelEl = document.createElement('label'); - labelEl.setAttribute('for', element.id); + this._labelEl = document.createElement('label'); + this._labelEl.setAttribute('for', this._element.id); - wrapperEl.appendChild(element); - wrapperEl.appendChild(labelEl); + this._wrapperEl.appendChild(this._element); + this._wrapperEl.appendChild(this._labelEl); - parentEl.insertBefore(wrapperEl, siblingEl); + parentEl.insertBefore(this._wrapperEl, siblingEl); - element.classList.add(RADIO_INITIALIZED_CLASS); + this._element.classList.add(RADIO_INITIALIZED_CLASS); + } + + destroy() { + this._labelEl.remove(); + this._wrapperEl.remove(); + this._element.classList.remove(RADIO_INITIALIZED_CLASS); } } diff --git a/frontend/src/utils/mass-input/mass-input.js b/frontend/src/utils/mass-input/mass-input.js index aaa5f7d0c..95089161d 100644 --- a/frontend/src/utils/mass-input/mass-input.js +++ b/frontend/src/utils/mass-input/mass-input.js @@ -2,6 +2,7 @@ import { Utility } from '../../core/utility'; import { Datepicker } from '../form/datepicker'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './mass-input.sass'; const MASS_INPUT_CELL_SELECTOR = '.massinput__cell'; @@ -29,6 +30,8 @@ export class MassInput { _changedAdd = new Array(); + _eventManager; + constructor(element, app) { if (!element) { throw new Error('Mass Input utility cannot be setup without an element!'); @@ -37,6 +40,8 @@ export class MassInput { this._element = element; this._app = app; + this._eventManager = new EventManager(); + if (global !== undefined) this._global = global; else if (window !== undefined) @@ -64,9 +69,10 @@ export class MassInput { buttons.forEach((button) => { this._setupSubmitButton(button); }); - - this._massInputForm.addEventListener('submit', this._massInputFormSubmitHandler.bind(this)); - this._massInputForm.addEventListener('keypress', this._keypressHandler.bind(this)); + + const submitEv = new EventWrapper(EVENT_TYPE.SUBMIT, this._massInputFormSubmitHandler.bind(this), this._massInputForm); + const keyPressEv = new EventWrapper(EVENT_TYPE.KEYDOWN, this._keypressHandler.bind(this), this._massInputForm); + this._eventManager.registerListeners([submitEv, keyPressEv]); Array.from(this._element.querySelectorAll(MASS_INPUT_ADD_CELL_SELECTOR)).forEach(this._setupChangedHandlers.bind(this)); @@ -76,14 +82,16 @@ export class MassInput { destroy() { this._reset(); + this._eventManager.cleanUp(); + this._element.classList.remove(MASS_INPUT_INITIALIZED_CLASS); } _setupChangedHandlers(addCell) { Array.from(addCell.querySelectorAll(MASS_INPUT_ADD_CHANGE_FIELD_SELECTOR)).forEach(inputElem => { if (inputElem.closest('[uw-mass-input]') !== this._element) return; - - inputElem.addEventListener('change', () => { this._changedAdd.push(addCell); }); + const changeEv = new EventWrapper(EVENT_TYPE.CHANGE, (() => { this._changedAdd.push(addCell); }).bind(this), inputElem); + this._eventManager.registerNewListener(changeEv); }); } @@ -198,7 +206,7 @@ export class MassInput { if (this._massInputFormSubmitHandler) { return this._massInputFormSubmitHandler(event); } - } + }; _getMassInputSubmitButtons() { return Array.from(this._element.querySelectorAll('button[type="submit"][name][value], .' + MASS_INPUT_SUBMIT_BUTTON_CLASS)); @@ -207,13 +215,13 @@ export class MassInput { _setupSubmitButton(button) { button.setAttribute('type', 'button'); button.classList.add(MASS_INPUT_SUBMIT_BUTTON_CLASS); - button.addEventListener('click', this._massInputFormSubmitHandler); + const buttonClickEv = new EventWrapper(EVENT_TYPE.CLICK, this._massInputFormSubmitHandler.bind(this), button); + this._eventManager.registerNewListener(buttonClickEv); } _resetSubmitButton(button) { button.setAttribute('type', 'submit'); button.classList.remove(MASS_INPUT_SUBMIT_BUTTON_CLASS); - button.removeEventListener('click', this._massInputFormSubmitHandler); } _processResponse(responseElement) { @@ -268,9 +276,6 @@ export class MassInput { } _reset() { - this._element.classList.remove(MASS_INPUT_INITIALIZED_CLASS); - this._massInputForm.removeEventListener('submit', this._massInputFormSubmitHandler); - this._massInputForm.removeEventListener('keypress', this._keypressHandler); const buttons = this._getMassInputSubmitButtons(); buttons.forEach((button) => { diff --git a/frontend/src/utils/modal/modal.js b/frontend/src/utils/modal/modal.js index c67b13ac7..2dc74e8fe 100644 --- a/frontend/src/utils/modal/modal.js +++ b/frontend/src/utils/modal/modal.js @@ -1,4 +1,5 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './modal.sass'; const MODAL_HEADERS = { @@ -28,12 +29,16 @@ const MODALS_WRAPPER_OPEN_CLASS = 'modals-wrapper--open'; }) export class Modal { + _eventManager; + _element; _app; _modalsWrapper; _modalOverlay; _modalUrl; + _triggerElement; + _closerElement; constructor(element, app) { if (!element) { @@ -42,6 +47,7 @@ export class Modal { this._element = element; this._app = app; + this._eventManager = new EventManager(); if (this._element.classList.contains(MODAL_INITIALIZED_CLASS)) { return false; @@ -66,7 +72,7 @@ export class Modal { } destroy() { - // TODO + throw new Error('Destroying modals is not possible.'); } _ensureModalWrapper() { @@ -92,40 +98,43 @@ export class Modal { if (!triggerSelector.startsWith('#')) { triggerSelector = '#' + triggerSelector; } - const triggerElement = document.querySelector(triggerSelector); + this._triggerElement = document.querySelector(triggerSelector); - if (!triggerElement) { + if (!this._triggerElement) { throw new Error('Trigger element for Modal not found: "' + triggerSelector + '"'); } - triggerElement.classList.add(MODAL_TRIGGER_CLASS); - triggerElement.addEventListener('click', this._onTriggerClicked, false); - this._modalUrl = triggerElement.getAttribute('href'); + this._triggerElement.classList.add(MODAL_TRIGGER_CLASS); + const triggerEvent = new EventWrapper(EVENT_TYPE.CLICK, this._onTriggerClicked.bind(this), this._triggerElement, false); + this._eventManager.registerNewListener(triggerEvent); + this._modalUrl = this._triggerElement.getAttribute('href'); } _setupCloser() { - const closerElement = document.createElement('div'); - this._element.insertBefore(closerElement, null); - closerElement.classList.add(MODAL_CLOSER_CLASS); - closerElement.addEventListener('click', this._onCloseClicked, false); - this._modalOverlay.addEventListener('click', this._onCloseClicked, false); + this._closerElement = document.createElement('div'); + this._element.insertBefore(this._closerElement, null); + this._closerElement.classList.add(MODAL_CLOSER_CLASS); + const closerElEvent = new EventWrapper(EVENT_TYPE.CLICK, this._onCloseClicked.bind(this), this._closerElement, false); + this._eventManager.registerNewListener(closerElEvent); + const overlayClose = new EventWrapper(EVENT_TYPE.CLICK, this._onCloseClicked.bind(this), this._modalOverlay, false); + this._eventManager.registerNewListener(overlayClose); } _onTriggerClicked = (event) => { event.preventDefault(); this._open(); - } + }; _onCloseClicked = (event) => { event.preventDefault(); this._close(); - } + }; _onKeyUp = (event) => { if (event.key === 'Escape') { this._close(); } - } + }; _open() { this._element.classList.add(MODAL_OPEN_CLASS); @@ -153,9 +162,9 @@ export class Modal { url: url, headers: MODAL_HEADERS, }).then( - (response) => this._app.htmlHelpers.parseResponse(response) + (response) => this._app.htmlHelpers.parseResponse(response), ).then( - (response) => this._processResponse(response.element) + (response) => this._processResponse(response.element), ); } diff --git a/frontend/src/utils/navbar/navbar.js b/frontend/src/utils/navbar/navbar.js index f31ba77bd..5eb09831d 100644 --- a/frontend/src/utils/navbar/navbar.js +++ b/frontend/src/utils/navbar/navbar.js @@ -1,6 +1,7 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './navbar.sass'; -import * as throttle from 'lodash.throttle'; +import throttle from 'lodash.throttle'; export const HEADER_CONTAINER_UTIL_SELECTOR = '.navbar__list-item--container-selector .navbar__link-wrapper'; const HEADER_CONTAINER_INITIALIZED_CLASS = 'navbar-header-container--initialized'; @@ -18,6 +19,8 @@ export class NavHeaderContainerUtil { _throttleUpdateWasOpen; + _eventManager; + constructor(element) { if (!element) { throw new Error('Navbar Header Container utility needs to be passed an element!'); @@ -29,6 +32,9 @@ export class NavHeaderContainerUtil { this._element = element; this.radioButton = document.getElementById(`${this._element.id}-radio`); + + this._eventManager = new EventManager(); + if (!this.radioButton) { throw new Error('Navbar Header Container utility could not find associated radio button!'); } @@ -58,8 +64,9 @@ export class NavHeaderContainerUtil { if (!this.container) return; - window.addEventListener('click', this.clickHandler.bind(this)); - this.radioButton.addEventListener('change', this.throttleUpdateWasOpen.bind(this)); + const clickEv = new EventWrapper(EVENT_TYPE.CLICK, this.clickHandler.bind(this), window); + const changeEv = new EventWrapper(EVENT_TYPE.CHANGE, this.throttleUpdateWasOpen.bind(this), this.radioButton); + this._eventManager.registerListeners([clickEv, changeEv]); } clickHandler() { @@ -81,7 +88,10 @@ export class NavHeaderContainerUtil { this.wasOpen = this.isOpen(); } - destroy() { /* TODO */ } + destroy() { + this._eventManager.cleanUp(); + this._element.classList.remove(HEADER_CONTAINER_INITIALIZED_CLASS); + } } diff --git a/frontend/src/utils/pageactions/pageactions.js b/frontend/src/utils/pageactions/pageactions.js index 7c2334b6e..9ac157ca0 100644 --- a/frontend/src/utils/pageactions/pageactions.js +++ b/frontend/src/utils/pageactions/pageactions.js @@ -1,6 +1,7 @@ import { Utility } from '../../core/utility'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './pageactions.sass'; -import * as throttle from 'lodash.throttle'; +import throttle from 'lodash.throttle'; export const PAGEACTION_SECONDARY_UTIL_SELECTOR = '.pagenav__list-item'; const PAGEACTION_SECONDARY_INITIALIZED_CLASS = '.pagenav-list-item--initialized'; @@ -17,9 +18,12 @@ export class PageActionSecondaryUtil { closeButton; container; wasOpen; + _closer; _throttleUpdateWasOpen; + _eventManager; + constructor(element) { if (!element) { throw new Error('Pageaction Secondary utility needs to be passed an element!'); @@ -31,6 +35,8 @@ export class PageActionSecondaryUtil { this._element = element; + this._eventManager = new EventManager(); + const childContainer = this._element.querySelector('.pagenav-item__children'); if (!childContainer) { @@ -43,7 +49,7 @@ export class PageActionSecondaryUtil { const links = Array.from(this._element.querySelectorAll('.pagenav-item__link')).filter(l => !childContainer.contains(l)); if (!links || Array.from(links).length !== 1) { - throw new Error('Pageaction Secondary utility could not find associated link!'); + throw new Error('Pageaction Secondary utility could not find associated link!'); } this.navIdent = links[0].id; } @@ -71,9 +77,9 @@ export class PageActionSecondaryUtil { throw new Error('Pageaction Secondary utility could not find associated container!'); } - const closer = this._element.querySelector('.pagenav-item__close-label'); - if (closer) { - closer.classList.add('pagenav-item__close-label--hidden'); + this._closer = this._element.querySelector('.pagenav-item__close-label'); + if (this._closer) { + this._closer.classList.add('pagenav-item__close-label--hidden'); } this.updateWasOpen(); @@ -85,12 +91,12 @@ export class PageActionSecondaryUtil { start() { if (!this.container) return; - - window.addEventListener('click', this.clickHandler.bind(this)); - this.radioButton.addEventListener('change', this.throttleUpdateWasOpen.bind(this)); + const windowClickEv = new EventWrapper(EVENT_TYPE.CLICK, ((event) => this.clickHandler(event)).bind(this), window); + const radioButtonChangeEv = new EventWrapper(EVENT_TYPE.CHANGE, this.throttleUpdateWasOpen.bind(this), this.radioButton); + this._eventManager.registerListeners([windowClickEv, radioButtonChangeEv]); } - clickHandler() { + clickHandler(event) { if (!this.container.contains(event.target) && window.document.contains(event.target) && this.wasOpen) { this.close(); } @@ -109,7 +115,12 @@ export class PageActionSecondaryUtil { this.wasOpen = this.isOpen(); } - destroy() { /* TODO */ } + destroy() { + this._eventManager.cleanUp(); + if(this._closer && this._closer.classList.contains('pagenav-item__close-label--hidden')) + this._closer.classList.remove('pagenav-item__close-label--hidden'); + this._element.classList.remove(PAGEACTION_SECONDARY_INITIALIZED_CLASS); + } } diff --git a/frontend/src/utils/show-hide/show-hide.js b/frontend/src/utils/show-hide/show-hide.js index 3419ee1f4..5739baac9 100644 --- a/frontend/src/utils/show-hide/show-hide.js +++ b/frontend/src/utils/show-hide/show-hide.js @@ -1,5 +1,6 @@ import { Utility } from '../../core/utility'; import { StorageManager, LOCATION } from '../../lib/storage-manager/storage-manager'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; import './show-hide.sass'; const SHOW_HIDE_LOCAL_STORAGE_KEY = 'SHOW_HIDE'; @@ -16,6 +17,7 @@ export class ShowHide { _showHideId; _element; + _eventManager; _storageManager = new StorageManager(SHOW_HIDE_LOCAL_STORAGE_KEY, '1.0.0', { location: LOCATION.LOCAL }); constructor(element) { @@ -24,13 +26,15 @@ export class ShowHide { } this._element = element; + this._eventManager = new EventManager(); if (this._element.classList.contains(SHOW_HIDE_INITIALIZED_CLASS)) { return false; } // register click listener - this._addClickListener(); + const clickEv = new EventWrapper(EVENT_TYPE.CLICK, this._clickHandler.bind(this), this._element); + this._eventManager.registerNewListener(clickEv); // param showHideId if (this._element.dataset.showHideId) { @@ -58,17 +62,18 @@ export class ShowHide { } this._checkHash(); - - window.addEventListener('hashchange', this._checkHash.bind(this)); + const hashChangeEv = new EventWrapper(EVENT_TYPE.HASH_CHANGE, this._checkHash.bind(this), window); + this._eventManager.registerNewListener(hashChangeEv); // mark as initialized this._element.classList.add(SHOW_HIDE_INITIALIZED_CLASS, SHOW_HIDE_TOGGLE_CLASS); } - destroy() {} - - _addClickListener() { - this._element.addEventListener('click', this._clickHandler.bind(this)); + destroy() { + this._eventManager.cleanUp(); + if (this._element.parentElement.classList.contains(SHOW_HIDE_COLLAPSED_CLASS)) + this._element.parentElement.classList.remove(SHOW_HIDE_COLLAPSED_CLASS); + this._element.classList.remove(SHOW_HIDE_INITIALIZED_CLASS, SHOW_HIDE_TOGGLE_CLASS); } _show() { diff --git a/frontend/src/utils/sort-table/sort-table.js b/frontend/src/utils/sort-table/sort-table.js index 3c43a9ee2..639664685 100644 --- a/frontend/src/utils/sort-table/sort-table.js +++ b/frontend/src/utils/sort-table/sort-table.js @@ -21,7 +21,7 @@ export class SortTable { } destroy() { - console.log('TBD destroy SortTable'); + this._storageManager.clear(); } } diff --git a/frontend/src/utils/tooltips/tooltips.js b/frontend/src/utils/tooltips/tooltips.js index 12d628f35..99b144f7e 100644 --- a/frontend/src/utils/tooltips/tooltips.js +++ b/frontend/src/utils/tooltips/tooltips.js @@ -1,6 +1,7 @@ import { Utility } from '../../core/utility'; import './tooltips.sass'; import { MovementObserver } from '../../lib/movement-observer/movement-observer'; +import { EventManager, EventWrapper, EVENT_TYPE } from '../../lib/event-manager/event-manager'; const TOOLTIP_CLASS = 'tooltip'; const TOOLTIP_INITIALIZED_CLASS = 'tooltip--initialized'; @@ -17,6 +18,7 @@ export class Tooltip { _content; _movementObserver; + _eventManager; _openedPersistent = false; @@ -45,16 +47,19 @@ export class Tooltip { this._element = element; this._handle = element.querySelector('.tooltip__handle') || element; + this._eventManager = new EventManager(); + this._movementObserver = new MovementObserver(this._handle, { leadingCallback: this.close.bind(this) }); element.classList.add(TOOLTIP_INITIALIZED_CLASS); } start() { - this._element.addEventListener('mouseover', () => { this.open(false); }); - this._element.addEventListener('mouseout', this._leave.bind(this)); - this._content.addEventListener('mouseout', this._leave.bind(this)); - this._element.addEventListener('click', this._click.bind(this)); + const mouseOverEv = new EventWrapper(EVENT_TYPE.MOUSE_OVER, (() => { this.open(false); }).bind(this), this._element); + const mouseOutEv = new EventWrapper(EVENT_TYPE.MOUSE_OUT, (this._leave.bind(this)).bind(this), this._element); + const contentMouseOut = new EventWrapper(EVENT_TYPE.MOUSE_OUT, (this._leave.bind(this)).bind(this), this._content); + const clickEv = new EventWrapper(EVENT_TYPE.CLICK, this._click.bind(this), this._element); + this._eventManager.registerListeners([mouseOverEv, mouseOutEv, contentMouseOut, clickEv]); } open(persistent) { @@ -183,5 +188,10 @@ export class Tooltip { } - destroy() {} + destroy() { + this._eventManager.cleanUp(); + this._movementObserver.unobserve(); + const toolTipsRegex = RegExp(/\btooltip--.+\b/, 'g'); + this._element.className = this._element.className.replace(toolTipsRegex, ''); + } }; diff --git a/messages.tar.bz2 b/messages.tar.bz2 deleted file mode 100644 index 93cf1a0b849d65d7a057a73c14b85f8c88cdd705..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 671822 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�x+fE4wsl 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

a$xJgVu59$8c-}&36ueg2(?&8BEcwEQv0E6Nl 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 SDpW_Wq zqTxCMWP-$pX=&s6{xA8SwOrrV;v6#izP5jDVj5`)Bg$Ud_(3^nR&mYgQ|}k4y)4`$ z{R*mGiBU_diDeR)azsr6WO!}Boa=G&y>yh4E8O8!Qbzu+x#))JliK_30`k$E&Aqh< zZpQq$A8uLvwI;eRXNZ^t$(S>=9%pxuNgqRlP4iC_l^~p9&ab|V-oNl-?Z3A@ zeyL%oBr$~Aji5RhMB-DzWdABSyUy;hzS*{T$?Th-tE?DEs`$hZhLydsPS3xy+glXB z9=*JBBUe{!_IOJz$e+=8nTI?@jJ}lg)bGo7w|A)T(r36nxA4n{+w-&imxP z&X1v)<0Hu>mt?e$$0njofWowLm%rV{sB5+eKyF40@z^9dZekw&fju{=>eKMEsB{?*jZ&N>QTa5OLdgSQQ2Rap(y!amkgd~&V zhfC}0z@8+SlEW?L)}5ise5W~j+sxiWhlHH_bE+`h*}syaKL|6u9nT-jxJj-sxO%jU zihXo)KAW7aEgN*?{l9}d^w3o!v$s2pKZ@a#}tFH|+$f7oR{5k28d0dctDN246^WO~C z#p$0^(ne4Cf^OODj5T~e?A9Z zBb=$@@s@uMPP;KkxmFs@2M->Sg+y|%T!~p2VB0O6@$zoDC(#lBVnCh0?u;9B(v=X5 z?~9Xd=_rs~ovT^VG9Dqw!8u6@Hhd0bn|apQ?J7nI(n6l5nmH*oCC8YNE`e98zTADB z9}h?cv_X*<=|G+6RpdnraVJ?TI;pi~Jdt&Q`5C?QW`u8vVdO>6T6{p^T`~S`>DA+&Gw6?#d%7`YZ`^@VY zjMUXE7{tUxYZW}1!-W1HJU7^PGcb{xRs~Z{NBTa_G;f|~fCn?r^n4yj`uyJG%l#tl zl=Yio&yw@}CJk|W_I3Gjji&Lqq0#(&B9t)JajDI;gd#>@gEQP_et^fB+fOWi0r>(Q+kLHrx8lWqz7{?dGo5@j z)AgXs?&R75*75xf0{EU@1J-^A_fMNonx$_Bz8$(TM*6Gum(9=>B^nr*-EGH* z_Z_iMhrjaQ`^k@w)&F0+yVX92)3*;qdyjvgAD{4lG9!4~-}$nah~Gi#KW=|P^ZhLR zmn45(KQtd_-6;Meff0(v$B!tX7)+zJG&Wbj+M6 zaY&LbNF-KR({dtK#E*;g0-On4m~-491HGU=YC7 z{A{03V)k4xtXOp=9(j9rqQZ4B7H-XvIO8+jjWF(N2U-P6kognOzZbg!z*NyqtXz_- z!#2Y*Pw_>9kkcCX4@?gGcM>eq9fL!}zpg&rXUKaRi9+ z%cHx;GIlaJdVBv-{2ba+kuI7dkrne=_-XNS;V|y;{NA6%?TVs`qN@Es>Pa~DkW)M^ z^9;73R02j{XKe)OE;P7$&|neMG&!A*Fo5#&<>wxB7}GAY_xkhrc>Jybk_I)#Iu{uU zkU0>-&uT`zI^{N}UF?z)A2dWnL_|bHNQw$5qK}N@j}HiQ_4S(N zGT(;dB8 zZ6kv7?3eolTP$bt<42bZ>N_!#NhFd^4(bw4mf2b_rJ}Yt{y9qjqgK_5SrrvVnOTHP zd1htdiNIln_hoXMX4>}Va;Be|IGdjRGH`Egb0RBR?&;mfjCslw{>>QUD_W0IP$C*I z+G8q}Vzu0SMftp&-stq?@+ZEeqNy4vDT!%#_a0DZm76mOjHcqnhP-p{$Ua|7IhT#2 z0Go#6zoPjeI!&(vmaZNk9E%Wmx)+fi?qBT3k5oBx#g!Ye)b(UguL9KHU)CIQ7X*YQ zd7q!Dd1aPW=R!uWI+^FW!M;2{pXKR8R>8izo6n^w=6i}*5+(Ff_WI?E5ccWR_O81L zDqHFDg^~@v@>=fJxw+Jr>Wjc{PFa)s)a#R|ZTM;J>%Z2*H}&q4Np5YggmKZB_lHfT zz{`$3yBS-Zpn#J&;uX(hbFZxT{f*tzzsVEvIC9fg+j1TpbZ-192Vo>k1k z4)4y_)=qChN>4Ap5}4@K^O8Pq?2sg9L;KM5rG24MGC)v+KolWK6%8UfdEW!*?Z6TS zbl3LJX{^kP%`B+jTAogsGa)zELf>mYzre?qpKH6jQnYTX0DO}dPddVdR#x?Z~KHYKpN?GT0d*R}R zUjqAi=kguhJG-Rr@6helRaZ9If0dU9EzP!E){92lvv6&<=jY)3Nlu=oH1!uBb-#Lj z>c^_6=%Yzc%bID)WQQi;lr;ruW&Lj%&KV<<2BQQ)zLlsco6K_Ed$!^lX;oI zRdbHu%6@O9$Iln%mi)5&mBZ%T`@PcEnr8f7QS|t~1em9=%>IwZ&&Tua@c(Pz86Ll= zE(i4>M0|aD=Vwie1r!fFvtt7JJLqIQ4{yLR^j&eIZ~QL$bNOJcuk{jU`7W8trAVzP zYg!ORPZ+xu>1uMmFgYl9&>)66kH!j{IMpDM8X%tklX8T(RH?ztp{I@n6egJ7ilo6& z2dn-Q{6LrhfuxoG-~5>V5HLbB*QK_2L z$)%;QJC>C+!C{n$Wq?RwL1B>yfUHbWq)D45wk?^envh^0se7>VC!SP(A+y0>f&1K< zjagW*Y#J2$r3xw-mOoNuv*B>jx6W$U;ff3eAcKjO<6EwfvQ z0UfYG?z;XhJQiK%7?unP{JBD%-FOe3ld1&$Qm*I6;>1^o?YVK+^|XJ)XgQENWN2S4 z8u;hkbLvLYQa2Hq7N^zgy1J_}+EmaaqY>-)pdY;Ghtcb?-g-{4lgF`ZU(roATjus{ zkTeo@*Y(SUn6f5AwEF!qt^ShZ4{kUb(JS`7fVll@&p!#>bhdSF)1B{Ux_nlnUVpi(6#O(kxFF{kgJ?LmeM=Vw5n#z@zo z#G-j>HbKn{DTI_W52-1iw#Mq&hGmIl`azTF6g&%FHuY#*i#PsBQ=jf#ix&AV{wh+xvd;ZZBD3=%5I4a6@Q-oxFywWeD{z=jz$7aBWSaMfVaV$CQV zks<+1{-?wEJ@O4VOvAuPd(a;h1u+Jvn-(GmC%G{-EFH zK$9?ku*Sm;`7uiX{&*xaAA>tyq%_CNcj_!DKhC5&;D`EVhX`RE}#O0pc+FY z^jd*JAt?;$5WqCZ6N!tAgH)7`(3d1akP?Q5ap%hv6^LU44hUc!N|B<}7EC3{OH!aR zG89sT`VtT}33m~S2yjR}!772IxhE+ZFFM-ntQ!U-w#8;qPz{)wQ!vt6%`55eGt1|K zk0KIss{jyUA22X_2i?Ffh?yIB~>Z~3Q~bU zQn&{p=ZI=W3RYl<6X_+oB^Dx-w3@{l!L3}XxwUDuHANd$6-G(|Ory$FhrY!5Muu$| zMi{ng6VMT~^5c>llOY%(GrxS zvYS?w&0%%W&P40CV%eBjsvLrXRPBK^0)1qFc%U6i(Fz_p#C9HLa0Hr8>=r&lB02~c ziBlS>c;c`F@L>MDClI6)yzijI2wt(Qp`aYziU|pZV<$@>Q;>tHLZVs)rm)Zeu^|yl zswG1YLS8LFL55-(DMA2f$8|!M*3zd53L|P7kTjaD%bm2 zLUJddCP|2*CNc=U;r@R%e7DY_??C+d!4!l-KF$IPS@HCrXUKC8D(SNi>BPX0dLZZ0 z40iO9+5PGtgW!_A9wQf5%NlMjSObWTM1&ZPlGGLvAD8{S7TJ64luL!N|G2_DY>~1; z`!7Xi8I*_h^VORKg}`@-M2uIkQc)bZNEF0TnvsE0BoJicH*ZP>Fl6eAR8c@A7syOB zx2u1r5l0a0H4KVb>;q1_2 z9(g+ax1__G^?kUv&(20aUB9VgCv-QTHBsBvY0JCF|IH@w-8FT&`zV{Z_3>Qf&FFvV zK4=`hYKeJN%kM=JyS&$8|LD9%k(IHexp8J-a%3h#OwG`63qnT7ecf6{FhH~+bN3X3 zc#(oZx)m#8K6IpViaT_0DDZUIh=Ma2<%R4_j*b3eQD z=ef5}oNQDN3$ULk#0jZlX-JQ!CLY8bh)MndE&`tA!<$lkPR<1hMKrM^5d<%zFiKLC zi`MU_$aVY9lbVa!oZ5+vBkc@1I#flVR89Y*?mvFuzmEX>L-{j%<3N8l^O8A~xWk@3 zd7lJvuMm{sJBSIsW`N2x*XFMIgvQ5KR&n-07z3=XUzh zGm={F*0evG#FC-biq>9cQ0AVsm#tb+0LCJvYM!-D|K12dY=c{v%~r2A+9Cf?6LIJVZF_xX{9Y~+!K;a?zI@XU8AIl(ixQDFUr&#g`KpvVcw*n9kqv8KY z`(HuqJAU``{@3}vpOVx2tM}G#Y28gY$3oBl8Rk;6~j%C@eY9=F~Ol$ZS*O1$Z( z3{m#SJL4J8uXE142*dR`?q^5ECCbY^WjjhAuPtF|%JHn%n%2v_wc~wGCmFk~x8p8bn$2pu&v*3Ii54*wkw{bG zv8hv|GAMs5E)t+u%0*|*Y4rjhw*etfCBRHRw^a?mne|!wIW*QXrjYiRCG=f&nvtdO z?cxX%SMRn;W*63eYXQvZHvg^rCC{`;H}yO~j^#*qB@l@&m7P12+LXhWIz1K3Jszp4 zTwU#H%MnFPQgG&B`jS8mr>1vtFZlgLylH8kyPjt#jc9DRka@T)sCLZiT_^&4P}d*_ zJLXRL$GxLF=`!jL*9546sPBGokInq*1SZgeeG=%N`zI^EUX9)9BmmsHHCyI2hPuu5 z$6dYTu;cx3gTiAHMllQ`*|7j&wdx4jD;TcqR9TW*SEK=*Ey%D z19tV^`qy>VtS@{jXt&eMFDj=|9lbKzf#3%3dgx_QX3XT*H;F5{DD`Q?-*z_;VUiyb z1{exg3%suhXH6o{oIi(kE!$Wh5cK%&;W^5e1753jW7dvcU(J)OhVqTL^L*RiH5X28 zkZ*Prw#~CtN_uBrK5tpVIIAxCIP`A!txU<3_jU4p?HXSX0xlZA_mM~6w>$OK`o*WF zN1KMItbJj3s>U16Y?+kfi690pOGrs-{eGmM+({7zL|4_C^#i_LW7_TkjMsj24(W~k z5)x0|U2o16*He;d{P!!qRdqXgT)ydE>o*?nZx5pH@^I~&-F=^SH{W{g-P2RaCa%e9 zA2p)6k0-^BW~uL~-n;HwDJ5M{ApytRMe6jNC>ocUIcm(>Y48ud4AC)$W@)(Y&-(d! zf4%Pispb5i5AEZp*dNWK0QVsPJ(4PZ$wf^{53*1Xu0?&)hzECmDY#C6fc>N*fuaR+ zG6gg+9pGomb;11_(RHlC?+GvujvMXGH5Xwg^4$Erbo=7~nvd6r%lrPQeXWQA??1qh zKWjff_&=So%j!~nXZI4kGlW0MBD~qB zZ-05sukL>`ce$BiGc6S6W0o=mOp?$MLo0@6OY8S@^gixT_{$I<=>LZo*#rJ5a!zt{ znk+AiNPM0yT|QlN{uXlI>tpj=1q~EXJC!|QPuhwEJMR(VC>E2>2dF?iL%35T^H|AC z*Bg-3f1+HJ2VA-|2I4Q6i&<|SNc_+N(Yp#(BzY0z)+dA<{QF^f{SdUwxOY6qQG}QP~I-Zz%;f+cg1eQ24}WY-&% z#f{}-jCj?BcJlI&MvC&ak)UGyKy7Fv$#l5G@jgq$uaUMnBq(F}zGsvK(-EfFMytqC zR;x_1rkQ>J+})_p__V%*126u3akC#57=WwjkVn%3C}gSu*9dA)I0Qpds2bgZQi;y6 z4?nX7f6m1OQ2|U#@DKMnhr*(p4U)7K_6Z0X58LqIhNYy2U?2`Yo%<;6?-yae;(51G z9u}*nsLG%1_jLbQ=`y?r$`d(@4%zscM1#JDwOjD7{GG$-)zguK6qIuYIwlY5NhpMe zulg6u-_H#4Q_GYr5cWREGO7~1s14IZgbgzqHuq6eLX1MjjA>tGu>isBf^g4gb%$Hl zBqv4(PL^^`g9*@ES$;u?a8pwik{pv{NC;}z&WNB6^YbR2uwaw z!bspc0n%VdTj->0nXrIuaQ(8+YFdCBq4)2dajZ2bd*8ijAMqshfC^K0f=?+U%UC(V zhf+hzknd**cPw5hz>uu1jF%;RHq66`9g>bp_nf^m421FTX!g*RfjP1R5lDkMJAYQ^ zE3?8_kWORS4N*X{6K*D#sm-@Twn>1RX{k-v zAubSRr`Dc@3M;54E9<<_LMfpu~g>kYs{_C|SuKr1zgk|AJd~N|Z~} zpE~0yLvP>V)2BqV(!(6l%`w3mp(ZYws)>jV*EADNL%r%Qn86A`z{*lVVvZL?)m_xw zZX9Q`*IMT?`rtH=)MPz=&W#SRu|V^ase8-r@J<4!**&1!XE@UdMINoXXOvKvy_ruN^Tyb)wg)N+2fto?|(W@JbeAz(Fb~- zW&(#^T=n6FKMB*98)ueI^%pEs7;Z~6z*PfrX+iFfG5f{+g0R2UXwnJ6&($VD-iB&B z`LEffGMq3?hd^K>LahLfiA)MK7z?5lA5R!UMS1aaGvJ*(L|HA}#)Q<3N!^G8g+LSn zK_e2;6bTe7#4(0FU}hZSxHkilgCfM9?zQjd&ezN3*FAw=A441^MC6(k(g=1`kIM-w z6fj9rWhB&^OEXd=zg=`Nf}{x{OEVgU3{)r@&8aN4C8aebEVgM{LKKT3D3pN^v)3Tt ziT)#i)AK?<4e@p6`D}=h$%vpNtPdE7<}5+usZFe4mHk>_0potBqf) z;{0g8%1Ixf#B-#fKLaE_|3jwd&;L(wI1q!IJ7^E#XW0HLF;FFzW9@mc(wF$)X4i#3 zhiQQ+DaQBzCM!3oiXVg%JfMcdPsu>@un)2CB&1M3i4QXotQRN60ZOnKYxx4y${VUI z3Lw-<&0HJ{wJrtWh9t&J%Q20xI!wR1ic?A)K}v@(VkE@U2GDHGNn2D^sM;#G$4IV8 zQwo&4lH`Jv0Yad5WG-UB#EJkUgAOq^jDm3?ajhs)Eh9=~iNirDsYnTxReS$mcW1s{ zn5$ybOC=%|Q6m3d18_Qk;bvEpiKas#_KXbVfx0JOQG}6H%*;x$D?E{?x1JQ*Ok-)9 zrdklf8wF&OoKojB%$h7j2|+up)!Mw>;zV#1AdKeVWgs=Og9Q z%^+tKm_`bP9;%pNX{b%+shXsquwcT~5zL|x7846p+Rj-(PN3k{5gp`pD(XT~f+V1d zP9}#QEy|jVv4!4eFv~KOAt5cv7{sZ8W>F;>fbojsaX@J{B+HrfyDX9}K~+7(Eu`8S z3lmVHAThH^Z3M7Ziwi_bV3gIV9I|AbI1CYT6?yMbrD8`h3?v}rw>~3qgxqI3an=-Z zg|>(YaY>^B#eu?bm_Pwy=!nLVw`?egY?pGHwg{^IW4B?_?z=i-%SDxiETqb4#pN2; z8Z}84V0ru(z++*`ii()!IT>9E+8zH2b@ph?C*=2jeSXM4Jaj5VCq-q03EUlNL6p=3 z-2TCUb#65dn(vHlDf9EV= zeqZn#4G!zeA2!v=eIT80fwQ3A(Mw0cP~Hhq5i!^^cgx@Y3E=VSe~uy=4zKnc)3n%m zKfs4?691G`<1uWwO)nVGaKhv)%JsX>Gr=RL!B! zonnkdpVI^6EJijjg3Pf(GxBPTD;M&FL~mV6O2HoAj6_K?Yzo8#%4ris69q=Y!NIfV zu{FQs`}{==eAQZfT_L|h_j}l`A$o3tOjA)OytcpsLJ7wzU*lYvH5mj$h7$~C)qIQx z-X)~4PoeiT+CPH}K97z^B$HeWHZ@^P>*QW8v%&cthmtocc1Lx)W3a)?S#LBnrX0CY zT}{5QkADb)ioq5O3Kpm=MPGGotwCjiZ=j*neL;9TeSQn$&%?GgR5Q6KL)X>Y6Qusy zcO6J{fhXb4bezq}@E-X4Yf9SM+iOIo5b8Mg6Pd}0o=|1lUL6#NL5GCSm+Py+Fm0GW z&Ukfd`3{K6Ac&Z~#8LVBpHo^WL_I_BkM zdk-BFTTRuXCR!|4X+tptiKUmL#*q}*IqU_(nXp$5PD)LEbk1g;C3nF_C7ZTrW{Mcb z#xe|&Jr`tNGF!m-s+9D5zeNR-aWh${!AC0&F)-!GXthUR_=&L{^Z1T`FC|x+VBWSF*x0^p zJ+R3q-TfL+j_HjB_psTfWV(N|Ped?aC=PvNUtSJ`lRlFcYZy^xe#G;PPYq0_Lr|s{4BBx)$mN@)) z7?tbp@VzT*ZLPMHr8*wT^Y6fA`4qk(Zuix(z8-}~991FxZw);==BXm1JzVA7ClX1K zd|j%`xq-B0fI?~@Dt2&xKr(P}GXO&{wJ-emY^*q`W3={Dke&w{XLA1JlObJzJq-Yx zAdlrn)GI!UyF+86iXvi5)%=|f$Ch0o^~F7g(UZtT#iTk<$?Q7x8yGSjX!kD355U~< zLojtiG5Lnwju&Y*_vW)^of_52^q>NKgn*s`UN`1}_`wNX0<9<~`fuNm5cNun>g$B; z?>$GG3=SauBo$$gUL%}d2>PkwBgA6?^*b}N3Z3l5i_DOhd8<5m&QJmxVc^xDtvhCo z2oD#TqiR+_a7g<}h?v|x9w1l1fm5!B{xiKEzn=I!HDg0;vsh~6sK*!w~Z5NBBFw-_UjNe&9^}T4_i6=jT!#5_>1<2ckm*y-8&YC1Hbed^mLaC}4YHI!~18U=gGtrNNCK}95@0(th zO&%;{s$V0+(yAK{7?OzMp`vVR3K)=*iS6#~%qFo@XWV}C?n8U2X~3=&7}FoH=W!n& zskeBiu-(3Cnxn&g5bK+_lr`Hw$&Afr!_h#JEktY!F#t;Ko^uel_%Ht;g*LlzZO0I}jNe*u%CQP~>4r z;A4qxj?!&~A)s9_Uv<;3kKBCb{( zQ<9W|651eRTsvo~Im2DHNKzF5Xc*FM1A=Eqx1$#z%LN3)2lD9gP*W&mqx#Ys*ja3O zX|5Y%e~AS2FWy1)gW=PBy_wciG0J>R>LT&rb@Muq`?173Xg)k}kq-Gor$N`$L*$3# zJ-s~(pl35BlULh~YKp}Mcl+ugtdrj0=accLs#-lUl|{+6qW#a+bST#Z_8XP+5^6Zq|n zSch@;-la5>rnb4glKw*%jqYhLfITPh)jx9(a(GS_U!H8Dce8uO+U8lAtr~jQu+UmX zY97jp@=?7}%xlW#xk|S#-Hxx3amO;Mqhp1SHI9s;Q;poZk?3n0yD`mB1eph}HqtqwZFZPG;oGNh3v55oebxbd=!Hl!%jRWwG8Ny=|^po-D zP0wZ=0CoF$SEy(wnU~&f*)DK4a>Bwx$qL1RJ6m;` z=lZhWZ3pW5%*R@R9sok%)3ENjkZ?kaaSn%mFMVC#>Tp|0IPRp%9`o$L!_Dq!y2Rvz zhyxiCg82tak#2HcL(k9au9J^n zBc$eUps4|U2U2*G_(c%@2w&GFAQ2B)C?5(R*Zwp=gZUl+>U#JX0s7=sG!LK3B#ey9GbP92?!re;@ zM2sQ!s9`kH2?k)Cp{@z<;{6$h8KL>kw#A|Wmj?v2pq61F)!zW}k%y1y?0?R5dEq|s z!xZ-TdDt#%(*weK4eh5Wt%&C<%%e>i_*e90Y}xq4 zA#s%<7}%=SFk-r;`l6x6v87^~T)FcvvbF!RS2%t7!zEUrQ5|3@=Qe~N?ik-d(h zHm!l&WB7-;Qcj*32T`G%P0cSa&dQx8to7D=>$3fnW3UrU4JMgT;Lc!YLwhRDz>%E@ zIn?6@nu#POPEub|A8g6lHcQO6MOAc?cA|&mj>iO^em^hM@hz>bw$hZ_yV1QSdMuR= zck;w^IPO43HsN9ECC5&AWe@cYy9JY2GYHB{+4c4Cc!+qB5h*B$h=_)Q2qxXly>?KX zaw1oVy!^6Ln?**&t1|Q#4UE|>edMGcr|MWeOUmGvDYlO4VBxE_mjS*^4ZKlBMjKOP zOfv;=ppIq@H?=9(B{b`CfK>CI(B%)0M9bMH+=i!lCi2qPlg%AnHHv94wlumDSkjn< zy3Bjageu#rF$R1M+Mzby+n4lx=AGU6csdr0J3h|kWn~8^S;t(5r>q_oT?YN#$9=&v zqj7m=rmkhnB>|`|nJB`x(37o!2?wwR>&uC=62iv2ISJu82oQrt7)iMP!@sZMsHMDj zOWbw_oMkSHOc^Zr{oto(L{0IEFo8?lkwK9ZnfugJg9V79(qzaGNRi1sJiEF#(6{T? zi$%{2oJ(-sj>(5nfr@|){Pv`zSp6i=E>n#inC<}|fPc*2!}(z*gZ$AGm+L9}Du1nS z)cybJ4f`-Z`qTZ(7oYq3i8=WTKm3-T_bBK3a;Ug#JLzpt^U_x_M*p!qq1Ds7$~G!V zq~n$URECH{%Cl9F`pxS_{-(MSiM}4H4AW(-qyCTOt$Je_ak;grq(#%YBrcpt4oN1Z zO`aI9`E)XxBI$x0-Vt>j4cy^CLnr4nlrO7bH_#z!sJ0fTafG0XHI@Z@yX)QKMv`ky%MA zY)pVeB?l^us3YI~q;zS;034K36ZJxxU}|JyVyGz&ZpGc(Mt#o3%@uuZ)dEYqfHrRJ za;%b+N=maTRK$j;WQfygqSz$bG)brIp6@JbOj#>DZqrfYt!Sc=EgDU&m=Q5VBij#D z(1&3PWFQ-bB2X!Fvj7V))FM#kuuU?9X2z`;t)dbw6=>8TqNze=sSwn!q#n77CoqBS zDsm9TR7g_NcT$v!YDJ|3{Zb1^xe9?y`@33oPpjs61-2UwwQ#m+0!xDzB=-vLAIVRq|bEmo{E$nq$sVl=0=>qMd4o>zb^^-%{i2_`8M} zw+OW3@=Gp-Spy1;Wq!Y`=D8o6Ia+pPI?~F;N4hodbzFM#j*1--(ZZeS@3K}dWG(j8 zXKc>0KCf@28hT)ez(p}2J_HhvQcSxg9TZ4014RhMR%Dj6CfcT&OKhgbw6j#Ev28}H zO_NJhX?NcsVy>DU9IWb-=!E3o?C|c+O`XDAxZhn9xJL1tzg5F#W1_F-mD6d==Cyn; z)lL+7Ji?(zeN`s;QqMOE*LvyWFwTD;FVV}8Nq^a#Mlfh$U&&WHQsrR0siFJjdlls- z=1NmC!lpEd3XE2T=bqa}D`tF2RvvD1+bPats}_`plg~)Ka;7hOy(TG1u5nYA1NINg`GflZKl)t0i5Sc;=wc@5)&0$n62mMLGEpS4vei{vN>A5NW-=l51O=S` zX6`IDRaHdkmI{97U+F{mcK&zmQ;44{6-y$G=5|A7xcd`>tXqDq3CDn(*UbY5#>O*qW@Kg9j(BZ63E*I;n?gt4FyH`_m6s= z9naapZEsGV`*X^PI-_Z`(Mo{9?mg0{Ki+{o_RN&Po_1#>s3y%-iRxUkGtg|? zVAco-HF*&ZII4#mq-#EIhRT*q*VSw&whYs3WXxZ`2?|s4j@T5?>5`HK2+X`++vOy) z^^TnmXyXYTQT+05>9=SJq>SPkEIE`HK@jC_Awr7_-leiMLd4J|8IQ_PA8sQWDht)$ z-+*^AQ>iCTCW-wTe&qK7U~8O=t6+?S$%Hy?Cl-W2L$>K+)2H_Wv_z#k){ff@!C?$H zqYHl81@s>%jN}6s0gwTA0eSZ38rtTqOBD4e`|mwXH%hs^5+ZaKDTwD)H_x2 zbFOcFNRHiacnmVjuQI&qsG87ke4({=M!MBfkZ_H>i2Bkk2^1beq@YNp%tVjtYPP{k zpl;1bzxSMobNwj8BHp`=mwDhNG|Ea5P)DjO8z!z-H%hr;qg^((Zne=2%l4B+u(3YV z`hk+j2+52#arv61m6Xw>zg5bOlS#B{llVVMh9ayKSQwGw3fP;ed^5j4=m#l*&ApoP{Pig1qi=^>-fY`}> z^Sd+seRYI$;0!DES@r~%3j&JlbsJmRL;LxCp25eU)J$VvevGOB5)d;U<0fWy>fc26 z`RF#uLlQ_N2zTcdbW(YN2G1Dksv!0(K}hrA9)rE%K8};s`Vdz)uG4~rO3_KV*J)iU z;TXfZ8UaLCr3WJR9PHtn)N~yOTtBEKy=%K*!M;)5T&ky++&r^=SnGP0QtW82zIEO8 zQ+P>L9fj)2p>zz*VKI+aO}RG8f-CwppP6HV)Da}RDjC) zdc`rGo%3h~v{BQEjPqPkh=_}=?8P>co?|Y>hh)in{Wf5n6ib?{}@-f*MWclGy`4Th5h3dfJ1^@fj&HoWO!jNSd6S zW<3)YJ^h3xO@P&SkWswT$^Wq*6IoQHq6G1{2=!RhRH;fg5W-xin24sLI&d+jC5w)- z%r=`zF&uilo7zy6B2_E1BbA(nIgK!Dz-Nz^E_>2Ll>N}m?iVDCraa-*rs_Oz2{t-# zpi?UougMh?C(d*A^7nma;&moQGow%9`FFwp0$_N6J16PG6rzcmW=Kr9A;j5h`cJo% z>Pz9o?MD=5RR30TrIZyDGUmuhAzMOUoa@mrmnSW=7hb0^m7qf~jST!)ozY$E)SfWO zo(#d{CqQ=&!9X`+ga!!tqNxb~=j-~tT{OIGHPSlP8Jqev(ZRUdrRpgU zB4ICZlu7HLdxy`ePqbUli9>fL2C_q-%D*O@#66RG2HOiZpyb}*GbaNvJz8UhVoc1Y z2TL#nq})0=Dk{XkSmekgOgZ@XoEyy=+pI@Ah&Gt2Y>QiZ5Ay~5zr7!^w$)WtUjE^J z34XBb_rGq$^UVpM?+@ATe`~e{`24@B`?T{C4dcMC`8WfT5ctUXnv>+vgZ_J^s3-hb z4tft!*Y_FqD_yvr-}?TuAK2pEwn>4T)Pazb10W4a@IBo~-YYr&(aG>7^W|!;Ij@Tj zg@Esb0Br%+E1NQ(PA;m@nvBsV9?78 zB7p)^Et-1Kj%j;hqR4!Ph*}f)7EC&)a&%42^qduwHFc$1Q;=@hsa5ZKw29i)kuXHW z$scn(wCB&-=?r4}NWNJ9&sZ|!4|9tx!OgEnsiBsUq3EQF^d`TaYZ>)6#?LVaWh%`ooE;Gm<}o zRa96mkjgN+U1p~2eLx3Nbv#dl#R8;UClAN+{i{T=w(a;K6R8hRx3UP1yBDn<6jVV8 z6*PrH54Yhl+HDY%CSVskrJB`6s0CF;AhBefL}-{~SYh1*CFjJmN}qhPcbJ6B5ovbn zQaQZBimeQENrnWg+=1KFiR10;qH3NDb6sY!wYX8CtFdpVg*ME{^_DJKR%-K4t$X2P z;d1nONOD>~QwnK-(qc)sO$`M19Oxl5L@t1nv-!ih+R4Z#AYq8sKKA1I{G+O2QUso)RFc7RDHYe0J6>|O21I$tTaMtV{}Itd1BgaMLmzUY+Ju_2yvlAtK~ zeA3?C@}*9N|2((wSEkmr3@)C{BJa=74eviz?QUq^tee-54Q5fcw-w#WiPY4~kD+ge zHLh<}Z&OwL)M<4SvxQx7lf2_~zRqlAnkqAgG?IeUqn~{KWbE|6m`x1VC#Fv%f^j}< z(jqw(#<(@PaQ3iTjXa;ANNc`O#N8o#F!9OE-!Ykt64rs1d)!i^xjB-Pl7vI;d_8UN zwX&7vB~o49rK~HjE@tyMZL7D+ect~p{XE@huCG}i;`Lsb!DauTkn_sXrb6 z7W(IWrsl4@%c_Cz4?>46c#b+1_>j(|!xSi2jYb=&!by@~&rLeYZYLRsVUSD^OAxJ1XzEQyim0rSvi* zg2@b1K8+M6?DKrlw{w`GQZvP;d#GC95q4A)g+_*{DlvxHZ>MeB^0fd%K)k=eAVb#m z&YK?A&6{T(dA;&)EhQ39ItnRH(vjV1-o#lmrZ(t%MqG8^Y%_5a7;!DO?b1@`!`-FaXrr6upXM96n;(A`Z zgOMoE#zuAU6)~QouxlD3O zn)tfQcU0Ck)@4wc_*r=|49T{oD8?wtYcjC?W*u+nA!_-Rg{{I4s*I5|`F-;^og>`v zU2;|2Ov0$M6@R-Ei?(cL%y%$;Fg(w$WO#!gFURyt^&+HH)s{}p$&1eH283TAN2})a zIzz!dXPh*=*aZKt)4ZmlC}wO+Oo@eHUFv7~#E7#{fFdcfJ^cw|(sLMdC+EWtpr_l2 ze&|URFi%n#L{lBRajp%!x@z`{qs5?&Bxe^I-kbuO!b9~Cr_bfa_NPV6O^m6-vhpdj zj56jLVLQfHC&ZFqd#E@-8iSrOIV1vveKh)%MF#&;9g0WiR86hX|KpC1GxhM{)$nDg3X3ZQz3 zKpYr=BqKb0CLRXwU&nH{*?ylz_qD0Zx9q{N@ldd{_q%81{i8uJ+CsvNhjGc|M=09iv2K}Yu3VT;;eNakd9M#v*-2unAXdnvtPp`HN>HF6gG8aG)~rhh9RRynSA_^1Sr0(y;m{5) z^PS{|9+1Q!{)Zue$V>ozEZS!>hwp!0X^bM`6m;VjO;W;E0o>1x+X}hmvTiD&5>RqQ zY5~+fBVsV2vL{4HrX&@!+M#S|zpJfh2(e>YN zz=EBgLi>KuPI>tGbuh0_dM+rY?xQvc840C_N-*t65;e(y^5$ z?`p*Pie-20gz)Q+M)l~+=*V?lT)Vis<^?=2U2jKOFV8)DEYAq?czM=)tO%P@SmTJn6$aOVOuGBlpohtF3A1{-tUT$}{(XQJN(#Fw>8IN%&3&!@k zr1gx^7cS8S)re^m(!um!o2RNQ4&|ZgGRPD^MO##wshHHX!KSU8q!@E%QoB}y$DoD7 z$-WC#LpEwffy#!ZP>j^}p*diT%#zj^x@=K-3f_oSR7_?M=%2lOv&DY=-<|t8J~)qB zZuM)2Gu?zr;?@_vXRDpEdK*-!Le_2DwF-4(%7;e~HbsS2D5Ydxr(|h0nFZrfWq2L# zLsu)i+WDg77>QlzWo(|=7*<8hDYssg?v>Rh>vaZZ`||O%vv@eT%v5!%Zc8h~>C}U_ z-BBp7G6x<#=WMPGv3KX6KBX1I*7eclDVOBy5x472!cN6j%f5VFbH0z9-^Oaz_pXcE zJJ!#Kr;6?#w;k@4LQv>o6I|c9GW%)1-(MQ*<-VY35(lW}WP%f5%$V}VSjvrH%~TO( zm36(_6ijFiBPMIg_s-=CCZ?X+CRhC>7%8e|9SYG5!Pf>F=MCDHB7&2U=S200&zNMx z)Pn?uDOL_mONYi(;e29SAzJicl({DFopoGxF`Q$Dn`rF&eN@c}Q> z-3f)04C`gi%&|~xaVQYX50Uj!1!E_wErl?qjhBWVs92D+e;k-rK9Xn1F(8A05@Zg6A2Ac!{5TAlaT0Su0IuzOEK8=Tn=Tl7;R5MX4{7^n02Oq|M`S>4) zubq7W@8{VhB!rNX5<*Bx2$!X=)wZnp`d8~0Cf@QcILmhFry&@r)j+3J)$yy>uQ}ej zy=wP}h{hspS6Y77YW8aN5fKtZ+v8W=!Y4xQ157v@Yp*NIwhfVxvNu&J%DPU1M?ZwN z?bN#r{(1c0&-?ki*6R1Iy1i>#-DYok-ro0`)}>zcz3%Fyt?zoGiZpE6(%DCw9`!_@ z2u}QwLK1$Tfk&YM;C!Jkt1TV5E8FD906;rWP6N!MFDK56o#=HUvk1F0Qs>sTZoz{A z`ScwzYd7z{e*}_AB!B<_00Zc&HnUYElQPRQQ#2777QcK0dFw(9EQS0#V4e?o(58jM zND96`nI)=8VkwC|z2}f%1RrbDLTbjyGFmrUYXIEm9gG$Qp;wL# zvM&4V(PaeBebUVaiL3ubto*bMvb4@#TZ(VfdC!($l2TJlb4Ep;mR)0saz=2qTa{64 z&-(h<>6#ocJ^P_p{lY9DMvt5IFzV4mVt3(yj08N5UnRQ*4mpWrHm@<9dh5BovpwCT z)NZ-eG!z9V?&v>fqsAXN3HTpW{?qN)zx8;;`i{>S&(eQ19~4H+Z#2#zk7wL{>`b4~ zcAZ{R56o0Pl}T1rs5s&=HV|WP^z^CqK>RO0P2A{XG~67=#64UGfn||4D!ZpesJbUSTAR5T>L5JexFT=QV*B-<5_3r21?w#P&A&sRq-a~r6`8!$JfHDk?>%d-U z!}9+(^7sOB>{MggelPC&!;|Xs`h)e7y~>W_Vb>2Zf*}u?-16#{t2Ou7vH=rJ-fvtS zN(og^4ZLS_O6UChpz#?Zlmgar`R zt9h_sKR*DLpQz;$3%R-=ctIM;;Hr7JNiTIFG(8jjRwi68NK0wGB~2Q`kjtok5rKS% za4(jAF9TsWX`jXFP&0Nw7~*ocg(nZ>cH{VmYkle172TwP$$sK5?PvV-_X)Pv3Vrg* z7~hj)Z`kTKPdF-nZ_VgGh988?Uok}a!TZ;ZoN1Y_w?0*^&5j;F|c*|s*CJ| zgE-af5ACVnl4liuHg8-aOhq-TNZ6n;)Gg7+RmH24d2`FX8NKftiN=Z6I9re4?mb4& z;`ayheg6k1;N?emmuhKa@WtD3N2v^CzbEqkPu@eiKo8ga-Tq%``u}HJ+TJn;v#(~a zKwQTrVupf{q+o%g;r?GIpSKF+Pq_I6+3PM62bvb32Y8B&!1^#4!L*5dC+hu^c1q4| zE;Jdm|B(IQmS`eIy`-uE`pT-HXqi=AG{4kuWQ_hlIDF~6dw!;a(eY*5!@&A9j@cA$ zvNl;ay5p068>#WjAjW z?zaBLTg9Tpg#FjMQ&Fh>1mwJF#58rV&}fQUXrZGH?*TAm*^lzsBUBqEe%tRrgs$%1+((*u}fA%{%8uaT;xpKXl z<}?`cy6ugP1k0AL>#cIL1f-&7tdynNa@#hWOH8qeDAQFVlo;$Y%^V!9D>rn_dnYrF z4PB3Uhp|(b|0EwIy%21IZAV;-h(+w513z`V%()fFeCTJ_?aq(AB#4gbY!pN6=DAHU z2Lw%+34=M%a%-A~6Mo~JPz|8cTM&ojI!c9PRJ$1hp(uu$Oe+lE25}%752FEl&Mexf z5+@s7u7hhMj;IT>FwrW?0l&Z=KhVk2Ntih7Bzn{{4dFc~{R+EerLjUKqHiTFP9w57 zs7^;=Ow?v2#mpu(q~IoQh#;swhCju8enQ?OyqLs$yzEwr(NI(~AQJnb#$@ibW3r35 zRCIS&XYg_BTbg+xL$`|)ZdsEZ-NR-YcC~f8(W|HBm3H~E9%*ROd?JfAcayDfn00^T z-&h(bbnALi_cz=&k11&)?~qY)`aD=^BSDLUep{__*Ix-@i$;h{*-0{!DQ0J1ReiRl z_R7l@DjNtj%K8Vdr>Gh_>X3MoQJ9s^xuk%oNB3jNU-{AlLiI>FAd->Qn1Yt6Hs676 zV&`d5v9C*sg~%5OR+SA%YNTBsxA=e2zkRJ{|IvUS!fWv#Z}@q1A2-j44{V)~i$p=% zlST`4+|`+DuI-a;JF8KwNEi_iBufyGNCrvw7VVM+2}qFxM^z!j0a};5CQI%D0X`rP zgA|jcQk16PGD;q!bFyE2rx1tkluo@FK*R{p4J9a2qt@KJj^_BH zb0oaGyg3o}7>5vgU(6q~sK7qy54=P- z$vl4>3?_iv|tI=Jr(C@Jpls4dlZ-LCkuGKlm$a7h-s+~~USNazq zlGYl}dLaL!k)UJ5u8JTipqeE)K?bUz-9PGh@8mf(!bZmPbzJzyKZ)~QT$VwadbsbU zXg*Q3H{>*VCUxZDS-f*kknPCO8emkYh|!@Pp1v=eQ>aGkbBtGOwg+zff;jyj#X2|E zQPu-s&v=g5lYN6^P1Y#i$>^QtUtC&)n#`ltrmhk0wR_gy7g_D*8eH$@t+v*)s(nx0 z=4DlPrS*KTbGP4Pofj6|chSvWZOv*EbbPaf+RZAGz0DxA?a-HqJ^S_FqqMrO2|T5J z=q*r@Mu`c9EGsGMqR>~e?e-Yb)9Q7~ZPajs5mhx8xg9*5zgWBWAkp_IXA>7@N>^#! zr8T~pC2ma8MryUBs&Qh0OV;)KS+pdKJBoYI+d!IT{MM?BCaJtE>WeQNRODsk%aF=+ zW?`2yoknI=TX$tll39Z+sv@%wvkL4yTSF5_(-duzA$WoYX8Vu@lLvzW7~H6!Wx$Xy za5?3nW8>|JE4aUTq|(etf<^prr;Z7S?0^sNZ^?hxGhEEO z|7SnHXW*YRB~SAY<`#u)Y-2-WVqrVFMrl8nBVCOUyEi{ul0n$iBl&m9pd|};gns#d+ovv97 zCL4nXR;p_po&QJAYEp8foRnf244LLa`)P*#SqR1Xr!5ej6uobBwOY+yzQvy;<_$E= zFn@L_K@=y#Y{kW)E-SqKFmr=JjGLPQ=Ry)1Hek9A2F@eoOkW7n_&<}*l1D@iae$mi z0SwV3bt;Lz%+1hzCR<$I{u#Y_z3{Ljc?URwF(CU3;p9RAMhxS5SMEaQR{Frky)$OmA9^(+G?t zLzN)p;Lo}>z5;mKQe@@LYbHkvJK_udGKZK#ucy|Nof8i4qx^WMQnUabZz|$3Efj=B z2uvh1ay^^vf9ayhOx-kTg7kXQqBMgq>lO?o-#i+4{O7_VZ5b?JEUr4*9?j~x#z9y)|^i;aCUI`Hnl733WAfk zQT#8GWaEc|*dy_$LsN~&_%tq~e?2ZrUnQTntPscVK;fWD@@en}(Sd+20hq@_SW10# z8u)z&594A#7e3S7&ccY2XzJ~>hONO^sJUed?QRNn_g(fZCkl(WP|Rr1NeSFS{3jNf zQ7Zs6#Lf4bP%tnC&_8)5M?vl2{C(dCk<0K0rz`BLs7{lN2|J>vuda^1<#*%YQ8n<( zBRW2>wsOjhiVR?=cNLC&e%wzjHpZ`Jw#^ArDG8zw!^tWapK(|)qW_!secHRWRm1qb zhr|hh-!5iJwP3k!r=sC-p$jK*0%0-1lMxIIKr&{6$@#7L_N}5MK_~kcL1<{9j}Y@3*zofgfrov83@}WaEV3*imxLq?UXGhdAVeP5HS1%zCmyIajt!P zr9`?aRTIcqQ=K~;Q!KHnW>buL2wPOk#uzm+L%7UbO_`H#b;+bO?BEJ%Oj9eIVY8&# z)VRW`4m7M+WaCxB-#NS5+525Ob839(~Ej1G-z@;Ci_CmB&?X^&U$kFDoCn zkH+^3y$|1-sU}b!4lRZ@yynW=T3b&b*DF4tf^{ahO><6V;e@Ku(G^wVA)Y? zhcuCuoo4m*_gI$CQndPb^ya6>(s0fYB&Vrk+pL!6N^Se|G2?wZsn+XQ^&y(atqimK zEeEfTl^on&Vb+>1+ikfIhBl=U%`B_Bx)n4DuEcO5gdH!kvLhCQ+vZ1R!}6~+oB8LR z2PTf?F)WD^)A!dRYG8RIH#(VZ* zgD_(_HDxHeTUD$XLB|P{CL)Cgy(Rt*|0}ln8#+p>xZBHi9C?j6 z^$EDKW*7Gyeo5F;aHdJKt$xRH-d&7xYYz2i)uz_B(nvf_3A8*gdikccOB8gFaiEGJ zpvVB?QNfE?MAF2boQFS9-HvtSm)0O*dnycvgQ zzePI_$)bmGIyE8*5ed-53_O0;-1z)jO%P!xm+1>0&zsTL$(8d&p++Ex6l5~y@8?_HKr^@MQNun7Fm?XInKn@P|LMLDeA{xaLgV9W~GDVV8w>=cM~Jaajr2su!cGCCyDEM)^PETYF_JVp`ti(psD zDWWyA{OE$3b?|FU&^Vqh(xu{aEcTI3ROMCU+rei-*c~A|>SpRwS~Qw&q5b=eZM_h- zKUYW{OJ!7UFe@u740bty1`vcstx1yVGGZP_F&U611F_l08bE_tj=;q{hdzm@APa-f zg!9E;xj9fhlkY#&`g{B@a0eMw_Z}Z;v+CIoICm0c0PQ=u+k7N9JwFvn_t{Op6gRqA zme8;yCdrtYMIi;mB5@@M=83!}gHM|sKi`s(dC4fp_>ylw8hYoC)$?7{r;`o6b4D5E z*fqF3`{j1+_rjN&j`lieuG_62ULvj-(@owT?A~3KO)X2xRdBO^T^ViWt?shbzKVef z5v^f4Hdi9rsBDux*DPkQqiUGC=8f*BJACWcuMTo*y0u3KRf1|sD(d;ySko7pYmzis z(zus^R_1#RV%KtNdD9zhixfZ*3it=$GXf}L3J>cXJskLN?qtO~Z85I_pxBPDw&8j* z=f94#C(-r zX->YLmn_)`e3Q-^`c-Jy#w=ro?9|PvP?uf0XvwPbmAY8Lq>UywUar;PjRVl}GMy2S zuj-BJ}xZ&csHL%o8}!GBxr>llZ$mY^G0{^ow4 z>6F?(u}XgJ4Tob#=<>Re5R)sRB$+m$__yca9!TTPA)W-}2?nNdb7&R z*&F`_DQi0dVi1xdB&5tqBQyf~a+a2D8L&s8f#X9DAd>-%JUu^ljSUADe7!vRI|rw( zM>Cxp{6BgSq(V6X{kb15q>w*T-JGbFTWn>vf{iVrjfE{0v=HlHbUV1equ_Ib!}(T` zNGuPzGHcf)$ae^nG18S0h7HDoN9+6IgCxla^zk2`M@&&gRrMUe<^3QcaB~Vnx>SE* zpfVy4uD~jvjYp@ukLB#|@u|z57xIH2Va(Tx`F(JE0{*h6OMFQjAaz;k4OIw7w7fJw z>)g)BC^VZ+h(U;FS{Z+<^f%*rG#pjs_WQP{J2khz>^N&TS%B zx=*cDJvLDYiW)2K))OmmjMHP(jbtbikb;3WXGs_McsMl46Xr8_IoJ@fG*uFC^*MzR z8Qtelh|WfOJE+e7fjJ)Dsr!?XjU5N+8Gv{t4<3Gv>Fj&7b?Tf*Hpu9Y8#87(TY?Qd zs@A)Ba!DkdZa{6p#mF*#WUqpCFzKY@!s1c0LCGRVw#Y*WOkp0HEFhrwhrKD`*9^rF z&`U(I1YU4qa;A|UG+o@Ylo# zUzjqo!u-HtTQ33@eZ^&~Xh~YLztmsUBV*_E;RTw(X-Qyhc z4-9*8KLCO8bxo&{lu|d-E+43#yiS!Ij1h%OBny9bwmAGA5Rp~ZXE^6iL_0)PrADnP zWqMTY@|c`w06)?}uAb2$corK@zTY-zl4z5|Gron`7r_HE?<7L>d;fIQJCk2j)Gb#5 zS;9zYrD}wvNM%|9GBrl^t=5*S#8%wpx@tAu*Mr4HiqP{z(gjbV0)rAxXTgpm)hkSd z`6Tc94>RRN`(J-9XXd(YwliC1v}%c3<=U(J9#IEw^EH~d>`@xit!rA3GgDgB$U8Ka zrIg&!r1JIym(2PRD6-pcY=f}wj!y@oIumw~hYo;osF7RN8fhFn-P5$;C;7T(MRju0 zxG6F8B~CUu?sQ_PoV^L6DuN14y$d3GYNUx$^kK;zcIHi8DB7g9)>Sr?*F*4_eI!3& zDk~9IL_uOjIeuIa`r?R@AG#mUqvq2^#~M(2TB;xIxCev-+7h0I?hy#`b_bx@t$p!on+Te$8KA@P0(!SQo#Ss zKPdGB$+%@>fT#@RAA~4Uv0)2YBep)h2kp04~ zknKK}Q-Jh$gJM+@kiC35c^D=xonQ1aj6=|XaytWQLVPpw^la)+ICWC4gEEGYq|mR^ zY)>ffO?i5^6k-H?5C>J_CVt-v)44qEix!4*=j-y~Uf!kkavDu-Y0Cr<7n&@+*xP*-aP0=ahM20`r zMFpXs5F&CW+t=F;_)7mzUn1z>>NTfYU(`mJ;PEORk$O{WH_a6Lx#xgmnWPMn^6z9H zxXnWfgeP3R{RM)wvWeUxAbC?YHxk$$p_0rf5n;!JVk{6Z0V?@G;m(7vnK>S>Id>8Ala%z#tyQuE|` z(DWpl9~06YrzsRhWxruPA2j-dCF_hyDk@DAVi79N{}6SbIpyi(ovrG$t@%%_B;WQ` z9{}cLJgB6oy`EC+JUD3E)dG@H5lE64ewZB&g#-d#K$skI8XKE@;3_6-0oQPI;z(=b zG$t^C!JM3-;OqR-KBT?G^lK@ad=5INOrcgKluG)*(c(;mN44bG1B|#Ao*pg?{NnsPR8WDS-u0RV@UsK%Ux6GOVN0_2@qtzfu$yH z0sIb)FX}lS-*TUipXLO*N;y${zo*~8pX3QYi8t_{c=u&-iyX{ANv6VK9kLQ3j^3_^ za$p*At6#SNfAY;b)fF33E4iATywMGzmAS+mhvB}1zvTvvfEuAE*wsT+qMW5ruMKZm zhHtsoej+BAs+uY$Mj4|7)``33^Wog|+r*f~J7->ahD=c=?;c(q-9>Wo#46!J#-gH# znVD@^shMzcw_31golVcB_5Z*~TSO*}y`nsZi3(;m!LCl@Fx<@JX z!8OcH zX@|(-RN8~qJgcb@4|oDU0KN~B3WV8!2!I@fhHU`?5{KRipuBEIB%#rW51z`ev!!1( zL2;MWOLwRkV55!$e-}Wl3_@BO5fM_H1Pt^TbK|V`N45I6KNVM#571^0;?F;0<&N;^ z(lR~J4GYnjsps(Cn~fU7)?R@_GX&bd3b|5*#mwgCf+)F)0}b3WCZw3sW^txj_uGXi zi=zf?F_THFhcQ9FQY?~WfH{<3O=9HUdvrc2A>Bx^FNEy+@`N9)WogGD6X(Y19{%2< zgQT$|KS0opr`)%TPpSzb#GUuWl5870Lq?4A;kJqAYo7*+LDv_>9r8x5*6zW#?V)(p z2HHv+_HHL?Yq9!oEXs_V(`=*3vDM<;c88kIT|?1h99OyLFEzhZw)s>MwNc`#q;xc| zVy4mFzlybyq3@yi#hc@rM#9fWt(&|ydA@2Hzgh|wYMK`1Prm^xLIxUk)ETj*LgCR6 zxYtFm@}DNjp=s6`8(QLX#LP!H)|X{TM3e1XDj;`q#Ip5um713;1S9R#^*vm7-sl~V z-AeV;=e;`DnbYQfldiML@7B@QeyLP^*CVxW>7PoTdE+R2aPZTli2J*%dhq>-M&y&6Z@1%bovnyzXUbbEJqM3U5Bhzo!x`BoYl9t;t_ zjgHPFB)#_S(#KDQ^-Y^i52=oi5*>ga<`u+b(kGy{h}38AwP_pg?)ukZ?fyLP(=%P! zwU8v4>0pI3i^w|t#2|imoc#Vdvf)-tI=r4T9UQ@XW`Q3(b`Ks~mu-?Z@Mtq&aHe$L zV9sJ1Hlg|;e`JB!LLGBN5&_Sdfd3f+J0>Iek5TL%!*e8(fJi@O6zq_2_~t00 z8Bj>n=p-R84xSgkr8AcTTIHQH<@XM8<%5_^9a$J)QkJ#ab@lZXA9>zQ-NYi#58jDau-)g} zWiB+@+T}+lDV0fraE}~deNvcx$LADbKT+fS*M#;Gq2-g$%+hN0*bXvg`ZSU5{s)qY z_&f(km-2x`Qz&3iNgz&!ExX zgKwosL_-nj9vxYNDl3H)@Q>+V>T9L#i{8!}B$CNIp%Fyzh-tKqqD)N%F-kia-lLSo zNMLPVJ1mo`*=}60murM0LaeUrvE`JSY?3;G9z{!61~o>RY>Znx5U&O(VeCQ_4cO$2 zF?_2bs_g7urchBfoAA;>Qq7Y@A~*FD)w49yHA|k_j);2M=G1o}kI|ye?Jtq&wBf*}e$sEUR(>F86uP6(@7k9SO z($rMwQ+EWACt}z3;|%xY==D`OM&s=@`!-+ z+kUAi)EN{}QHyQF;!zBcq?GhzWtH5!YGo)zUAb?^zklzcXjHJ1*UT z6MvEurvn8W4v?!`wbbNsk(|gw6hk+8aiV`m(S~l7w$!%DBHL*OB8tRVD2l}dS>a%o z!fq#a(5woscXuM~d7oRlX!dI6gtAejyo3g>iu&1mXi?i0JxW~Aqb^hZ69OpY-C}qWmZOOY zBRGY05PPNpy{cu3gRGDw(T<`U2Og96Bt2Pm{4av0 z_{lOlfY5`Ipix3ltimn^bKi#z5t&5=JF)s=ZM5UM0(tlQ6CahUh4_|w55MW(-8Xg} z3DfE9a+BCD)}_`sh7GGm9QzRbt+vLz561jjKA@tL%9i&@@|jP=oGU$RTS|WyonaeE z{=ze^YG51PDjzNVD){S#=7XXCIa!-}CpWTTX6KK~y~%$S9GvEl>eLMML3OCz{?1)- z`CHw-x!1o%>FeGD08d*WWkmtGkDkc~f1I-IDT#r6p?m}L|YWp1ID zVXBVYbuH5%?cp31<~&Zs$lNuGuQAOzj!MaNC%5!S{vPxEF}$BVGBGdVm7~2O3Cf!d zkTyr{8~8uR=g-{Dp7zb4cVsh9X92$~x@lKu5)!c}sQnbv2|Dk$(s{9+0sKtq3?X#H4`<44sVqFfjw$`uqBO6|D3cBJCxl)Bm4 zY}`>f=V&!mJ`s&5F+gRDY&2^M$)=8muleDO?z|EV z7wqYS<>O)R39KueaZW0Q0t&mRC&Ks z#P}b@(&X=hyW#Iw>j*`9B^F2z=Z{IIJkVi;AInhs34goUgjsH8g+L z37r1@;38s#6x7vBn}(S6uX6`Ro>`F5lTnXODHqcwNL$AsIRf7fga`4M>?Plo=yM04#OyL8b)v&-bwEiG8}kUh?kr zm(Eb?Uq$x8T49HZdPDQD|ARsUrUkSfFj{C^`@{R+f0wql_%G(#`P*+1F=h%S3ldra zjk6@i!CQSVovQI_kg-8bO){vlwu>g(4Hk=1iETw%G?O-{iV95;iDF||iyA7Z+Qm_7 zF&e2^s#+A4Ux(~>l-n99Vr`VwGX;%fRE90L)4rYFMrul^)S5L$B_PO^7rWOae~wc7 zl$WfhT6^U~_I#g(I2IF2x(J8=W#=p8d#ZQyrX-UkJJqtAA<6STRZ!TQej0b41dD&Q z>E9c3C}$BoZ%_G3)sLc{_-Ur=g4kzwkoSOp2_-M?dQx4reL8nZ6LHD1y%tBsabNDx zsX}L~)eXt~f7$=FI^N($uPpHsHd68Yi&* zzRX`DeY#%v|2CtZ+K+4>aT(k`_y_+&tQ;wC_wlVBxbyJ08n^pdcG9HjGCzt?nEuAi zw~v?X@9T;Gxl&(jr_kwCkBy-AX@Oc&xwseLDJ8%3x@tzv}}%uu1<0DH>~x;OXkRDiMX z+qQ^oTK_zB%9vk9$MWg0X}4+z;hLrRGtcy|(R4|ng__e!l8%)>t{y7W zNc8Kw?WcxeMpDEA_9_veu+=4 zk$rzJzh2khuc}h|KVQ{pf%jYAfB6a2IoNLD86> zC=YycFG&q4`YdRFxEO%yQTwc@9Fb2XfyfO=4rPImBao2?l9xv_zJb7W(*9=LEh;T3+0gWu=>wdC z#3FKrP?aW>fFh)fpzCW)D1a!|moZ`OR%W3>(Bmd888Tt_ugUtSm-I8}?yXnY+gm28 zO^SlwJc{QdFl2`-Tcj0fD@AG)ENob*j_ZY`3nNM?T`ui)+Njz|X=6sU5mmolw^uIK z(=8-YNix;By8hzow@8gtZH-spTDlD4vZqq@pv8R+r7X%C2oqUsl1R%+l#HasB+yfO(Hz`E z2Z#V#LvTNAhtK9Nc;T8EF*ZTO*(fi=jXTW;S>41*ztZO_WU)8 zqn`G=>Xtb29HHeE3E+p393VU2$b8HIdhm7~A<-e=k%%J%powWw5i}j0K3x!hi9TcS z_x)SEI759C%R4F|bx-Jd^Ad4E^&c5kI~H7COX0&g3G0zc~>ONMux!3m@BEtzEMQw~Fc( zy)@q?P(;c*8G*A6E>I>RU_^~01gVgetC2z>sY4}`O%#gg%)y@hz{;6N21nH37wziHd?-U{y0DCI~=DrW7<-Q~@&g(T2&npE=s zBguL9cF><92jYLIz&>TTHWC+JAFdbLE!>}6#8EQ-B1uUXU#Dh+N^*oe&-WDeBjf25 z1Hh4%|DX>t^6*7dx$SUZtV5u|K?(-nY$$9$Rnb0zZ{Wei5RaT7<`JPu4?G7JI)kCA z4}f2pOFpAPpoY2KZ|<>@1c8(kOr$_i6rs#9#e>UXgt$pT5WopNTM&fOi2xX1C`>hi zIEy?aCXHZ?07(m?14%j(rQ=NWj4!Z2*K;!rEHcto9f#r8XdfzeC%yQ;e+X^0P+1p> z=TXKiE*XlFvIkOCJ1#cv?ycd9|Hqb8VV~`4tw!zZLHQm*Uz#NwR7&lS`y~htn@AfA zwI;g=9eE*HZ9zYt<`x2+AiCCb_L=!)Pm%SQ8f2Ij7zmL9`}6RW(i9X+0BRqs#U=Io z(c~J%XPQhqzHp6TqvS0eE5& zD0RpmiZOm^5~L22KrT!EnV_IU{PH1z2||=8o@re|_(((=osluTF&Y%hM6M8uJpn6K zd77>1URyd~iy1bgY*+)7>$dvq_p>4MJ`eG)QD1QUtIp1jN$0f1Fo(O*@YJ2+7GdtMD6zq_hXo&Coku^*jJOhtxbC zCQft!Orl``$!HEe{}=lRTYc=5LOatQxQSKho+wXOKS?U!uTaS_p|)j4QyWZoa@{m1 zWx}}lX4zGst$%{ZQodQHk-Ui0T6LE<$R!3zL8FEeSYd`5%@8I85J)VQPD)PEmWf#i zgBn*@h)qktgliQ_1``A(Km>5Da1WM4*oTH-zE&=?_3nY_W-^pKxy&j}a(h-%c zX)JA`#VHjUWmJnkNCKWbfj~Ww!9Bs@iijX0A!3LcB)X?EJ^x-ew<*+Y_V?vVq38vB3+p;m<$BqqQ;UENT?h2Q$etB6HQlUUlg-|6dv}!1}H5$gmn?+GlTT!%asVde@Vk;V>Vzu-w z&9#k`qRlLAip3V@HMy-S*|i&ECW#3QR-&^hH6gTXB`q?Qg4mj)Q)?!&U`7^Dm|vjt zD6VQ~proWt83h_x$)NVy`+WY6{z3NF^`Q_yKR~Gqe8wR; z)~jApnK7o)i!CXX0LkW$=M4u^sQFJMvJlfTKqUg2MCCvRX`qw<8Q~MvEFR~^7x1u9 z&XC-L5|bjo>J#R~HmSt@!Rgc5GM$fLYvzxu{3b8;wVxq%spI%{hzP;M=6aw?6TVET z10f88GZQ31^D?LDNL|Q%B`GTL3C7UDP&5p)0G-UZx&stpApqbQK{=M{KrXCB>17c1 zr&4-hFnt(I=#cETfgpdcxCb9(aVbE*l1J>7O-l5roXAe{`Cu1RD}8@$8hsY@d% zDH|CWzRGl?BxtsZN+D8$n3@Ka8Ww_E$%43}M$1i=O4+2I6J!8EK)$~K+)3~8MF@F*_2!Vq6l!uFPIu1P5PNH6spJMrCvgIx zM|n8qc?v7^Ax%@oor?E}ZK`hlt9*?HY@@m?D=S&g$>#GCiRbo7^d&%fKI_^d2g!uS zocQ&r@nL*#>uEwD7^wlDi|@e<7r);DK4`&XgJ=xv~ z+VmZPv4Ui2T1shwu0dZwR(_Y~?3wsSz32z=58ja~6q?Bk`mOUADZZ;)_&SwMO)3-w zeI4E6e$NO}bktnU-K(89N+RuKuww;ZB8W(e*uqLQEHOzmguxR@h?J6rHkMmSun596nIv0k z6wwMKlEBK4NP!Y4RT?OkNCgdm%%e~!N|J<17_cTRx%xc*-taZ7V#acD2xYIXqeg>n zI7I^?9>haO1QV+aP~h`+EBB*{6z$ClE+CN1ff@-d6XG^wKQY0yd3-*)04W^z=8svagdw3NfS-#|Gb9{?n@cQ* zLWz9y_LJ=NTh%Xae+_0PBp`xExCq3-JDrIzM~Jt-+(x9{o!yvfhNq1>JTKh$`( z9s%|Wc?w2AA_0(x%wj<}B=qoe-S*IQoIAz-!=bBn)Zht%Ko*<&%cql7F5 zH*lUt;h~xs%6(Nm+JY!!w}ug3^-Zf_thkp$3wJuwed*Q@0-1tKlQ9BGG0$5$&2cSl znoVE%^B7)-?U87LpF>_2mg=PNN&_f`~Y$huP6D%DWa+D~X@Cmw03kEQW=!_yPXAogfbcQg?2n`n06iC5QN}7!z zz``Lw)2uLUlh!~9kkc2QwL$6MZG;t%2qQL7g)zZLzkulR(l(eN7<67A|#=ZA{c5^7?v|4z?jqwOKi~DWMs5qHJ~w6&{S0c*QV_7PM*ARwc%k~ zv6gl`{52r+Fvy(2!7>LW010!iYIExnf{>;l?8PxkV2}wUvXrvgO=Qz8MzphPOa&xT z1Y_4ba`Q?gT3VHRsnbPZh~Hza7dXk?iA^@FW;nBfvWf`roYbwX$-<#>T5aRn0N&ko zbQ36e$pci+Ra!MSO@}a;wga$ zgn)7vhz&x*aI$WOE|@52Q*BTbF|ojdd*vKz%NX|cR;VM%Uiw*N4JN{=rWqPk)NY|- z=D9^FJG&xM?(EdS7dK8an5d@h zvaZCgyI3Pomr~tc&8^;An_Sf!MNX~MTQ*g$mDMe|R2bC5S5((kEqiHgde~#$4Ui;5 zae$5}P|7qs!&Ty#n$lLS8Otc7#?pbxAft{qBsVVTg1Fwa zIwT^{q@pJ6Tf+k-B5NZdjKer_2n}<{51RAC@jQe_U6X2bFRDoZ%1S41FoHb}Y5D`l z`^Y>Y%0XV0ANT?3eZObF_U>@k&AL60Hl-Msz>^f9roHk%kbmD7`A#fQvb9v?u#>z- z9)+NpiPJD*&ksZ?ucV~d`z#MJhOqj7 zpZ#6C)$T}rrEaCGBIpcYKum(XrpBzjHJ_3 zYSjq>N~ENt2_k+$S3t@zKNIv^!RT~}fSMy*!?h$aT>ufHGei!9SPD{L`Uo7^ z#+O4H1tWlV7#b65Cdtr}gcv|tP&A{UVTo8FIezv5!Pg!t`^&4LtI)c)Z>KIu_1 zK*%XUGPP)}wT#Lvn!PsMg4Ix^0ZhOdm>{G-7j6f*k9>5mX-Wj%TIwP@!b$@Yey#*U zfjmf?`hV6NUTMpLzp{SL0pr-7NBwXV4~IVoyH)U-r8bExB~_x-VxldL6-p^4+QnGW zWhIe_T9Tp&RXB=QA%U}EQc7(|&1$i$S1yD}RH0aqB_bt4m7#oqN|;(z;qsa^9wHP# zAC$o0IsG3=q5XH|kHsPV9#aowWRx*bh4}g5sUOB3gnP~XH^mwcrT2eCAc42d=tzL2 zW5X8^)FbB5hYD$07eM{4B4|-ph4(?OO%t<=gd)Nyw{&UwVLsB6XeiXCX_Tb=7-svZK2xvX-w_HDFR?7 z#ZMODXK*z5{@eOgIukMSQG05I%Mmwfmfq2j0`0GYWwf||0qIl5_gbqN6P5k520dGm z;$p>3sx2aXVPz5@4QU`nk&;l#)Y-0*5EQX&=_HduNKIh|_K@{kb{x_Z8f_qPAe??v z4^MrqdGuV?PlsBV4Aw;NEQF3w4i%if-2mpkN;bBOt6P;Lj(wLZb0T@CWb4~h6(^O z5sXUtu;o}|{GsSL;PfmL2JY?xt>}XiD+3Ks=)qHlK%p1uiJqQ*TG@Q8F2V$<>~HhO zgq;W_6XNvYD{%eH+fC!)IYyd4&3b5$86Jzu zT`=9n{@3|oy}@(q6nw9hjo&VZ)+(A8x&!R;uKo-N43{S5*Cj6{a#SISsEH*;iDEEt_hS5hWBAD3KH(+6+X)L};LsY;8(p zw4tObvqq~eX_i)+*ux=8rWp{VszFF07-fJUkw!+NMHt&+Wi(nbl8~XARVa&6Z6ZlY zZL-s7t4!HoX;P@Dkb^Q+D**_|Br3vMn^M+mP^GDv0V%5zwARg)q}J53X-yR+W`@wx zMpX zw1mQ{V`E9Q!tLFwS7$ZZ&aSaD6|o_lj94UO2t_D%NwN|H2tr^%L3!MCg_uzZgS=*tHoUb3GKZJji;_@EO{`Rv7n)qy#TQh$Mxwf0*s->vzhgHlD*Rx3 z{ICiMjOS0oZ?Y6c3B=w;BAF?oG9FH!ydWOs`0q&fpMi<(KYSbRt_LDieAwZ17;HL- zDgb+Xy#dEl5yFAqf}K7;c=DK#XjGUO2?ZpoifyGqZM3zaQH`lln<=fDg{h@#n-oMO zHbXR{M#@&JB4pGBEKFgMB$X*?Qrb%`8fs-?jb>DASj@D|0ivb^SY(kqlvDq2et6@o zdV}bm>50%0_eakHEg=#8(9+ZJS@ZG~?U0rNDMqcmHO-?mnPw46 zQCn*5SGK^i%+K$F@|`5LE)uKg}VMjKI)Gc@8iJWrjgT zE;eC{LzO~!0p;t#GEmZ-NyA|n(^Sm(8n(M3{dtLa3Nht-JAF7x3^}1-Wiccc05LJS zsy=1rZOoKH1$lQSF-$_85{yZZ5oPS=2ILGQ+U7P%x|AYJkK2RSc}dS6GeT_h#P6G= z;+u59(`_JQ7Ht1vlyRMb>H-czECYrpR452Gz%4U6nbfS&A(bJ-1WJLcArQ$^B=FAV zCf1;?@_O(K(&>2Um^M5(N^9h68jXAa(h;xM*rj|m(XS|=>cQ$SU6oaGs5&I`B%$c% zoXIqZORxlvBiRFx1Tc8v0|jaQFTd;MlM`91GHPU+sH*jILMOEPXfe&NvsM{PF)HPf z>XZ~ksMe7mSqJDybskcv`{WSjRa4l$pG*d2-HcQ0b<3xafbLM2;M$AS-ZtOPq9P(9 zB1rSL)vCvpsO4HMzJxv|8buZLOqAm?{-v_l2enAhF<6SbbfF4IoGO7nZhfqd76sK}<;$_nq3T z)^A(VhULa&gB*7nsUg-dbz!4$2yS%30OG1bSi+J93IS>>%8eLY3ZfOz=8-cAgk+in zMnN)S4ne>uQ%W2es3t=l39yxt2T~ZoTX;pqF#-*S$A>|*9SMkJ7_dpBYqb|)u`&k~ zz|ywTf*sw}W>aLh7z|+64l^z}S#7&G(;Q@Jc#MpfCnp>*S45z5Y;B(2-hjr{Ax1Qo zh@_T*mO_fkhQTG1+%M4AI(fJhm+Bqi6+_rZ8Y zKG8nVj$a_a5L@T&#qoS~jUxA6h~Q3Y{r({8cRBT#*G9Y=| zp)+k&otIfEg-aK;*@>BObZ9E&BVAw`GO4DjQqyAGEN+A{IOWZe%!afI3K%`9qgE{0 zD}!CI1h^M4#1(eABZ{rIF(BF=Q#4 zV>6Oqj<+(dA|>QEDW;}O%eJB>7?jaUS``xn8ls@%a_Y>;RI!(Q4V?lSY_eMzR=H_{ z#guIqdo__@(&)-#hz&{Ek6l!Ia!L%60>&4}GYoYAdhKt8pjEqJ~ z6q-y%D5hK!5d_GEVRDVza;}+8-5ru-oz>Gu#0DNWi(VvNdhK~Kp+Q{>Z5kuC+A?WH z1yq~p$$}~|O;B5GTrzKgVknH&m6>tYn^iJdSyV!ZEtXM38FJ!1b4bH9nNlhZG6lBE zzUdHnq(X(lvJs8siHsHU6x%_MNXc|i+*aXP4NbNytj%b#z-E$Q!m3MU1a#C_LQJPb zm!wMR-ZE|Bwkv&Bi;P(V8FWG5TWoSu5yn;u))rh;44{L$S4G|?1{oHJh9-A9(&99lH@iqHmpme6Opwa%cX5f5YBHvDU}X~98BQiPUD=IgWe%9+ z9z$3NmLyvO*dt5}XtOmz8DwZRP;_cKvu+oyP*50y@r^|>WI3WqMp#`d!p;n|>c$+Q zZ78J=W0h5nvD?*Aos%^3HVx}ihTO~D=f*V-}0{~2Mn9Ml?a=Pbr zaYnXFM%cN-E}fz_q)HJXn%t)C*x9;r>qJBv+U{(0%88JLnU->Q9UyW`!m@&f<#fX; zCX-`)CW?9{Lh9>mwQ;6184wK@8;ahv?hIu>wn(5N%A-kyrke|tX0sN}O07)+WmXB5 zqSB{r838Tn3lfhg(V~*80FX%n8e@8cEw~ijK}b+3vq75H^~Bbkz_GU43&CSdG*MTU zVy5UUk_>Fi(JunHz}`S|V=r*5r&idC)fV1MG(r%uP_#N|jJBgf zES3~iEJgJ2C|5?TdX1`RZBSWPV{C2^Of5X&0g_W7Lrfh4UDC;yQPpx| zkeel#id0>Y;xuWPq)p;MgvpW7nJVCH$~AP&4Mf0(OtuBWEKsqfdMJ3VD2WtB3akkv zmL+OpT$IyiEW=8vtQR;n8+XnmM;cAYMOd0*n5H0#5-E1W5^~hc)JcHhg~6$aVOh0^ z?Y4neHmPY?3QS}-6(Mz+mx3|^w>ndv3rKH_HxDf~*IEp`E+|YH2FRkaVojv*Di#fs zE57DCgEhld7 zB~CgY9j8zvHAPc7B6Jj-<($sp#tQFsYUJmg1WZXL=UXwGX%P&SToy-Qa103oIcA+z zN;MEVmD3avtk_S0}C;V(Nw4!NKk|+Iv8t^7)aa4OQGj9 ztqei3M_eh5T4W^DM!?t5$e~+F{^IF3wtd?j7GL;a4oLf z2{RL9Y%L9{q=L&;ZG={cnkXtE(j`#TxhmARNzgGsm2j4*9hTsN;HWAxM&hPLE~%?S zA!XgD4#J28fn}*K%DOJ>wG~w>E{ajIuH_6+j;#)mm#5$bz+qrExKhc zn@MKmWV?2=bhd^VWk^PXc@D>k;Y#Qp<6mPKg*?^(VTbet)KZ!%-;&p)ak({sDmPjjK(q6=3SJdSgj+gAB@K7q*? z{+rrOPsI_Z_T^tdFQ4Zj=qMkcfl|SC;)`^pHiE7*Y%+1P-Ex zl3g29GL)c*2$mB;93Yw$B8O=xGC)EQI0uk?IzC?<_v_n7U_sEB3UUOMMM6r(ioy3k zH|LWXn3H`jvH|*_aQTvY!{A<%-XNWT1%H+P+Q~CBEHTKdHG`*9Xk&i<@7*b;s;~^r zxyUyprjIWlhnak$sC=6}e;#_kJj$IC!AlDIC6#4zBmkjgAP%b_7|y(VV<6lV%E%+< zj-cipwHpxve!}|8N2X%@J-GJ?wEl$jfu$l?5hW=(xroz%Kv79ZGy<4QXsNbVD!X>M zmTi_$CR8AhDtnObSiXS$ z5XAB)j4~pLDU&ZH**<={Or?_En}otRw^(6u*2e~;L=Yvif)f$#oW~G}C%Yib&(_5> z+m(=M(_{@%jKXDOqB4e|Zpxr`vnwhHyRxGxT}E#qamw$rX8NYG<>D;FWyLo(;8>Ei zRjR3g-wzrO9s|$nhCgZ=Iy<{D0sTrJklnTOPz(e^O1=&JWa#u*Am#KQg31uA5-Lc@ zsPy*Hac5c$P#VC;ojj5;z(fzn__-c9?7qgmeTE-<%9A&8i*-wtSMjU=S~@hXC=N-qEJ4k5%KV>C^NUG;FAr+_>Fb zDJ7@`LmoWSA!8YjDh8NS^K7kYR%5SDp9>W^v7wZXOpi9knqBLTCwZ}B=tDRYSMXogPvq=-%XNcl= z0!DR#G^KQ5n#I&DR+pVzDpquHNW4TM{F?RE>uB>-9+}2ldJk^9bJnQw_JeIGa!hQ< z*nONmIM-VB5nb}|^P23Vsd>4e<-v^|xb3a& zw%~WeL)G=F^Qxnt8(ywkO?5Uwwl}(6v|IJ&ddZhXKCih?oWSEVd?{4*1Dk~NTl8Vk zeN-G~J#AY&W|``_LcOLvj%?npGt=uPWJ8fRB#kO<)EnZvwyl?KkJKi)Lshn3j&zVc z7+sBlLn^f`hTaCW;yphs!I=2?!P|}KxK#pDsut

?a!7Tm6^xiQwP*!z9wM%DGi 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

yG_YbYRQ2*cehN)@q0xG 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

<^d-X7^q}$l(1@5y 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≶al* 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 diff --git a/messages/uniworx/categories/admin/en-eu.msg b/messages/uniworx/categories/admin/en-eu.msg index 25c2b83aa..e1e232b06 100644 --- a/messages/uniworx/categories/admin/en-eu.msg +++ b/messages/uniworx/categories/admin/en-eu.msg @@ -40,11 +40,11 @@ StudySubTermsChildName: Child-Name MailTestFormEmail: Email address MailTestFormLanguages: Language settings TestDownload: Download test -BearerTokenUsageWarning: Using this interface you are able to encode essentially arbitrary permissions inte bearer tokens. This allows you to freely hand permissions off arbitrarily and without relevant restrictions. Only use this interface if you have discussed the consequences of the specific token, that you want to issue, with an experienced developer! +BearerTokenUsageWarning: Using this interface you are able to encode essentially arbitrary permissions into bearer tokens. This allows you to freely hand permissions off arbitrarily and without relevant restrictions. Only use this interface if you have discussed the consequences of the specific token, that you want to issue, with an experienced developer! BearerTokenAuthorityGroups: Authority (groups) BearerTokenAuthorityGroupsTip: All primary users of the groups listed here need to have the requisite permissions to access a route in order for the created token to grant permission to do so as well. BearerTokenAuthorityGroupMissing: Group is required -BearerTokenAuthorityUsers: Authority (users +BearerTokenAuthorityUsers: Authority (users) BearerTokenAuthorityUsersTip: All users listed here need to have the requisite permissions to access a route in order for the created token to grant permission to do so as well. The user issuing the token using this interface also needs to have permission to access that route (they are automatically added to the list of authorities). BearerTokenAuthorityUnknownUser email: Could not find any user with email #{email} BearerTokenRoutes: Permitted routes diff --git a/messages/uniworx/categories/authorization/de-de-formal.msg b/messages/uniworx/categories/authorization/de-de-formal.msg index bb09d44d9..19764c991 100644 --- a/messages/uniworx/categories/authorization/de-de-formal.msg +++ b/messages/uniworx/categories/authorization/de-de-formal.msg @@ -125,7 +125,20 @@ InvalidCredentialsADTooManyContextIds: Benutzereintrag trägt zu viele Sicherhei InvalidCredentialsADAccountExpired: Benutzereintrag abgelaufen InvalidCredentialsADPasswordMustChange: Passwort muss geändert werden InvalidCredentialsADAccountLockedOut: Benutzereintrag wurde durch Eindringlingserkennung gesperrt + +LoginTitle: Authentifizierung + FormFieldRequiredTip: Gekennzeichnete Pflichtfelder sind immer auszufüllen FormFieldWorkflowDatasetTip: Mindestens ein gekennzeichnetes Feld pro Datensatz muss ausgefüllt werden - -LoginTitle: Authentifizierung \ No newline at end of file +FormHoneypotWebsite: Webseite (URL) +FormHoneypotWebsiteTip: Link zu Ihrer Webseite +FormHoneypotWebsitePlaceholder: URL +FormHoneypotEmail: E-Mail +FormHoneypotEmailTip: Ihre E-Mail Adresse +FormHoneypotEmailPlaceholder: E-Mail +FormHoneypotName: Name +FormHoneypotNameTip: Ihr Name oder Ihre E-Mail Adresse +FormHoneypotNamePlaceholder: Name +FormHoneypotComment: Kommentar +FormHoneypotCommentPlaceholder: Kommentar +FormHoneypotFilled: Bitte füllen Sie keines der verstecken Felder aus \ No newline at end of file diff --git a/messages/uniworx/categories/authorization/en-eu.msg b/messages/uniworx/categories/authorization/en-eu.msg index 6748d07a0..f2a64dbe9 100644 --- a/messages/uniworx/categories/authorization/en-eu.msg +++ b/messages/uniworx/categories/authorization/en-eu.msg @@ -126,6 +126,20 @@ InvalidCredentialsADTooManyContextIds: Account carries to many security identifi InvalidCredentialsADAccountExpired: Account expired InvalidCredentialsADPasswordMustChange: Password needs to be changed InvalidCredentialsADAccountLockedOut: Account disabled by intruder detection + +LoginTitle: Authentication + FormFieldRequiredTip: Required fields FormFieldWorkflowDatasetTip: At least one of the marked fields must be filled -LoginTitle: Authentication +FormHoneypotWebsite: Website (URL) +FormHoneypotWebsiteTip: Link to your website +FormHoneypotWebsitePlaceholder !ident-ok: URL +FormHoneypotEmail: Email +FormHoneypotEmailTip: Your email address +FormHoneypotEmailPlaceholder: Email +FormHoneypotName !ident-ok: Name +FormHoneypotNameTip: Your name or your email address +FormHoneypotNamePlaceholder !ident-ok: Name +FormHoneypotComment: Comment +FormHoneypotCommentPlaceholder: Comment +FormHoneypotFilled: Please do not fill in any of the hidden fields diff --git a/messages/uniworx/categories/courses/courses/de-de-formal.msg b/messages/uniworx/categories/courses/courses/de-de-formal.msg index 92823ea08..9d844abc2 100644 --- a/messages/uniworx/categories/courses/courses/de-de-formal.msg +++ b/messages/uniworx/categories/courses/courses/de-de-formal.msg @@ -4,6 +4,8 @@ FilterTerm !ident-ok: Semester FilterCourseSchoolShort: Institut FilterRegistered: Angemeldet FilterCourseSearch: Volltext-Suche +FilterCourseSearchShorthand: Kürzel-Suche +FilterCourseSearchTitle: Titel-Suche FilterCourseRegistered: Registriert FilterCourseRegisterOpen: Anmeldung möglich FilterCourseAllocation: Zentralanmeldung @@ -187,6 +189,7 @@ LecturerFor: Dozent:in LecturersFor: Dozierende AssistantFor: Assistent:in AssistantsFor: Assistent:innen +CourseAdminFor: Kursadministration TutorsFor n@Int: #{pluralDE n "Tutor:in" "Tutor:innen"} CorrectorsFor n@Int: #{pluralDE n "Korrektor:in" "Korrektor:innen"} CourseParticipantsHeading: Kursteilnehmer:innen @@ -278,4 +281,4 @@ LecturerInvitationAccepted lType@Text csh@CourseShorthand: Sie wurden als #{lTyp CourseExamRegistrationTime: Angemeldet seit CourseParticipantStateIsActiveFilter: Ansicht CourseApply: Zum Kurs bewerben -CourseAdministrator: Kursadministrator:in \ No newline at end of file +CourseAdministrator: Kursadministrator:in diff --git a/messages/uniworx/categories/courses/courses/en-eu.msg b/messages/uniworx/categories/courses/courses/en-eu.msg index da740b3ae..3629417b1 100644 --- a/messages/uniworx/categories/courses/courses/en-eu.msg +++ b/messages/uniworx/categories/courses/courses/en-eu.msg @@ -4,6 +4,8 @@ FilterTerm: Semester FilterCourseSchoolShort: Department FilterRegistered: Enrolled FilterCourseSearch: Text search +FilterCourseSearchShorthand: Shorthand search +FilterCourseSearchTitle: Title search FilterCourseRegistered: Registered FilterCourseRegisterOpen: Enrolment is allowed FilterCourseAllocation: Central allocation @@ -187,6 +189,7 @@ LecturerFor: Lecturer LecturersFor: Lecturers AssistantFor: Assistant AssistantsFor: Assistants +CourseAdminFor: Course administration TutorsFor n: #{pluralEN n "Tutor" "Tutors"} CorrectorsFor n: #{pluralEN n "Corrector" "Correctors"} CourseParticipantsHeading: Course participants @@ -244,8 +247,8 @@ CourseLecInviteExplanation: You were invited to be a course administrator. CourseUserHasPersonalisedSheetFilesFilter: Participant has personalised sheet files for HeadingCourseMembers: Participants CourseAssistant: Assistant -CourseParticipantStateIsInactive: Participant is CourseParticipantStateIsInactive -CourseParticipantStateIsActive: Participant is aktive +CourseParticipantStateIsInactive: Participant is inactive +CourseParticipantStateIsActive: Participant is active CourseUserSendMail: Send message to participant CourseUserRegisterTutorial: Register tutorial CourseUserRegisterExam: Register exam @@ -277,4 +280,4 @@ LecturerInvitationAccepted lType csh: You were registered as #{lType} for #{csh} CourseExamRegistrationTime: Registered since CourseParticipantStateIsActiveFilter: View CourseApply: Apply for course -CourseAdministrator: Course administrator \ No newline at end of file +CourseAdministrator: Course administrator diff --git a/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg b/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg index ee5a84a00..db7a4baa0 100644 --- a/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg +++ b/messages/uniworx/categories/courses/exam/exam_office/de-de-formal.msg @@ -55,3 +55,24 @@ ExamOfficeFieldSubscribed: Abboniert UtilExamClosed: Noten gemeldet ExamFinishedOffice: Noten bekannt gegeben ExamOfficeFieldForced: Forcierte Einsicht + +ExamOfficeGetSynced: Synchronisiert-Status in Prüfungsliste anzeigen +ExamOfficeGetSyncedTip: Soll unter „Prüfungen“ der Synchronisiert-Status zu jeder Prüfung angezeigt werden? (Ein Deaktivieren dieser Option kann zu kürzeren Ladezeiten der Prüfungsliste führen.) + +ExamLabel: Prüfungs-Label +ExamOfficeGetLabels: Labels in Prüfungsliste anzeigen +ExamOfficeGetLabelsTip: Sollen unter „Prüfungen“ die gesetzten Labels zu jeder Prüfung angezeigt werden? +ExamOfficeLabels: Prüfungs-Labels +ExamOfficeLabelsTip: Sie können hier Labels anlegen und verwalten, welche sie einzelnen Prüfungen über die Prüfungsliste (siehe „Prüfungen“) zuweisen können. +ExamOfficeLabelName !ident-ok: Name +ExamOfficeLabelStatus !ident-ok: Status +ExamOfficeLabelPriority: Priorität +ExamOfficeLabelAlreadyExists: Es existiert bereits ein Prüfungs-Label mit diesem Namen! +ExamOfficeExamsNoLabel: Kein Label +ExamSetLabel: Label setzen +ExamLabelsSet n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} gesetzt +ExamRemoveLabel: Label entfernen +ExamLabelsRemoved n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} entfernt +ExamOfficeLabelSetLabelOnExport: Prüfungs-Label beim Export setzen +ExamOfficeLabelSetLabelOnExportTip t@Text: Soll beim CSV-Export automatisch das Export-Label für die jeweilige Prüfung gesetzt werden? Von Ihnen gesetzte Prüfungs-Label sind ausschließlich für Sie sichtbar und können von jedem Prüfungsbeauftragten unabhängig voneinander verwaltet bzw. verwendet werden. Ihr aktuell für den CSV-Export eingestelltes Prüfungs-Label ist „#{t}“. Sie können das zu setzende Prüfungs-Label unter „Export-Optionen“ oder in Ihren persönlichen Benutzereinstellungen ändern. +ExamOfficeLabelSetLabelOnExportForcedTip: Soll beim CSV-Export automatisch das Export-Label für die jeweilige Prüfung gesetzt werden? Von Ihnen gesetzte Prüfungs-Label sind ausschließlich für Sie sichtbar und können von jedem Prüfungsbeauftragten unabhängig voneinander verwaltet bzw. verwendet werden. Sie haben aktuell kein Export-Label festgelegt und können diese Option daher nicht auswählen. Sie können das beim CSV-Export zu setzende Prüfungs-Label unter „Export-Optionen“ oder in Ihren persönlichen Benutzereinstellungen wählen. diff --git a/messages/uniworx/categories/courses/exam/exam_office/en-eu.msg b/messages/uniworx/categories/courses/exam/exam_office/en-eu.msg index 99ccc888c..397e21d7f 100644 --- a/messages/uniworx/categories/courses/exam/exam_office/en-eu.msg +++ b/messages/uniworx/categories/courses/exam/exam_office/en-eu.msg @@ -53,3 +53,24 @@ ExamOfficeFieldSubscribed: subscribed UtilExamClosed: Exam achievements registered ExamFinishedOffice: Exam achievements published ExamOfficeFieldForced: Forced access + +ExamOfficeGetSynced: Show synchronised status in exam list +ExamOfficeGetSyncedTip: Should the synchronised status be displayed in “Exams”? (Disabling this option may lead to shorter loading times of the exam list.) + +ExamLabel: Exam label +ExamOfficeGetLabels: Show labels in exam list +ExamOfficeGetLabelsTip: Should the labels of each exam be displayed in “Exams”? +ExamOfficeLabels: Exam labels +ExamOfficeLabelsTip: Here you can add and manage labels, which you can assign exam list entries (see “Exams”). +ExamOfficeLabelName: Name +ExamOfficeLabelStatus: Status +ExamOfficeLabelPriority: Priority +ExamOfficeLabelAlreadyExists: There already exists an exam label with this name! +ExamOfficeExamsNoLabel: No label +ExamSetLabel: Set label +ExamLabelsSet n: Successfully set #{n} exam #{pluralEN n "label" "labels"} +ExamRemoveLabel: Remove label +ExamLabelsRemoved n: Successfully removed #{n} exam #{pluralEN n "label" "labels"} +ExamOfficeLabelSetLabelOnExport: Set exam label while exporting +ExamOfficeLabelSetLabelOnExportTip t: Should the export label be set for the respective exam? Your set exam labels are exclusively visible to you and may be managed and used by each exam office member independently. Your saved exam label for CSV export is currently “#{t}”. You can change the exam label set while exporting under “Export options” or in your user settings. +ExamOfficeLabelSetLabelOnExportForcedTip: Should the export label be set for the respective exam? Your set exam labels are exclusively visible to you and may be managed and used by each exam office member independently. You do not currently have any exam label selected as export label and therefor cannot active this setting. To set an exam label as export label, go to “Export options” or your user settings. diff --git a/messages/uniworx/categories/courses/submission/de-de-formal.msg b/messages/uniworx/categories/courses/submission/de-de-formal.msg index 145768cc4..a9a224b43 100644 --- a/messages/uniworx/categories/courses/submission/de-de-formal.msg +++ b/messages/uniworx/categories/courses/submission/de-de-formal.msg @@ -159,6 +159,8 @@ SubmissionDownloadMatriculations: Mit Matrikelnummern SubmissionDownloadGroups: Mit festen Abgabegruppen CorrAutoSetCorrector: Korrekturen verteilen CorrDelete: Abgaben löschen +CorrSetCorrectionsDone: Korrekturen als abgeschlossen markieren +SetCorrectionsDone b@Bool: Korrekturen als #{notDE b} abgeschlossen markiert SubmissionCorrected: Korrigiert CorrectionSheets: Übersicht Korrekturen nach Blättern CorrectionCorrectors: Übersicht Korrekturen nach Korrektor:innen @@ -186,6 +188,7 @@ UploadModeExtensionRestrictionTip: Komma-separiert. Wenn keine Dateiendungen ang UploadModeExtensionRestrictionMultipleTip: Einschränkung von Dateiendungen erfolgt für alle hochgeladenen Dateien, auch innerhalb von ZIP-Archiven. FileUploadMaxSize maxSize@Text: Datei darf maximal #{maxSize} groß sein FileUploadMaxSizeMultiple maxSize@Text: Dateien dürfen jeweils maximal #{maxSize} groß sein +FileUploadCumulativeMaxSize maxSize@Text: Dateien dürfen insgesamt maximal #{maxSize} groß sein InvalidPseudonym pseudonym@Text: Invalides Pseudonym "#{pseudonym}" InvalidPseudonymSubmissionIgnored oPseudonyms@Text iPseudonym@Text: Abgabe mit Pseudonymen „#{oPseudonyms}“ wurde ignoriert, da „#{iPseudonym}“ nicht automatisiert zu einem validen Pseudonym korrigiert werden konnte. @@ -261,4 +264,4 @@ CorrectionTableCsvSheetNameCourseCorrections tid@TermId ssh@SchoolId csh@CourseS CorrectionTableCsvNameCorrections: abgaben CorrectionTableCsvSheetNameCorrections: Abgaben CorrectionTableCsvNameCourseUserCorrections tid@TermId ssh@SchoolId csh@CourseShorthand displayName@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase displayName}-abgaben -CorrectionTableCsvSheetNameCourseUserCorrections tid@TermId ssh@SchoolId csh@CourseShorthand displayName@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase displayName} Abgaben \ No newline at end of file +CorrectionTableCsvSheetNameCourseUserCorrections tid@TermId ssh@SchoolId csh@CourseShorthand displayName@Text: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldCase displayName} Abgaben diff --git a/messages/uniworx/categories/courses/submission/en-eu.msg b/messages/uniworx/categories/courses/submission/en-eu.msg index 0574c4a9d..11164c7b0 100644 --- a/messages/uniworx/categories/courses/submission/en-eu.msg +++ b/messages/uniworx/categories/courses/submission/en-eu.msg @@ -159,6 +159,8 @@ SubmissionDownloadMatriculations: With matriculation numbers SubmissionDownloadGroups: With registered submission groups CorrAutoSetCorrector: Distribute corrections CorrDelete: Delete submissions +CorrSetCorrectionsDone: Set corrections as done +SetCorrectionsDone b: Set corrections as #{notEN b} done SubmissionCorrected: Marked CorrectionSheets: Corrections by sheet CorrectionCorrectors: Corrections by corrector @@ -186,6 +188,8 @@ UploadModeExtensionRestrictionTip: Comma-separated. If no file extensions are sp UploadModeExtensionRestrictionMultipleTip: Checks for valid file extension are performed for all uploaded files, including those packed within zip-archives. FileUploadMaxSize maxSize: File may be up to #{maxSize} in size FileUploadMaxSizeMultiple maxSize: Files may each be up to #{maxSize} in size +FileUploadCumulativeMaxSize maxSize: Files may be no larger than #{maxSize} in total + InvalidPseudonym pseudonym: Invalid pseudonym “#{pseudonym}” InvalidPseudonymSubmissionIgnored oPseudonyms iPseudonym: The submission with pseudonyms “#{oPseudonyms}” has been ignored since “#{iPseudonym}” could not be automatically corrected to be a valid pseudonym. PseudonymAutocorrections: Suggestions: diff --git a/messages/uniworx/categories/help/en-eu.msg b/messages/uniworx/categories/help/en-eu.msg index ec0dbb8c9..3b4c29a37 100644 --- a/messages/uniworx/categories/help/en-eu.msg +++ b/messages/uniworx/categories/help/en-eu.msg @@ -1,4 +1,4 @@ -HelpRequestHeading: Support request / Suggestion +HelpRequestHeading: Support request/Suggestion HelpIntroduction: If you have trouble using this website or if you find something that could be improved, please contact us even if you were already able to solve your problem by yourself! We are continually making changes and try to keep the site as intuitive as possible even for new users. HelpProblemPage: Problematic page @@ -7,7 +7,7 @@ HelpUser: My user account HelpEmail: Email HelpAnonymous: Send no answers (anonymous) HelpSubject: Subject -HelpRequest: Support request / Suggestion +HelpRequest: Support request/Suggestion HelpSent: Your support request has been sent. AdditionalFaqs: More frequently asked questions HelpName: Name diff --git a/messages/uniworx/categories/settings/auth_settings/en-eu.msg b/messages/uniworx/categories/settings/auth_settings/en-eu.msg index 93730a034..1109b0c27 100644 --- a/messages/uniworx/categories/settings/auth_settings/en-eu.msg +++ b/messages/uniworx/categories/settings/auth_settings/en-eu.msg @@ -21,9 +21,9 @@ AuthTagExamCorrector: User is exam corrector AuthTagTutor: User is tutor AuthTagTutorControl: Tutors have control over their tutorial AuthTagTime: Time restrictions are fulfilled -AuthTagStaffTime: Time restrictions wrt. staff are fulfilled +AuthTagStaffTime: Time restrictions for teaching staff are fulfilled AuthTagAllocationTime: Time restrictions due to a central allocation are fulfilled -AuthTagCourseTime: Time restrictions wrt. course visibility are fulfilled +AuthTagCourseTime: Time restrictions for course visibility are fulfilled AuthTagCourseRegistered: User is enrolled in course AuthTagAllocationRegistered: User participates in central allocation AuthTagTutorialRegistered: User is tutorial participant diff --git a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg index 5041a5918..31d411eb0 100644 --- a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg +++ b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg @@ -3,6 +3,8 @@ CsvOptionsTip: Diese Einstellungen betreffen primär den CSV-Export; beim Import CsvFormatOptions: Dateiformat CsvTimestamp: Zeitstempel CsvTimestampTip: Soll an den Namen jeder exportierten CSV-Datei ein Zeitstempel vorne angehängt werden? +CsvExportLabel: Prüfungs-Label bei Export +CsvExportLabelTip: Soll beim CSV-Export von Prüfungsleistungen automatisch ein gegebenes Label für diese Prüfung gesetzt werden? CsvPresetRFC: Standard-Konform (RFC 4180) CsvPresetExcel: Excel-Kompatibel CsvCustom: Benutzerdefiniert diff --git a/messages/uniworx/categories/settings/csv_options/en-eu.msg b/messages/uniworx/categories/settings/csv_options/en-eu.msg index 2900dc672..2f9d76ab8 100644 --- a/messages/uniworx/categories/settings/csv_options/en-eu.msg +++ b/messages/uniworx/categories/settings/csv_options/en-eu.msg @@ -3,6 +3,8 @@ CsvOptionsTip: These settings primarily affect CSV export. During import most se CsvFormatOptions: File format CsvTimestamp: Timestamp CsvTimestampTip: Should the name of every exported csv file contain a timestamp? +CsvExportLabel: Exam label on export +CsvExportLabelTip: Should a given label be automatically set for an exam of which results are exported to CSV? CsvPresetRFC: Standards-compliant (RFC 4180) CsvPresetExcel: Excel compatible CsvCustom: User defined diff --git a/messages/uniworx/categories/settings/de-de-formal.msg b/messages/uniworx/categories/settings/de-de-formal.msg index 08b5d2457..ac114ffe3 100644 --- a/messages/uniworx/categories/settings/de-de-formal.msg +++ b/messages/uniworx/categories/settings/de-de-formal.msg @@ -113,3 +113,5 @@ AllocNotifyNewCourseDefault: Systemweite Einstellung AllocNotifyNewCourseForceOff: Nein AllocNotifyNewCourseForceOn: Ja Settings: Individuelle Benutzereinstellungen + +FormExamOffice: Prüfungsverwaltung diff --git a/messages/uniworx/categories/settings/en-eu.msg b/messages/uniworx/categories/settings/en-eu.msg index 697ecd60e..4b5113ba7 100644 --- a/messages/uniworx/categories/settings/en-eu.msg +++ b/messages/uniworx/categories/settings/en-eu.msg @@ -113,4 +113,6 @@ LanguageChanged: Language changed successfully AllocNotifyNewCourseDefault: System-wide setting AllocNotifyNewCourseForceOff: No AllocNotifyNewCourseForceOn: Yes -Settings: Settings \ No newline at end of file +Settings: Settings + +FormExamOffice: Exam Office \ No newline at end of file diff --git a/messages/uniworx/categories/system_message/de-de-formal.msg b/messages/uniworx/categories/system_message/de-de-formal.msg index f17673b8d..8ea0aacb1 100644 --- a/messages/uniworx/categories/system_message/de-de-formal.msg +++ b/messages/uniworx/categories/system_message/de-de-formal.msg @@ -8,6 +8,7 @@ SystemMessageLastChanged: Zuletzt geändert SystemMessageLastUnhide: Zuletzt un-versteckt SystemMessageFrom: Sichtbar ab SystemMessageTo: Sichtbar bis +SystemMessageOnVolatileClusterSettings: Sichtbar bei VolatileCluster-Einstellungen SystemMessageAuthenticatedOnly: Nur angemeldet SystemMessageSeverity: Schwere SystemMessagePriority: Priorität @@ -38,3 +39,7 @@ SystemMessageEditTranslationSuccess: Übersetzung angepasst. SystemMessageDeleteTranslationSuccess: Übersetzung entfernt. RFC1766: RFC1766-Sprachcode + +SystemMessageOnVolatileClusterSettingKey: VolatileCluster-Einstellung +SystemMessageOnVolatileClusterSettingValue: Wert +SystemMessageOnVolatileClusterSettingKeyExists: Für diese Einstellung existiert bereits ein Wert! diff --git a/messages/uniworx/categories/system_message/en-eu.msg b/messages/uniworx/categories/system_message/en-eu.msg index df7c84720..560f32552 100644 --- a/messages/uniworx/categories/system_message/en-eu.msg +++ b/messages/uniworx/categories/system_message/en-eu.msg @@ -8,6 +8,7 @@ SystemMessageLastChanged: Last changed SystemMessageLastUnhide: Last unhidden SystemMessageFrom: Visible from SystemMessageTo: Visible to +SystemMessageOnVolatileClusterSettings: Visible on VolatileCluster settings SystemMessageAuthenticatedOnly: Only logged in users SystemMessageSeverity: Severity SystemMessagePriority: Priority @@ -38,3 +39,7 @@ SystemMessageEditTranslationSuccess: Successfully edited translation. SystemMessageDeleteTranslationSuccess: Successfully deleted translation. RFC1766: RFC1766 language code + +SystemMessageOnVolatileClusterSettingKey: VolatileCluster setting +SystemMessageOnVolatileClusterSettingValue: Value +SystemMessageOnVolatileClusterSettingKeyExists: There already exists a value for this setting! diff --git a/messages/uniworx/misc/de-de-formal.msg b/messages/uniworx/misc/de-de-formal.msg index 6ff3195b9..1504ae4c4 100644 --- a/messages/uniworx/misc/de-de-formal.msg +++ b/messages/uniworx/misc/de-de-formal.msg @@ -9,4 +9,6 @@ MultiEmailFieldTip: Es sind mehrere, Komma-separierte, E-Mail-Adressen möglich WeekDay: Wochentag LdapIdentificationOrEmail: Fraport AG-Kennung / E-Mail-Adresse Months num@Int64: #{num} #{pluralDE num "Monat" "Monate"} -Days num@Int64: #{num} #{pluralDE num "Tag" "Tage"} \ No newline at end of file +Days num@Int64: #{num} #{pluralDE num "Tag" "Tage"} + +ClusterVolatileQuickActionsEnabled: Schnellzugriffsmenü aktiv diff --git a/messages/uniworx/misc/en-eu.msg b/messages/uniworx/misc/en-eu.msg index 95703d2b9..e9fdd8877 100644 --- a/messages/uniworx/misc/en-eu.msg +++ b/messages/uniworx/misc/en-eu.msg @@ -9,4 +9,6 @@ MultiEmailFieldTip: Multiple emails addresses may be specified (comma-separated) WeekDay: Day of the week LdapIdentificationOrEmail: Fraport AG-Kennung / email address Months num: #{num} #{pluralEN num "Month" "Months"} -Days num: #{num} #{pluralEN num "Day" "Days"} \ No newline at end of file +Days num: #{num} #{pluralEN num "Day" "Days"} + +ClusterVolatileQuickActionsEnabled: Quick actions enabled diff --git a/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg b/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg index 579243035..5c2ec8801 100644 --- a/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg +++ b/messages/uniworx/utils/navigation/breadcrumbs/de-de-formal.msg @@ -162,4 +162,7 @@ BreadcrumbMessageList: Systemnachrichten BreadcrumbGlossary: Begriffsverzeichnis BreadcrumbLogin !ident-ok: Login BreadcrumbNews: Aktuell -BreadcrumbSubmissionAuthorshipStatements: Eigenständigkeitserklärungen \ No newline at end of file +BreadcrumbSubmissionAuthorshipStatements: Eigenständigkeitserklärungen +BreadcrumbExternalApis: Externe APIs +BreadcrumbApiDocs: API Dokumentation +BreadcrumbSwagger !ident-ok: OpenAPI 2.0 (Swagger) diff --git a/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg b/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg index 18843de27..af949d19d 100644 --- a/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg +++ b/messages/uniworx/utils/navigation/breadcrumbs/en-eu.msg @@ -163,3 +163,6 @@ BreadcrumbSheetOldUnassigned: Submissions without corrector BreadcrumbLogin: Login BreadcrumbNews: News BreadcrumbSubmissionAuthorshipStatements: Statements of Authorship +BreadcrumbExternalApis: External APIs +BreadcrumbApiDocs: API documentation +BreadcrumbSwagger: OpenAPI 2.0 (Swagger) diff --git a/messages/uniworx/utils/navigation/menu/de-de-formal.msg b/messages/uniworx/utils/navigation/menu/de-de-formal.msg index 76cb76561..aa1a53f9b 100644 --- a/messages/uniworx/utils/navigation/menu/de-de-formal.msg +++ b/messages/uniworx/utils/navigation/menu/de-de-formal.msg @@ -130,4 +130,7 @@ MenuLmsUsers: Export E-Lernen Benutzer MenuLmsUserlist: Melden E-Lernen Benutzer MenuLmsResult: Melden Ergebnisse E-Lernen MenuLmsUpload: Hochladen -MenuLmsDirect: Direkter Upload \ No newline at end of file +MenuLmsDirect: Direkter Upload + +MenuApiDocs: API-Dokumentation (Englisch) +MenuSwagger !ident-ok: OpenAPI 2.0 (Swagger) diff --git a/messages/uniworx/utils/navigation/menu/en-eu.msg b/messages/uniworx/utils/navigation/menu/en-eu.msg index bd5961c49..4a5c4b5f8 100644 --- a/messages/uniworx/utils/navigation/menu/en-eu.msg +++ b/messages/uniworx/utils/navigation/menu/en-eu.msg @@ -132,3 +132,6 @@ MenuLmsUserlist: Upload E-Learning Users MenuLmsResult: Upload E-Learning Results MenuLmsUpload: Upload MenuLmsDirect: Direct Upload + +MenuApiDocs: API documentation +MenuSwagger: OpenAPI 2.0 (Swagger) diff --git a/messages/uniworx/utils/site_layout/en-eu.msg b/messages/uniworx/utils/site_layout/en-eu.msg index 73a4e98a1..1ff570c8a 100644 --- a/messages/uniworx/utils/site_layout/en-eu.msg +++ b/messages/uniworx/utils/site_layout/en-eu.msg @@ -10,7 +10,7 @@ LegalHeading: Legal VersionHeading: Version history SystemMessageHeading: Uni2work system message SystemMessageListHeading: Uni2work system message -HeadingHelpRequest: Support request / Suggestion +HeadingHelpRequest: Support request/Suggestion ProfileHeading: Settings ProfileDataHeading: Personal information CorrectorsChange: Adjust correctors diff --git a/messages/uniworx/utils/table_column/de-de-formal.msg b/messages/uniworx/utils/table_column/de-de-formal.msg index 7b4b75b64..b8da0aa97 100644 --- a/messages/uniworx/utils/table_column/de-de-formal.msg +++ b/messages/uniworx/utils/table_column/de-de-formal.msg @@ -22,6 +22,7 @@ TableExamName !ident-ok: Name TableExamTime: Termin TableExamRegistration: Prüfungsanmeldung TableExamResult: Prüfungsergebnis +TableExamLabel !ident-ok: Label TableSheet: Blatt TableLastEdit: Letzte Änderung TableSubmission: Abgabenummer @@ -62,4 +63,7 @@ CsvExport: CSV-Export TableProportion c@Text of'@Text prop@Rational !ident-ok: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) TableProportionNoRatio c@Text of'@Text !ident-ok: #{c}/#{of'} TableExamFinished: Ergebnisse sichtbar ab -TableDiffDaysTooltip: Zeitspanne nach ISO 8601. Beispiel: "P2Y3M4D" ist eine Zeitspanne von 2 Jahren, 3 Monaten und 4 Tagen. \ No newline at end of file +TableDiffDaysTooltip: Zeitspanne nach ISO 8601. Beispiel: "P2Y3M4D" ist eine Zeitspanne von 2 Jahren, 3 Monaten und 4 Tagen. +TableExamOfficeLabel: Label-Name +TableExamOfficeLabelStatus: Label-Farbe +TableExamOfficeLabelPriority: Label-Priorität diff --git a/messages/uniworx/utils/table_column/en-eu.msg b/messages/uniworx/utils/table_column/en-eu.msg index b0adcf737..656c1aa9c 100644 --- a/messages/uniworx/utils/table_column/en-eu.msg +++ b/messages/uniworx/utils/table_column/en-eu.msg @@ -22,6 +22,7 @@ TableExamName: Name TableExamTime: Time TableExamRegistration: Exam registration TableExamResult: Exam result +TableExamLabel: Label TableSheet: Sheet TableLastEdit: Latest edit TableSubmission: Submission-number @@ -62,4 +63,7 @@ CsvExport: CSV export TableProportion c of' prop: #{c}/#{of'} (#{rationalToFixed2 (100 * prop)}%) TableProportionNoRatio c of': #{c}/#{of'} TableExamFinished: Results visible from -TableDiffDaysTooltip: Duration given according to ISO 8601. Example: "P2Y3M4D" is a period of 2 years, 3 months and 4 days. \ No newline at end of file +TableDiffDaysTooltip: Duration given according to ISO 8601. Example: "P2Y3M4D" is a period of 2 years, 3 months and 4 days. +TableExamOfficeLabel: Label name +TableExamOfficeLabelStatus: Label colour +TableExamOfficeLabelPriority: Label priority diff --git a/messages/uniworx/utils/utils/de-de-formal.msg b/messages/uniworx/utils/utils/de-de-formal.msg index 1464f36ae..1e98b1417 100644 --- a/messages/uniworx/utils/utils/de-de-formal.msg +++ b/messages/uniworx/utils/utils/de-de-formal.msg @@ -4,6 +4,7 @@ RGCourseParticipants: Kursteilnehmer:innen RGCourseLecturers: Kursverwalter:innen RGCourseCorrectors: Korrektor:innen RGCourseTutors: Tutor:innen +RGCourseParticipantsInTutorial: Kursteilnehmer:innen, die in mindestens einem Tutorium angemeldet sind RGCourseUnacceptedApplicants: Nicht akzeptierte Bewerber:innen RecipientToggleAll: Alle/Keine CommCourseTestSubject customSubject@Text !ident-ok: [TEST] #{customSubject} @@ -17,6 +18,8 @@ RGTutorialParticipants tutn@TutorialName: Tutorium-Teilnehmer:innen (#{tutn}) RGExamRegistered examn@ExamName: Angemeldet zur Prüfung „#{examn}“ RGSheetSubmittor shn@SheetName: Abgebende für das Übungsblatt „#{shn}“ CommSubject: Betreff +CommAttachments: Anhänge +CommAttachmentsTip: Im Allgemeinen ist es vorzuziehen Dateien, die Sie mit den Empfängern teilen möchten, als Material hochzuladen (und ggf. in der Nachricht zu verlinken). So ist die Datei für die Empfänger dauerhaft abrufbar und auch Personen, die sich z.B. erst später zum Kurs anmelden, haben Zugriff auf die Datei. CommSuccess n@Int: Nachricht wurde an #{n} Empfänger versandt CommTestSuccess: Nachricht wurde zu Testzwecken nur an Sie selbst versandt @@ -53,6 +56,7 @@ UploadSpecificFileMaxSizeNegative: Maximale Dateigröße darf nicht negativ sein UploadSpecificFileEmptyOk: Leere Uploads erlauben UnknownPseudonymWord pseudonymWord@Text: Unbekanntes Pseudonym-Wort "#{pseudonymWord}" GenericFileFieldFileTooLarge file@FilePath: „#{file}“ ist zu groß +GenericFileFieldCumulativeTooLarge: Hochgeladene Dateien sind zu groß GenericFileFieldInvalidExtension file@FilePath: „#{file}” hat keine zulässige Dateiendung OnlyUploadOneFile: Bitte nur eine Datei hochladen. UploadAtLeastOneNonemptyFile: Bitte mindestens eine nichtleere Datei hochladen. @@ -133,6 +137,7 @@ MessageError: Fehler MessageWarning: Warnung MessageInfo !ident-ok: Information MessageSuccess: Erfolg +MessageNonactive: Inaktiv ShortFieldPrimary: HF ShortFieldSecondary: NF SheetGradingPassPoints': Bestehen nach Punkten diff --git a/messages/uniworx/utils/utils/en-eu.msg b/messages/uniworx/utils/utils/en-eu.msg index 1539fdf4c..db6338b4c 100644 --- a/messages/uniworx/utils/utils/en-eu.msg +++ b/messages/uniworx/utils/utils/en-eu.msg @@ -4,6 +4,7 @@ RGCourseParticipants: Course participants RGCourseLecturers: Course administrators RGCourseCorrectors: Course correctors RGCourseTutors: Course tutors +RGCourseParticipantsInTutorial: Course participants who are registered for at least one tutorial RGCourseUnacceptedApplicants: Applicants not accepted RecipientToggleAll: All/None CommCourseTestSubject customSubject: [TEST] #{customSubject} @@ -17,6 +18,8 @@ RGTutorialParticipants tutn: Tutorial participants (#{tutn}) RGExamRegistered examn: Registered for exam “#{examn}” RGSheetSubmittor shn: Submitted for exercise sheet “#{shn}” CommSubject: Subject +CommAttachments: Attachments +CommAttachmentsTip: In general it is preferable to upload files as course material instead of sending them as attachments. You can then link to the material from the message. The file is then permanently accessable to the recipients and to persons that, for example, register for the Course at a later date. CommSuccess n: Message was sent to #{n} #{pluralEN n "recipient" "recipients"} CommTestSuccess: Message was sent only to yourself for testing purposes @@ -53,6 +56,7 @@ UploadSpecificFileMaxSizeNegative: Maximum filesize may not be negative UploadSpecificFileEmptyOk: Allow empty uploads UnknownPseudonymWord pseudonymWord: Invalid pseudonym-word “#{pseudonymWord}” GenericFileFieldFileTooLarge file: “#{file}” is too large +GenericFileFieldCumulativeTooLarge: Uploaded files are too large GenericFileFieldInvalidExtension file: “#{file}” does not have an acceptable file extension OnlyUploadOneFile: Please only upload one file UploadAtLeastOneNonemptyFile: Please upload at least one nonempty file. @@ -133,6 +137,7 @@ MessageError: Error MessageWarning: Warning MessageInfo: Information MessageSuccess: Success +MessageNonactive: Inactive ShortFieldPrimary: Mj ShortFieldSecondary: Mn SheetGradingPassPoints': Passing by points diff --git a/models/exam-office/exam-labels.model b/models/exam-office/exam-labels.model new file mode 100644 index 000000000..a22a8ebc7 --- /dev/null +++ b/models/exam-office/exam-labels.model @@ -0,0 +1,18 @@ +ExamOfficeLabel + user UserId + name ExamOfficeLabelName + status MessageStatus + priority Int -- determines label ordering + UniqueExamOfficeLabel user name + deriving Generic + +ExamOfficeExamLabel + exam ExamId + label ExamOfficeLabelId + UniqueExamOfficeExamLabel exam + deriving Generic +ExamOfficeExternalExamLabel + externalExam ExternalExamId + label ExamOfficeLabelId + UniqueExamOfficeExternalExamLabel externalExam + deriving Generic diff --git a/models/external-apis.model b/models/external-apis.model new file mode 100644 index 000000000..3ac92ee93 --- /dev/null +++ b/models/external-apis.model @@ -0,0 +1,9 @@ +ExternalApi + ident UUID Maybe + authority Jwt + keys JwkSet + baseUrl BaseUrl + config ExternalApiConfig + lastAlive UTCTime + UniqueExternalApiIdent ident !force + deriving Generic \ No newline at end of file diff --git a/models/system-messages.model b/models/system-messages.model index d7e3fd852..687eeb304 100644 --- a/models/system-messages.model +++ b/models/system-messages.model @@ -1,8 +1,9 @@ -- Messages shown to all users as soon as they visit the site/log in (i.e.: "System is going down for maintenance next sunday") -- Only administrators (of any school) should be able to create these via a web-interface -SystemMessage +SystemMessage json from UTCTime Maybe -- Message is not shown before this date has passed (never shown, if null) to UTCTime Maybe -- Message is shown until this date has passed (shown forever, if null) + onVolatileClusterSettings SystemMessageVolatileClusterSettings default="'[]'::jsonb" -- Message is shown when given volatile cluster settings have given values newsOnly Bool default=false authenticatedOnly Bool -- Show message to all users upon visiting the site or only upon login? severity MessageStatus -- Success, Warning, Error, Info, ... diff --git a/models/users.model b/models/users.model index 0960f9d57..a3f4ba1bd 100644 --- a/models/users.model +++ b/models/users.model @@ -17,7 +17,7 @@ User json -- Each Uni2work user has a corresponding row in this table; create lastAuthentication UTCTime Maybe -- last login date created UTCTime default=now() lastLdapSynchronisation UTCTime Maybe - ldapPrimaryKey Text Maybe + ldapPrimaryKey UserEduPersonPrincipalName Maybe tokensIssuedAfter UTCTime Maybe -- do not accept bearer tokens issued before this time (accept all tokens if null) matrikelnummer UserMatriculation Maybe -- usually a number; AVS Personalnummer; nicht Fraport Personalnummer! firstName Text -- For export in tables, pre-split firstName from displayName @@ -39,6 +39,8 @@ User json -- Each Uni2work user has a corresponding row in this table; create mobile Text Maybe companyPersonalNumber Text Maybe -- Company will become a new table, but if company=fraport, some information is received via LDAP companyDepartment Text Maybe -- thus we store such information for ease of reference directly, if available + examOfficeGetSynced Bool default=true -- whether synced status should be displayed for exam results by default + examOfficeGetLabels Bool default=true -- whether labels should be displayed for exam results by default UniqueAuthentication ident -- Column 'ident' can be used as a row-key in this table UniqueEmail email -- Column 'email' can be used as a row-key in this table deriving Show Eq Ord Generic -- Haskell-specific settings for runtime-value representing a row in memory @@ -57,8 +59,8 @@ UserSystemFunction UniqueUserSystemFunction user function deriving Generic UserExamOffice - user UserId - field StudyTermsId + user UserId + field StudyTermsId UniqueUserExamOffice user field deriving Generic UserSchool -- Managed by users themselves, encodes "schools of interest" diff --git a/package-lock.json b/package-lock.json index 1205709c8..93d8f1737 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1346 +1,704 @@ { "name": "uni2work", - "version": "25.24.5", + "version": "26.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/cli": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.11.6.tgz", - "integrity": "sha512-+w7BZCvkewSmaRM6H4L2QM3RL90teqEIHDIFXAmrW33+0jhlymnDAEdqVeCZATvxhQuio1ifoGVlJJbIiH9Ffg==", + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "chokidar": "^2.1.8", + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/cli": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.10.tgz", + "integrity": "sha512-OygVO1M2J4yPMNOW9pb+I6kFGpQK77HmG44Oz3hg8xQIl5L/2zq+ZohwAdSaqYgVwM0SfmPHZHphH4wR8qzVYw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.8", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.0.0", - "lodash": "^4.17.19", "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", - "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "semver": "^5.5.0" + "slash": "^2.0.0" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true } } }, - "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", + "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "dev": true + }, + "@babel/core": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.2.tgz", + "integrity": "sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helpers": "^7.18.2", + "@babel/parser": "^7.18.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/eslint-parser": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz", + "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz", - "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", "dev": true, "requires": { - "@babel/types": "^7.9.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", + "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", - "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz", + "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.10.4", - "browserslist": "^4.12.0", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" + "@babel/compat-data": "^7.17.10", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.20.2", + "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz", + "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - }, - "dependencies": { - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz", + "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, "dependencies": { - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } } } }, + "@babel/helper-environment-visitor": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz", + "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==", + "dev": true + }, "@babel/helper-explode-assignable-expression": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", - "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.9.5" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.11.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dev": true, "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz", + "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.0", + "@babel/types": "^7.18.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", + "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", "dev": true }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", - "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, "@babel/helper-remap-async-to-generator": { - "version": "7.11.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", - "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz", + "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz", + "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.18.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", - "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { - "@babel/types": "^7.11.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dev": true, "requires": { - "@babel/types": "^7.8.3" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", - "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz", + "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", - "dev": true, - "requires": { - "@babel/types": "^7.11.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.18.2", + "@babel/types": "^7.18.2" } }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", + "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@babel/parser": { - "version": "7.9.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.3.tgz", + "integrity": "sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==", "dev": true }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.17.12", + "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.17.12.tgz", + "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz", + "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.17.12" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz", + "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz", + "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz", + "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha512-Sc5TAQSZuLzgY0664mMDn24Vw2P8g/VhyLyGPaWiHahhgLqeZvcGeyBZOrJW0oSKIK2mvQ22a1ENXBIQLhrEiQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz", + "integrity": "sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.18.2", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/plugin-syntax-decorators": "^7.17.12", + "charcodes": "^0.2.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", - "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz", - "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz", + "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz", + "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz", - "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz", + "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.17.12", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", - "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz", + "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", - "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", - "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz", + "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.17.10", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.17.12" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", - "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz", + "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", - "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz", + "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz", + "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz", + "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-async-generators": { @@ -1353,21 +711,30 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz", + "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1388,6 +755,15 @@ "@babel/helper-plugin-utils": "^7.8.3" } }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz", + "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.17.12" + } + }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1451,604 +827,457 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", - "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz", + "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz", + "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", - "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz", + "integrity": "sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", - "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz", + "integrity": "sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", - "dev": true, - "requires": { - "@babel/types": "^7.11.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz", + "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz", + "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz", + "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz", + "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", - "dev": true - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz", + "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", - "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz", + "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz", + "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-simple-access": "^7.18.2", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz", + "integrity": "sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz", + "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.18.0", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz", + "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.17.12", + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", - "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz", + "integrity": "sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", - "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz", + "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-property-literals": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", - "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz", + "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "@babel/helper-plugin-utils": "^7.17.12", + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", - "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz", + "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-runtime": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz", - "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz", + "integrity": "sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.17.12", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", - "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz", + "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz", + "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "version": "7.17.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz", + "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.17.12" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", - "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz", - "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz", + "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.11.0", - "@babel/helper-compilation-targets": "^7.10.4", - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-proposal-async-generator-functions": "^7.10.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-export-namespace-from": "^7.10.4", - "@babel/plugin-proposal-json-strings": "^7.10.4", - "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-numeric-separator": "^7.10.4", - "@babel/plugin-proposal-object-rest-spread": "^7.11.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-proposal-private-methods": "^7.10.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/compat-data": "^7.17.10", + "@babel/helper-compilation-targets": "^7.18.2", + "@babel/helper-plugin-utils": "^7.17.12", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-async-generator-functions": "^7.17.12", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-class-static-block": "^7.18.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.17.12", + "@babel/plugin-proposal-json-strings": "^7.17.12", + "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.18.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.17.12", + "@babel/plugin-proposal-private-methods": "^7.17.12", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-proposal-unicode-property-regex": "^7.17.12", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-import-assertions": "^7.17.12", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.10.4", - "@babel/plugin-transform-arrow-functions": "^7.10.4", - "@babel/plugin-transform-async-to-generator": "^7.10.4", - "@babel/plugin-transform-block-scoped-functions": "^7.10.4", - "@babel/plugin-transform-block-scoping": "^7.10.4", - "@babel/plugin-transform-classes": "^7.10.4", - "@babel/plugin-transform-computed-properties": "^7.10.4", - "@babel/plugin-transform-destructuring": "^7.10.4", - "@babel/plugin-transform-dotall-regex": "^7.10.4", - "@babel/plugin-transform-duplicate-keys": "^7.10.4", - "@babel/plugin-transform-exponentiation-operator": "^7.10.4", - "@babel/plugin-transform-for-of": "^7.10.4", - "@babel/plugin-transform-function-name": "^7.10.4", - "@babel/plugin-transform-literals": "^7.10.4", - "@babel/plugin-transform-member-expression-literals": "^7.10.4", - "@babel/plugin-transform-modules-amd": "^7.10.4", - "@babel/plugin-transform-modules-commonjs": "^7.10.4", - "@babel/plugin-transform-modules-systemjs": "^7.10.4", - "@babel/plugin-transform-modules-umd": "^7.10.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", - "@babel/plugin-transform-new-target": "^7.10.4", - "@babel/plugin-transform-object-super": "^7.10.4", - "@babel/plugin-transform-parameters": "^7.10.4", - "@babel/plugin-transform-property-literals": "^7.10.4", - "@babel/plugin-transform-regenerator": "^7.10.4", - "@babel/plugin-transform-reserved-words": "^7.10.4", - "@babel/plugin-transform-shorthand-properties": "^7.10.4", - "@babel/plugin-transform-spread": "^7.11.0", - "@babel/plugin-transform-sticky-regex": "^7.10.4", - "@babel/plugin-transform-template-literals": "^7.10.4", - "@babel/plugin-transform-typeof-symbol": "^7.10.4", - "@babel/plugin-transform-unicode-escapes": "^7.10.4", - "@babel/plugin-transform-unicode-regex": "^7.10.4", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.11.5", - "browserslist": "^4.12.0", - "core-js-compat": "^3.6.2", - "invariant": "^2.2.2", - "levenary": "^1.1.1", - "semver": "^5.5.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.17.12", + "@babel/plugin-transform-async-to-generator": "^7.17.12", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.17.12", + "@babel/plugin-transform-classes": "^7.17.12", + "@babel/plugin-transform-computed-properties": "^7.17.12", + "@babel/plugin-transform-destructuring": "^7.18.0", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.17.12", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.18.1", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.17.12", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.18.0", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-modules-systemjs": "^7.18.0", + "@babel/plugin-transform-modules-umd": "^7.18.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12", + "@babel/plugin-transform-new-target": "^7.17.12", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.17.12", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.18.0", + "@babel/plugin-transform-reserved-words": "^7.17.12", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.17.12", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.18.2", + "@babel/plugin-transform-typeof-symbol": "^7.17.12", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.2", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" }, "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -2059,414 +1288,212 @@ } }, "@babel/runtime": { - "version": "7.11.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", - "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz", - "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.2.tgz", + "integrity": "sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA==", "dev": true, "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.9.5", - "@babel/helper-function-name": "^7.9.5", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.9.0", - "@babel/types": "^7.9.5", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.18.2", + "@babel/helper-environment-visitor": "^7.18.2", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.18.0", + "@babel/types": "^7.18.2", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.9.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz", - "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.2.tgz", + "integrity": "sha512-0On6B8A4/+mFUto5WERt3EEuG1NznDirvwca1O8UwXQHVY8g3R7OzYgxXdOfMwLO08UrpUD/2+3Bclyq+/C94Q==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.5", - "lodash": "^4.17.13", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, "@commitlint/cli": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-10.0.0.tgz", - "integrity": "sha512-a+dLjNovvMyom0GNcKj9ebmgtbJEKuhJuqwPUmfNy3yPoM4h12b3hjVOS33IyvpbKmlYUJg8dgcr4S5FhFvhFg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.0.2.tgz", + "integrity": "sha512-Axe89Js0YzGGd4gxo3JLlF7yIdjOVpG1LbOorGc6PfYF+drBh14PvarSDLzyd2TNqdylUCq9wb9/A88ZjIdyhA==", "dev": true, "requires": { - "@babel/runtime": "^7.9.6", - "@commitlint/format": "^10.0.0", - "@commitlint/lint": "^10.0.0", - "@commitlint/load": "^10.0.0", - "@commitlint/read": "^10.0.0", - "chalk": "4.1.0", - "core-js": "^3.6.1", - "get-stdin": "8.0.0", + "@commitlint/format": "^17.0.0", + "@commitlint/lint": "^17.0.0", + "@commitlint/load": "^17.0.0", + "@commitlint/read": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0", "lodash": "^4.17.19", "resolve-from": "5.0.0", "resolve-global": "1.0.0", - "yargs": "^15.1.0" + "yargs": "^17.0.0" + } + }, + "@commitlint/config-conventional": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.0.2.tgz", + "integrity": "sha512-MfP0I/JbxKkzo+HXWB7B3WstGS4BiniotU3d3xQ9gK8cR0DbeZ4MuyGCWF65YDyrcDTS3WlrJ3ndSPA1pqhoPw==", + "dev": true, + "requires": { + "conventional-changelog-conventionalcommits": "^5.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" } } } }, - "@commitlint/config-conventional": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-10.0.0.tgz", - "integrity": "sha512-M9l7hh2a1GB9nQ/Gm+aDLGPmzGdpgxqJoSmrbTxDlapJDyaL7FPe5aQf66F50Eq3j0bmaRaJihFCA6mIUBQAag==", + "@commitlint/config-validator": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.0.0.tgz", + "integrity": "sha512-78IQjoZWR4kDHp/U5y17euEWzswJpPkA9TDL5F6oZZZaLIEreWzrDZD5PWtM8MsSRl/K2LDU/UrzYju2bKLMpA==", "dev": true, "requires": { - "conventional-changelog-conventionalcommits": "^4.3.1" + "@commitlint/types": "^17.0.0", + "ajv": "^6.12.6" } }, "@commitlint/ensure": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-10.0.0.tgz", - "integrity": "sha512-OBlv6Hw91u4Gqz4ocKO7IyIvQ6ZmKbJaLFf8MD0EOH3Prn0aatiiqUB0+paBELKt3yWdwQNYI8ZkzZWtj4EcYw==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.0.0.tgz", + "integrity": "sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==", "dev": true, "requires": { - "@commitlint/types": "^10.0.0", + "@commitlint/types": "^17.0.0", "lodash": "^4.17.19" } }, "@commitlint/execute-rule": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-10.0.0.tgz", - "integrity": "sha512-vRIp6Cwy+C1dOh5VAcoBks+8UI+rpxOB5cwhU/RQZhlVd2hgFiAPXnyKWMOB7HDO9XFI5amLJehvaaDI+eLDnA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz", + "integrity": "sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==", "dev": true }, "@commitlint/format": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-10.0.0.tgz", - "integrity": "sha512-EpCmMCcjloeaoUtgmzlpYmIYJzAvZhYfLJ7YCrOlnmt5/MAeywuNgxcr/EM2xHgEKotTWqRQdiIgAtkIWHhgrQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.0.0.tgz", + "integrity": "sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==", "dev": true, "requires": { - "@commitlint/types": "^10.0.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "@commitlint/types": "^17.0.0", + "chalk": "^4.1.0" } }, "@commitlint/is-ignored": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-10.0.0.tgz", - "integrity": "sha512-OLjUs/0HaQGh5iSqv/jF/TXqQ8sJ5VShujTmADSvnGTyruZu+d1Hfgw9QM1FMjzcx2NpMDsX/EFBU0ZMx9hmEg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.0.0.tgz", + "integrity": "sha512-UmacD0XM/wWykgdXn5CEWVS4XGuqzU+ZGvM2hwv85+SXGnIOaG88XHrt81u37ZeVt1riWW+YdOxcJW6+nd5v5w==", "dev": true, "requires": { - "@commitlint/types": "^10.0.0", - "semver": "7.3.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } + "@commitlint/types": "^17.0.0", + "semver": "7.3.7" } }, "@commitlint/lint": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-10.0.0.tgz", - "integrity": "sha512-KcDzOMQYVLziWIXNedTDnf5LS9NMYKzcdzjuCH8jTZLx/oX3kuOVB0jYZHVaKPwjj0miZSOhONqIMJDlLZpn+g==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.0.0.tgz", + "integrity": "sha512-5FL7VLvGJQby24q0pd4UdM8FNFcL+ER1T/UBf8A9KRL5+QXV1Rkl6Zhcl7+SGpGlVo6Yo0pm6aLW716LVKWLGg==", "dev": true, "requires": { - "@commitlint/is-ignored": "^10.0.0", - "@commitlint/parse": "^10.0.0", - "@commitlint/rules": "^10.0.0", - "@commitlint/types": "^10.0.0" + "@commitlint/is-ignored": "^17.0.0", + "@commitlint/parse": "^17.0.0", + "@commitlint/rules": "^17.0.0", + "@commitlint/types": "^17.0.0" } }, "@commitlint/load": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-10.0.0.tgz", - "integrity": "sha512-pUwGshEpxkU2R9U3O5hwHU4VT0zkyIs5gzGrGbR2c/aurI9qe00LZ9DquYVVYVmfwG6UaQpatCG4TrXNXIj5Mg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.0.0.tgz", + "integrity": "sha512-XaiHF4yWQOPAI0O6wXvk+NYLtJn/Xb7jgZEeKd4C1ZWd7vR7u8z5h0PkWxSr0uLZGQsElGxv3fiZ32C5+q6M8w==", "dev": true, "requires": { - "@commitlint/execute-rule": "^10.0.0", - "@commitlint/resolve-extends": "^10.0.0", - "@commitlint/types": "^10.0.0", - "chalk": "4.1.0", + "@commitlint/config-validator": "^17.0.0", + "@commitlint/execute-rule": "^17.0.0", + "@commitlint/resolve-extends": "^17.0.0", + "@commitlint/types": "^17.0.0", + "@types/node": ">=12", + "chalk": "^4.1.0", "cosmiconfig": "^7.0.0", + "cosmiconfig-typescript-loader": "^2.0.0", "lodash": "^4.17.19", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "resolve-from": "^5.0.0", + "typescript": "^4.6.4" } }, "@commitlint/message": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-10.0.0.tgz", - "integrity": "sha512-2ZDgHc6v3t1C/zkAkRwPDIRVD/jbrQAu+Iqe7VH1/Y//cJhwte6OuSGfs2Qze/6gh+/RbvUIBskR8OUIY6VTrA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.0.0.tgz", + "integrity": "sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==", "dev": true }, "@commitlint/parse": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-10.0.0.tgz", - "integrity": "sha512-xIBD0w85FVhrlX4pI/m4xF9MvTQNMbvilPSr42yIds2xn7GJcJidN4Z8O6qCqcjwl6f3ruQ8G8Pdi3PggVjZrw==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.0.0.tgz", + "integrity": "sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==", "dev": true, "requires": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-parser": "^3.0.0" + "@commitlint/types": "^17.0.0", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" } }, "@commitlint/read": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-10.0.0.tgz", - "integrity": "sha512-ARebcoJMDNtlCTV9jpSacN9gCvua+JiGQLQlq4PsaNo/e4hyyIWu+wOEAXO8IhD5xycoTBaJRVWzgXRncEyrkg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.0.0.tgz", + "integrity": "sha512-zkuOdZayKX3J6F6mPnVMzohK3OBrsEdOByIqp4zQjA9VLw1hMsDEFQ18rKgUc2adkZar+4S01QrFreDCfZgbxA==", "dev": true, "requires": { - "@commitlint/top-level": "^10.0.0", - "fs-extra": "^9.0.0", + "@commitlint/top-level": "^17.0.0", + "@commitlint/types": "^17.0.0", + "fs-extra": "^10.0.0", "git-raw-commits": "^2.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - } } }, "@commitlint/resolve-extends": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-10.0.0.tgz", - "integrity": "sha512-ltj4LvdCEJeYzWdzFS9AhLMkc4rweKvfju/JYBgbLqFx7lAGz3e2Wub0uuuWuLBJqCjL7UJbYiA0T2Hzhhd91Q==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.0.0.tgz", + "integrity": "sha512-wi60WiJmwaQ7lzMXK8Vbc18Hq9tE2j/6iv2AFfPUGV7fvfY6Sf1iNKuUHirSqR0fquUyufIXe4y/K9A6LVIIvw==", "dev": true, "requires": { + "@commitlint/config-validator": "^17.0.0", + "@commitlint/types": "^17.0.0", "import-fresh": "^3.0.0", "lodash": "^4.17.19", "resolve-from": "^5.0.0", @@ -2474,194 +1501,412 @@ } }, "@commitlint/rules": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-10.0.0.tgz", - "integrity": "sha512-myHG8pgUHIOtceJsALRRXvYBuLbTwWl7/6soDrIJudDhKsyhV3yFtAbRX40pujg25IlAUra6nuy8JDU86bVxog==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.0.0.tgz", + "integrity": "sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==", "dev": true, "requires": { - "@commitlint/ensure": "^10.0.0", - "@commitlint/message": "^10.0.0", - "@commitlint/to-lines": "^10.0.0", - "@commitlint/types": "^10.0.0" + "@commitlint/ensure": "^17.0.0", + "@commitlint/message": "^17.0.0", + "@commitlint/to-lines": "^17.0.0", + "@commitlint/types": "^17.0.0", + "execa": "^5.0.0" } }, "@commitlint/to-lines": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-10.0.0.tgz", - "integrity": "sha512-qUHuYiLgE7ioBRgHUR2EOwXuEhb2TnAktEc9NBZcQNzfqu5nbOaf2iOBx5mlDK0heTJyTjLboAmzojXxuqJNcA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.0.0.tgz", + "integrity": "sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==", "dev": true }, "@commitlint/top-level": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-10.0.0.tgz", - "integrity": "sha512-FHlDD31gTQptInSuRGQt/9fNiSQ4euBZtcBZD4NImCtQCkwBP1cyxClN6wr9DmqISG0KSJybReF4z8rm5znNDA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.0.0.tgz", + "integrity": "sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==", "dev": true, "requires": { "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.0.0.tgz", + "integrity": "sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" }, "dependencies": { - "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==", + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } } } }, - "@commitlint/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-10.0.0.tgz", - "integrity": "sha512-b7uumSfDI1guYnNc11BpkTZjiY7gC1DPedeUa0r+csd/1DiFyRo4oNOaxXHve0cC4NzaHaOHa0aPktWMTYJlVQ==", - "dev": true - }, - "@crossbrowsertesting/pac-resolver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@crossbrowsertesting/pac-resolver/-/pac-resolver-3.0.1.tgz", - "integrity": "sha512-KSFZth6gIG3GDwb3vh7m+4af18O1WaLrGTdDrxDqkbThF19DLQkyek482dHbW7t18yQrkRvxEM8VmEs0g+Kn5w==", + "@csstools/postcss-cascade-layers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.2.tgz", + "integrity": "sha512-n5fSd3N/RTLjwC6TLnHjlVEt5tRg6S6Pu+LpRgXayX0QVJHvlMzE3+R12cd2F0we8WB4OE8o5r5iWgmBPpqUyQ==", "dev": true, "requires": { - "co": "^4.6.0", - "degenerator": "^1.0.4", - "ip": "^1.1.5", - "netmask": "^1.0.6", - "thunkify": "^2.1.2" + "@csstools/selector-specificity": "^1.0.0", + "postcss-selector-parser": "^6.0.10" } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, - "@fortawesome/fontawesome-pro": { - "version": "5.14.0", - "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-pro/-/5.14.0/fontawesome-pro-5.14.0.tgz", - "integrity": "sha512-mdxmCa8yHPXaM5WTRskL1iQf6JObI+l7R0Qa0/u9QOpmRUBkv1g/B3q+YQPaQmZOUy/5gZD9iwun5x4IELusWA==", - "dev": true - }, - "@juggle/resize-observer": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-2.5.0.tgz", - "integrity": "sha512-Nmkeaj5LalJeciRVEqi9Uxi61r0LvGc2yhUCykhXuft9fMyb/6VkZbwJ+UmUl8bk2k6qhwd1qJw6S2YJ0joXlA==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "@csstools/postcss-color-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", + "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "@csstools/postcss-font-format-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", + "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" + "postcss-value-parser": "^4.2.0" } }, - "@npmcli/move-file": { + "@csstools/postcss-hwb-function": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz", + "integrity": "sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg==", "dev": true, "requires": { - "mkdirp": "^1.0.4" + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", + "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-is-pseudo-class": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.4.tgz", + "integrity": "sha512-T2Tmr5RIxkCEXxHwMVyValqwv3h5FTJPpmU8Mq/HDV+TY6C9srVaNMiMG/sp0QaxUnVQQrnXsuLU+1g2zrLDcQ==", + "dev": true, + "requires": { + "@csstools/selector-specificity": "^1.0.0", + "postcss-selector-parser": "^6.0.10" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", + "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", + "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@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, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz", + "integrity": "sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.1.tgz", + "integrity": "sha512-G78CY/+GePc6dDCTUbwI6TTFQ5fs3N9POHhI6v0QzteGpf6ylARiJUNz9HrRKi4eVYBNXjae1W2766iUEFxHlw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-unset-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz", + "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==", + "dev": true + }, + "@csstools/selector-specificity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz", + "integrity": "sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 } } }, - "@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==", + "@fortawesome/fontawesome-pro": { + "version": "6.1.1", + "resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-pro/-/6.1.1/fontawesome-pro-6.1.1.tgz", + "integrity": "sha512-0w6GM8sCXNpcBLUz4bx61JvjjoCvfEIz5wBz2KjLNw9qk1F2XiUWuifXobvLbwaA7kqPGBRPo3U8Zw7zyaJ9sA==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", "dev": true, "requires": { - "any-observable": "^0.3.0" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", + "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", + "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", + "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@juggle/resize-observer": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.3.1.tgz", + "integrity": "sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==" + }, + "@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "dev": true, + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" } }, "@sindresorhus/df": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-2.1.0.tgz", - "integrity": "sha1-0gjPJ+BvC7R20U197M19cm6ao4k=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-3.1.1.tgz", + "integrity": "sha512-SME/vtXaJcnQ/HpeV6P82Egy+jThn11IKfwW8+/XVoRD0rmPHVTeKMtww1oWdVnMykzVPjmrDN9S8NBndPEHCQ==", "dev": true, "requires": { - "execa": "^0.2.2" + "execa": "^2.0.1" }, "dependencies": { "execa": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.2.2.tgz", - "integrity": "sha1-4urUcsLDGq1vc/GslW7vReEjIMs=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn-async": "^2.1.1", - "npm-run-path": "^1.0.0", - "object-assign": "^4.0.1", - "path-key": "^1.0.0", - "strip-eof": "^1.0.0" + "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" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" } }, "npm-run-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", - "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", + "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, "requires": { - "path-key": "^1.0.0" + "path-key": "^3.0.0" } }, - "path-key": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", - "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", + "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 } } @@ -2672,56 +1917,124 @@ "integrity": "sha512-X1Iui3FUNZP18EUvysTHxt+Avu2nlVzyf90YM8OYgP6SGzTzzX/0JgObfO1AQQDzuZtNNz29bVh8h5R97JrjxA==", "dev": true }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "@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 }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", + "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "requires": { "@types/minimatch": "*", "@types/node": "*" } }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "@types/node": { - "version": "14.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", - "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", + "version": "17.0.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", + "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", "dev": true }, "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/parse-json": { @@ -2730,257 +2043,184 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", - "dev": true - }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.3.tgz", - "integrity": "sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "@types/webpack": { - "version": "4.41.22", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.22.tgz", - "integrity": "sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ==", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "@types/webpack-sources": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-1.4.2.tgz", - "integrity": "sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw==", + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", + "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", "dev": true, "requires": { "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "tapable": "^2.2.0", + "webpack": "^5" } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -3004,93 +2244,53 @@ } }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "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==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true }, "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - } - } - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" } }, "aggregate-error": { @@ -3104,9 +2304,9 @@ } }, "ajv": { - "version": "6.12.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", - "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -3115,11 +2315,34 @@ "uri-js": "^4.2.2" } }, - "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 + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } + } }, "ajv-keywords": { "version": "3.5.2", @@ -3127,234 +2350,103 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "alphanum-sort": { - "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.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "color-convert": "^1.9.0" - } - }, - "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 - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "type-fest": "^0.21.3" }, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "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 } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "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 + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "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 - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "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 }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "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.1" - } - }, "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.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, "asynckit": { @@ -3363,31 +2455,45 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.4.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", + "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", + "browserslist": "^4.20.3", + "caniuse-lite": "^1.0.30001335", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001344", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", + "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.141", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", + "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==", + "dev": true + } } }, "aws-sign2": { @@ -3397,47 +2503,25 @@ "dev": true }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dev": true, "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - } + "follow-redirects": "^1.14.0" } }, + "b4a": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.3.1.tgz", + "integrity": "sha512-ULHjbJGjZcdA5bugDNAAcMA6GWXX/9N10I6AQc14TH+Sr7bMfT+NHuJnOFGPJWLtzYa6Tz+PnFD2D/1bISLLZQ==" + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -3524,42 +2608,57 @@ "source-map": "^0.5.7" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true - } - } - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -3584,9 +2683,26 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "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 } } }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, "babel-helper-call-delegate": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", @@ -3611,6 +2727,17 @@ "lodash": "^4.17.4" } }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", @@ -3665,6 +2792,19 @@ "lodash": "^4.17.4" } }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, "babel-helper-replace-supers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", @@ -3690,93 +2830,15 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - } } }, "babel-messages": { @@ -3806,6 +2868,50 @@ "object.assign": "^4.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "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-decorators": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", @@ -3818,6 +2924,29 @@ "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-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, "babel-plugin-transform-decorators-legacy": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", @@ -4097,6 +3226,17 @@ } } }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, "babel-plugin-transform-regenerator": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", @@ -4129,6 +3269,62 @@ "babel-types": "^6.24.1" } }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "babel-preset-es2015": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", @@ -4177,10 +3373,34 @@ }, "dependencies": { "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true + }, + "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": { + "minimist": "^1.2.6" + } + }, + "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-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } } } }, @@ -4195,9 +3415,9 @@ }, "dependencies": { "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true }, "regenerator-runtime": { @@ -4238,11 +3458,26 @@ "lodash": "^4.17.4" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -4272,83 +3507,10 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "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 - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "base64id": { @@ -4357,12 +3519,6 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -4372,15 +3528,6 @@ "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4398,258 +3545,127 @@ } }, "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "blake2b": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.3.tgz", - "integrity": "sha512-pkDss4xFVbMb4270aCyGD3qLv92314Et+FsKzilCLxDz5DuZ2/1g3w4nmBbu6nKApPspnjG7JcwTjGZnduB1yg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz", + "integrity": "sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==", "requires": { - "blake2b-wasm": "^1.1.0", - "nanoassert": "^1.0.0" + "blake2b-wasm": "^2.4.0", + "nanoassert": "^2.0.0" } }, "blake2b-wasm": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-1.1.7.tgz", - "integrity": "sha512-oFIHvXhlz/DUgF0kq5B1CqxIDjIJwh9iDeUUGQUcvgiGz7Wdw03McEO7CfLBy7QKGdsydcMCgO9jFNBAFCtFcA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", "requires": { - "nanoassert": "^1.0.0" + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { - "bytes": "3.0.0", + "bytes": "3.1.2", "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" + "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.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" + "fill-range": "^7.0.1" } }, "browserslist": { - "version": "4.14.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", - "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001135", - "electron-to-chromium": "^1.3.571", - "escalade": "^3.1.0", - "node-releases": "^1.1.61" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", + "escalade": "^3.1.1", + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffers": { @@ -4658,133 +3674,22 @@ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", "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 - }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "@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.0", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "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, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4792,21 +3697,15 @@ "dev": true }, "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, "camelcase-keys": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", @@ -4816,6 +3715,14 @@ "camelcase": "^5.3.1", "map-obj": "^4.0.0", "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } } }, "caniuse-api": { @@ -4831,9 +3738,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001257", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz", - "integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==", + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", "dev": true }, "caseless": { @@ -4842,257 +3749,12 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "cbt_tunnels": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cbt_tunnels/-/cbt_tunnels-1.2.2.tgz", - "integrity": "sha512-It5l8LOYdmqrfVjx7BvMSuFd9QGQt9QAShmXZ48XHXdxoe5TQnA9xQDvKgjaRd40jKBK23Dd5V7ZZdgEGAeV+A==", - "dev": true, + "chacha20-universal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chacha20-universal/-/chacha20-universal-1.0.4.tgz", + "integrity": "sha512-/IOxdWWNa7nRabfe7+oF+jVkGjlr2xUL4J8l/OvzZhj+c9RpMqoo3Dq+5nU1j/BflRV4BKnaQ4+4oH1yBpQG1Q==", "requires": { - "@crossbrowsertesting/pac-resolver": "3.0.1", - "cli-color": "1.1.0", - "clui": "0.3.1", - "express": "4.16.3", - "https-proxy-agent": "^3.0.1", - "lodash": "4.17.15", - "log4js": "3.0.3", - "request": "2.87.0", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "ws": "6.0.0", - "yargs": "12.0.1" - }, - "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 - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "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 - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.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.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" - } - }, - "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 - }, - "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" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "yargs": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", - "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - } - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "nanoassert": "^2.0.0" } }, "chainsaw": { @@ -5105,30 +3767,29 @@ } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "changelog-parser": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-2.8.0.tgz", - "integrity": "sha512-ZtSwN0hY7t+WpvaXqqXz98RHCNhWX9HsvCRAv1aBLlqJ7BpKtqdM6Nu6JOiUhRAWR7Gov0aN0fUnmflTz0WgZg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-2.8.1.tgz", + "integrity": "sha512-tNUYFRCEeWTXmwLqoNtOEzx9wcytg72MmGQqsEs14ClYwIDln7sbQw7FJj/dulXgSlsxkemc9gpPQhZYZx1TPw==", "dev": true, "requires": { "line-reader": "^0.2.4", "remove-markdown": "^0.2.2" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "charcodes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", + "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", "dev": true }, "cheerio": { @@ -5155,6 +3816,35 @@ "lodash.some": "^4.4.0" }, "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "2.0.1" + }, + "dependencies": { + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + } + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, "dom-serializer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", @@ -5165,117 +3855,90 @@ "entities": "^1.1.1" } }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - } - } - }, - "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 - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" } } } }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", + "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", "dev": true, "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "clean-stack": { @@ -5285,114 +3948,76 @@ "dev": true }, "clean-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", "dev": true, "requires": { - "@types/webpack": "^4.4.31", "del": "^4.1.1" } }, - "cli-color": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.1.0.tgz", - "integrity": "sha1-3hiM3Ekp2DtnrqBBEPvtQP2/Z3U=", - "dev": true, - "requires": { - "ansi-regex": "2", - "d": "^0.1.1", - "es5-ext": "^0.10.8", - "es6-iterator": "2", - "memoizee": "^0.3.9", - "timers-ext": "0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" } }, "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^6.0.1" } } } }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "clone-deep": { @@ -5406,107 +4031,31 @@ "shallow-clone": "^3.0.0" } }, - "clui": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/clui/-/clui-0.3.1.tgz", - "integrity": "sha1-AT0ILOht2/BguG05J/iauMM79CM=", - "dev": true, - "requires": { - "cli-color": "0.3.2" - }, - "dependencies": { - "cli-color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.2.tgz", - "integrity": "sha1-dfpfcowwjMSsWUsF4GzF2A2szYY=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.2", - "memoizee": "0.3.x", - "timers-ext": "0.1.x" - } - } - } - }, - "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": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "colord": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", + "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", + "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "combined-stream": { @@ -5519,9 +4068,9 @@ } }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz", + "integrity": "sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==", "dev": true }, "commondir": { @@ -5540,33 +4089,12 @@ "dot-prop": "^5.1.0" } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5583,19 +4111,6 @@ "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "connect": { @@ -5610,47 +4125,23 @@ "utils-merge": "1.0.1" }, "dependencies": { - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "ms": "2.0.0" } }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "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 - }, - "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=", - "dev": true - }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -5658,9 +4149,9 @@ "dev": true }, "conventional-changelog": { - "version": "3.1.24", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", - "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, "requires": { "conventional-changelog-angular": "^5.0.12", @@ -5674,35 +4165,12 @@ "conventional-changelog-jquery": "^3.0.11", "conventional-changelog-jshint": "^2.0.9", "conventional-changelog-preset-loader": "^2.3.4" - }, - "dependencies": { - "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-conventionalcommits": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", - "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - } } }, "conventional-changelog-angular": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz", - "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -5734,9 +4202,9 @@ "dev": true }, "conventional-changelog-conventionalcommits": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz", - "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -5745,16 +4213,16 @@ } }, "conventional-changelog-core": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz", - "integrity": "sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "requires": { "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.18", + "conventional-changelog-writer": "^5.0.0", "conventional-commits-parser": "^3.2.0", "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", + "get-pkg-repo": "^4.0.0", "git-raw-commits": "^2.0.8", "git-remote-origin-url": "^2.0.0", "git-semver-tags": "^4.1.1", @@ -5763,53 +4231,22 @@ "q": "^1.5.1", "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", - "shelljs": "^0.8.3", "through2": "^4.0.0" }, "dependencies": { - "conventional-commits-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "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": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", - "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - } - } + "locate-path": "^2.0.0" } }, "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "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, "requires": { "lru-cache": "^6.0.0" @@ -5834,99 +4271,15 @@ "yallist": "^4.0.0" } }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "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" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "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, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "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 - } - } - }, - "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, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "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 - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "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, "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, @@ -5987,9 +4340,9 @@ }, "dependencies": { "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "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 }, "normalize-package-data": { @@ -6020,65 +4373,7 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" - }, - "dependencies": { - "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" - } - } } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true } } }, @@ -6135,15 +4430,14 @@ "dev": true }, "conventional-changelog-writer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", - "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "requires": { - "compare-func": "^2.0.0", "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", - "handlebars": "^4.7.6", + "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", "meow": "^8.0.0", @@ -6152,102 +4446,10 @@ "through2": "^4.0.0" }, "dependencies": { - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "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" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -6263,578 +4465,175 @@ } }, "conventional-commits-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", - "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "conventional-recommended-bump": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.11.tgz", - "integrity": "sha512-FciYBMwzwwBZ1K4NS8c57rsOfSc51e1V6UVSNIosrjH+A6xXkyiA4ELwoWyRKdMhJ+m3O6ru9ZJ7F2QFjjYJdQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, "requires": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^2.3.4", "conventional-commits-filter": "^2.0.7", "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "2.0.0", + "git-raw-commits": "^2.0.8", "git-semver-tags": "^4.1.1", "meow": "^8.0.0", "q": "^1.5.1" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "conventional-commits-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^1.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" - } - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.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" - } - }, - "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", - "dev": true, - "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" - } - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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 - }, - "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" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "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" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "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-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "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-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" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "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.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "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 } } }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "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" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "copy-webpack-plugin": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.1.1.tgz", - "integrity": "sha512-4TlkHFYkrZ3WppLA5XkPmBLI5lnEpFsXvpeqxCf5PzkratZiVklNXsvoQkLhUU43q7ZL3AOXtaHAd9jLNJoU0w==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, "requires": { - "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", + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^2.7.1", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "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 - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.1.tgz", + "integrity": "sha512-XMzoDZbGZ37tufiv7g0N4F/zp3zkwdFtVbV3EHsVl1KQr4RPLfNoT068/97RPshz2J5xYNEjLKKBKaGHifBd3Q==", "dev": true, "requires": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" } }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } + "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 }, - "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==", + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", - "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "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, - "requires": { - "find-up": "^4.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true } } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "version": "3.22.8", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", + "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.22.7", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.7.tgz", + "integrity": "sha512-uI9DAQKKiiE/mclIC5g4AjRpio27g+VMRhe6rQoz+q4Wm4L6A/fJhiLtBw+sfOpDG9wZ3O0pxIw7GbfOlBgjOA==", "dev": true, "requires": { - "browserslist": "^4.8.5", + "browserslist": "^4.20.3", "semver": "7.0.0" }, "dependencies": { + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.4.141", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.141.tgz", + "integrity": "sha512-mfBcbqc0qc6RlxrsIgLG2wCqkiPAjEezHxGTu7p3dHHFOurH4EjS9rFZndX5axC8264rI1Pcbw8uQP39oZckeA==", + "dev": true + }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -6844,15 +4643,25 @@ } }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -6862,265 +4671,106 @@ "yaml": "^1.10.0" } }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "cosmiconfig-typescript-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.1.tgz", + "integrity": "sha512-B9s6sX/omXq7I6gC6+YgLmrBFMJhPWew7ty/X5Tuwtd2zOSgWaUdXjkuVwbe3qqcdETo60+1nSVMekq//LIXVA==", "dev": true, "requires": { - "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" + "cosmiconfig": "^7", + "ts-node": "^10.8.0" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "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=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cross-spawn-async": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", - "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", - "dev": true, - "requires": { - "lru-cache": "^4.0.0", - "which": "^1.2.8" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "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, "requires": { - "postcss": "^7.0.5" + "postcss-selector-parser": "^6.0.9" } }, - "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-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz", + "integrity": "sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg==", + "dev": true }, "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.9" } }, "css-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", - "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", "dev": true, "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "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 - }, - "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, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "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.2.0", + "semver": "^7.3.5" } }, "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "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 }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "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, "requires": { - "mdn-data": "2.0.4", + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "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, + "requires": { + "mdn-data": "2.0.14", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "css.escape": { @@ -7129,9 +4779,9 @@ "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" }, "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz", + "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==", "dev": true }, "cssesc": { @@ -7141,185 +4791,74 @@ "dev": true }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.7.tgz", + "integrity": "sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "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" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "cssnano-preset-default": "^5.2.7", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz", + "integrity": "sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA==", "dev": true, "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "^6.2.2", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.0", + "postcss-discard-comments": "^5.1.1", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.4", + "postcss-merge-rules": "^5.1.1", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.2", + "postcss-minify-selectors": "^5.2.0", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.0", + "postcss-normalize-repeat-style": "^5.1.0", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.1", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" } }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "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 }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "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.1" + "css-tree": "^1.1.2" } }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", - "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, "dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -7335,16 +4874,10 @@ "assert-plus": "^1.0.0" } }, - "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 - }, "date-format": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", - "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.10.tgz", + "integrity": "sha512-RuMIHocrVjF84bUSTcd1uokIsLsOsk1Awb7TexNOI3f48ukCu39mjslWquDTA08VaDMF2umr3MB9ow5EyJTWyA==", "dev": true }, "dateformat": { @@ -7354,24 +4887,24 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decamelize-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", "dev": true, "requires": { "decamelize": "^1.1.0", @@ -7386,83 +4919,20 @@ } } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "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=", + "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 }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", "dev": true, "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "requires": { - "ast-types": "0.x.x", - "escodegen": "1.x.x", - "esprima": "3.x.x" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -7478,6 +4948,86 @@ "p-map": "^2.0.0", "pify": "^4.0.1", "rimraf": "^2.6.3" + }, + "dependencies": { + "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.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "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.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^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 + } + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "delayed-stream": { @@ -7486,32 +5036,10 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-indent": { @@ -7532,27 +5060,14 @@ "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true }, "dir-glob": { "version": "3.0.1", @@ -7584,7 +5099,7 @@ "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "requires": { "custom-event": "~1.0.0", @@ -7594,52 +5109,50 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", - "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", - "dev": true - } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, "dot-prop": { @@ -7661,6 +5174,16 @@ "minimatch": "^3.0.4" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -7680,6 +5203,24 @@ "path-exists": "^3.0.0" } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -7697,17 +5238,11 @@ } } }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "ecc-jsbn": { "version": "0.1.2", @@ -7726,40 +5261,11 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.572", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.572.tgz", - "integrity": "sha512-TKqdEukCCl7JC20SwEoWTbtnGt4YjfHWAv4tcNky0a9qGo0WdM+Lrd60tps+nkaJCmktKBJjr99fLtEBU1ipWQ==", + "version": "1.4.114", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.114.tgz", + "integrity": "sha512-gRwLpVYWHGbERPU6o8pKfR168V6enWEXzZc6zQNNXbgJ7UJna+9qzAIHY94+9KOv71D/CH+QebLA9pChD2q8zA==", "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.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7788,121 +5294,37 @@ } }, "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "0.3.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "^7.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~6.1.0", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" } }, "engine.io-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", - "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "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, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, "ent": { @@ -7912,19 +5334,16 @@ "dev": true }, "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true }, "error-ex": { "version": "1.3.2", @@ -7936,25 +5355,39 @@ } }, "es-abstract": { - "version": "1.18.0-next.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz", - "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -7966,116 +5399,10 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - }, - "dependencies": { - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - } - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - }, - "dependencies": { - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - } - } - }, - "es6-weak-map": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", - "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.6", - "es6-iterator": "~0.1.3", - "es6-symbol": "~2.0.1" - }, - "dependencies": { - "es6-iterator": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", - "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5", - "es6-symbol": "~2.0.1" - } - }, - "es6-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", - "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.5" - } - } - } - }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, "escape-html": { @@ -8090,190 +5417,185 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "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, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz", + "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.6", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "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 - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "strip-ansi": { + "escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", + "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 } } }, "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==", + "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, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } } }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8288,9 +5610,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8307,34 +5629,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "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", - "es5-ext": "~0.10.14" - }, - "dependencies": { - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - } - } - }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -8342,139 +5636,32 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "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.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "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.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true } } @@ -8485,123 +5672,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "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" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -8615,71 +5685,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -8691,190 +5706,162 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-loader": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz", - "integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dev": true, "requires": { - "loader-utils": "^1.4.0", - "schema-utils": "^2.5.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } } } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" - } - }, - "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, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "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, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" }, "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "glob": "^7.1.3" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true } } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "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, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "forever-agent": { @@ -8894,81 +5881,21 @@ "mime-types": "^2.1.12" } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "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, "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "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 - } - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "fs-readdir-recursive": { @@ -8977,18 +5904,6 @@ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "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": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8996,15 +5911,11 @@ "dev": true }, "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } + "optional": true }, "fstream": { "version": "1.0.12", @@ -9016,6 +5927,59 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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": { + "minimist": "^1.2.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "function-bind": { @@ -9027,24 +5991,13 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, - "g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - } - }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "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 }, "get-caller-file": { @@ -9053,185 +6006,75 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "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 - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "requires": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" }, "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "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 }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "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 - }, - "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.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "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.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^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.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "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" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "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" + "safe-buffer": "~5.1.0" } }, "through2": { @@ -9244,31 +6087,32 @@ "xtend": "~4.0.1" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, - "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "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 - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } }, "getpass": { "version": "0.1.7", @@ -9280,16 +6124,16 @@ } }, "git-raw-commits": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz", - "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "requires": { "dargs": "^7.0.0", - "lodash.template": "^4.0.2", - "meow": "^7.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0" + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, "git-remote-origin-url": { @@ -9320,82 +6164,10 @@ "semver": "^6.0.0" }, "dependencies": { - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "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" - } - }, - "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", - "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -9407,86 +6179,43 @@ "dev": true, "requires": { "ini": "^1.3.2" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "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, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "globals": { "version": "11.12.0", @@ -9494,37 +6223,16 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "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.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^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 - } - } - }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -9532,14 +6240,6 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "har-schema": { @@ -9548,42 +6248,6 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "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.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "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 - } - } - }, "hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -9616,111 +6280,40 @@ } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-value": { + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "has-symbols": "^1.0.2" } }, "he": { @@ -9729,23 +6322,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "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 - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -9756,188 +6332,71 @@ "os-tmpdir": "^1.0.1" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "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, - "requires": { - "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" + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } - } } } }, "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "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 - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "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.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - } + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true } } @@ -9964,283 +6423,40 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "https-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, "husky": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/husky/-/husky-2.7.0.tgz", - "integrity": "sha512-LIi8zzT6PyFpcYKdvWRCn/8X+6SuG2TgYYMrM6ckEYhlp44UcEduVymZGIZNLiwOUjrEud+78w/AsAiqJA/kRg==", - "dev": true, - "requires": { - "cosmiconfig": "^5.2.0", - "execa": "^1.0.0", - "find-up": "^3.0.0", - "get-stdin": "^7.0.0", - "is-ci": "^2.0.0", - "pkg-dir": "^4.1.0", - "please-upgrade-node": "^3.1.1", - "read-pkg": "^5.1.1", - "run-node": "^1.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "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" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-stdin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", - "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", - "dev": true - }, - "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, - "requires": { - "pump": "^3.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "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, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^4.1.0" - } - }, - "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, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - } - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "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==", - "dev": true - }, - "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=", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.1.tgz", + "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", "dev": true }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -10255,37 +6471,20 @@ } } }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { @@ -10294,24 +6493,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "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 - }, - "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 - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10328,89 +6509,21 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", "dev": true, "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "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 - }, - "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 - }, - "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": { - "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" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - } + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, "invariant": { @@ -10422,157 +6535,64 @@ "loose-envify": "^1.0.0" } }, - "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.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "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-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-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=", + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "has-bigints": "^1.0.1" } }, - "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { - "ci-info": "^2.0.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "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" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "has-tostringtag": "^1.0.0" } }, - "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-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", @@ -10592,38 +6612,33 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "has-tostringtag": "^1.0.0" } }, "is-obj": { @@ -10632,15 +6647,6 @@ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, - "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, - "requires": { - "symbol-observable": "^1.1.0" - } - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -10654,16 +6660,24 @@ "dev": true, "requires": { "is-path-inside": "^2.1.0" + }, + "dependencies": { + "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, + "requires": { + "path-is-inside": "^1.0.2" + } + } } }, "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, - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-obj": { "version": "1.1.0", @@ -10680,55 +6694,47 @@ "isobject": "^3.0.1" } }, - "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 - }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "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.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { - "html-comment-regex": "^1.1.0" + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" } }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-text-path": { @@ -10746,23 +6752,14 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "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": { + "is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "isarray": { "version": "1.0.0", @@ -10771,9 +6768,9 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true }, "isexe": { @@ -10795,31 +6792,26 @@ "dev": true }, "jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.1.tgz", + "integrity": "sha512-lmUfT5XcK9KKvt3lLYzn93hc4MGzlUBowExFVgzbSW0ZCrdeyS574dfsyfRhxbg81Wj4gk+RxUiTnj7KBfDA1g==", "dev": true }, "jest-worker": { - "version": "25.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", - "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { + "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -10828,9 +6820,9 @@ } }, "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==" }, "js-tokens": { "version": "4.0.0", @@ -10839,21 +6831,12 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } + "argparse": "^2.0.1" } }, "jsbn": { @@ -10881,9 +6864,9 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -10895,7 +6878,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-safe": { @@ -10905,22 +6888,19 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "jsonparse": { @@ -10930,333 +6910,126 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, "karma": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.2.tgz", - "integrity": "sha512-rB3Ua5yDxmIupTj67r3Q8itz7TxJzRE6DmVcOfV20D509Uu9AoBKlVwbZhND4kcm6BqLfbHtv4DZC9QJfrUY+w==", + "version": "6.3.20", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", + "integrity": "sha512-HRNQhMuKOwKpjYlWiJP0DUrJOh+QjaI/DTaD8b9rEm4Il3tJ8MijutVZH4ts10LuUFst/CedwTS6vieCN8yTSw==", "dev": true, "requires": { + "@colors/colors": "1.5.0", "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.4.2", - "colors": "^1.4.0", + "chokidar": "^3.5.1", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.19", - "log4js": "^6.2.1", - "mime": "^2.4.5", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^2.3.0", + "socket.io": "^4.4.1", "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" }, "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "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" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "brace-expansion": "^1.1.7" } }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "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": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "minimist": "^1.2.6" } }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" + "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" } } } }, "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", "dev": true, "requires": { - "fs-access": "^1.0.0", "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "karma-cli": { @@ -11269,18 +7042,18 @@ } }, "karma-jasmine": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", - "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.1.tgz", + "integrity": "sha512-FkL1Kk+JAKmim8VWU8RXKZBpl0lLI7J8LijM0/q7oP7emfB6QMZV1Az+JgqGKSLpF0tYaav+KUVFQroZUxQTHA==", "dev": true, "requires": { - "jasmine-core": "^3.3" + "jasmine-core": "^4.1.0" } }, "karma-jasmine-html-reporter": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", - "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", + "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", "dev": true }, "karma-mocha-reporter": { @@ -11295,9 +7068,50 @@ }, "dependencies": { "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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "strip-ansi": { @@ -11308,21 +7122,62 @@ "requires": { "ansi-regex": "^3.0.0" } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "karma-webpack": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz", - "integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz", + "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==", "dev": true, "requires": { - "async": "^2.0.0", - "babel-runtime": "^6.0.0", - "loader-utils": "^1.0.0", - "lodash": "^4.0.0", - "source-map": "^0.5.6", - "webpack-dev-middleware": "^2.0.6" + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "webpack-merge": "^4.1.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "kind-of": { @@ -11331,6 +7186,12 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, "last-call-webpack-plugin": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", @@ -11341,40 +7202,22 @@ "webpack-sources": "^1.1.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } - }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true + }, "line-reader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.2.4.tgz", @@ -11382,315 +7225,162 @@ "dev": true }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "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 }, "lint-staged": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz", - "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.0.0.tgz", + "integrity": "sha512-vWban5utFt78VZohbosUxNIa46KKJ+KOQTDWTQ8oSl1DLEEVl9zhUtaQbiiydAmx+h2wKJK2d0+iMaRmknuWRQ==", "dev": true, "requires": { - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.2.0", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "listr-update-renderer": "^0.5.0", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "cli-truncate": "^3.1.0", + "colorette": "^2.0.16", + "commander": "^9.3.0", + "debug": "^4.3.4", + "execa": "^6.1.0", + "lilconfig": "2.0.5", + "listr2": "^4.0.5", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.2", + "pidtree": "^0.5.0", + "string-argv": "^0.3.1", + "yaml": "^2.1.1" }, "dependencies": { - "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 - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "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.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, "requires": { - "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" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" } }, "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, - "requires": { - "pump": "^3.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "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=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, - "parse-json": { + "lilconfig": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", + "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "dev": true + }, + "mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "path-key": "^4.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "yaml": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.1.tgz", + "integrity": "sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==", "dev": true } } }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", "dev": true, "requires": { - "@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" - } - }, - "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.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, - "requires": { - "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" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } - }, - "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.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=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, - "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, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - } - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -11722,52 +7412,35 @@ } }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } + "json5": "^2.1.2" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "lodash.assignin": { @@ -11785,7 +7458,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.defaults": { "version": "4.2.0", @@ -11864,25 +7537,6 @@ "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", "dev": true }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -11901,99 +7555,107 @@ "dev": true, "requires": { "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.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 - }, - "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 - }, - "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" - } - }, - "strip-ansi": { + "slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, "log4js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.3.tgz", - "integrity": "sha512-M08IQsdodHJGaNMgKb5YqSGiosrngoybVpm1F4Ff0UqcccnNRp92EayInmVawlbjEa9u9ZZVDT9rVNvdnOFiZQ==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", + "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", "dev": true, "requires": { - "circular-json": "^0.5.5", - "date-format": "^1.2.0", - "debug": "^3.1.0", - "streamroller": "0.7.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "loglevelnext": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", - "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", - "dev": true, - "requires": { - "es6-symbol": "^3.1.1", - "object.assign": "^4.1.0" + "date-format": "^4.0.10", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.1.1" } }, "loose-envify": { @@ -12005,80 +7667,44 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "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.0" - } - }, "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.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" + "tslib": "^2.0.3" } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "map-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", - "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "match-stream": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", @@ -12115,30 +7741,10 @@ } } }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.4" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "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 }, "media-typer": { @@ -12147,48 +7753,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "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.0.0" - } - }, - "memoizee": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", - "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", - "dev": true, - "requires": { - "d": "~0.1.1", - "es5-ext": "~0.10.11", - "es6-weak-map": "~0.1.4", - "event-emitter": "~0.3.4", - "lru-queue": "0.1", - "next-tick": "~0.2.2", - "timers-ext": "0.1" - }, - "dependencies": { - "next-tick": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", - "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=", - "dev": true - } - } - }, - "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.3", - "readable-stream": "^2.0.1" - } - }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12196,9 +7760,9 @@ "dev": true }, "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -12206,20 +7770,52 @@ "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.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.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "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, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "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 + } } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -12244,76 +7840,41 @@ "underscore": "*" } }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "min-indent": { @@ -12323,55 +7884,68 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", - "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz", + "integrity": "sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "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==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "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 + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minimist-options": { @@ -12385,139 +7959,11 @@ "kind-of": "^6.0.3" } }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "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, - "requires": { - "minipass": "^3.0.0" - } - }, - "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, - "requires": { - "minipass": "^3.0.0" - } - }, - "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, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "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" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "modify-values": { "version": "1.0.1", @@ -12526,9 +7972,9 @@ "dev": true }, "moment": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.0.tgz", - "integrity": "sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "mount-point": { "version": "3.0.0", @@ -12555,101 +8001,42 @@ } } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "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" - } - }, "move-file": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-1.2.0.tgz", - "integrity": "sha512-USHrRmxzGowUWAGBbJPdFjHzEqtxDU03pLHY0Rfqgtnq+q8FOIs8wvkkf+Udmg77SJKs47y9sI0jJvQeYsmiCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.1.0.tgz", + "integrity": "sha512-i9qLW6gqboJ5Ht8bauZi7KlTnQ3QFpBCvMvFfEcHADKgHGeJ9BZMO7SFCTwHPV9Qa0du9DYY1Yx3oqlGt30nXA==", "dev": true, "requires": { - "cp-file": "^6.1.0", - "make-dir": "^3.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "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-exists": "^4.0.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true, - "optional": true - }, "nanoassert": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", - "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { @@ -12658,24 +8045,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -12683,72 +8052,19 @@ "dev": true }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "lower-case": "^1.1.1" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "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, - "requires": { - "inherits": "2.0.3" - } - } + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, "node-releases": { - "version": "1.1.61", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", - "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", "dev": true }, "node-unzip-2": { @@ -12791,26 +8107,6 @@ } } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12823,210 +8119,295 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "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.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm": { - "version": "6.14.8", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz", - "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-8.12.1.tgz", + "integrity": "sha512-0yOlhfgu1UzP6UijnaFuIS2bES2H9D90EA5OVsf2iOZw7VBrjntXKEwKfCaFA6vMVWkCP8qnPwCxxPdnDVwlNw==", "requires": { - "JSONStream": "^1.3.5", + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^5.0.4", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/config": "^4.1.0", + "@npmcli/fs": "^2.1.0", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^3.0.1", "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "^2.0.0", "archy": "~1.0.0", - "bin-links": "^1.1.8", - "bluebird": "^3.5.5", - "byte-size": "^5.0.1", - "cacache": "^12.0.3", - "call-limit": "^1.1.1", - "chownr": "^1.1.4", - "ci-info": "^2.0.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.1", - "cmd-shim": "^3.0.3", - "columnify": "~1.5.4", - "config-chain": "^1.1.12", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.3.1", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.8.8", - "iferr": "^1.0.2", - "imurmurhash": "*", - "infer-owner": "^1.0.4", - "inflight": "~1.0.6", - "inherits": "^2.0.4", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^3.0.0", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^4.0.8", - "libnpm": "^3.0.1", - "libnpmaccess": "^3.0.2", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "libnpx": "^10.2.4", - "lock-verify": "^2.1.0", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^5.1.1", - "meant": "^1.0.2", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.5", - "move-concurrently": "^1.0.1", - "node-gyp": "^5.1.0", - "nopt": "^4.0.3", - "normalize-package-data": "^2.5.0", - "npm-audit-report": "^1.3.3", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "^3.0.2", - "npm-lifecycle": "^3.1.5", - "npm-package-arg": "^6.1.1", - "npm-packlist": "^1.4.8", - "npm-pick-manifest": "^3.0.2", - "npm-profile": "^4.0.4", - "npm-registry-fetch": "^4.0.7", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.1", - "osenv": "^0.1.5", - "pacote": "^9.5.12", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", + "cacache": "^16.1.0", + "chalk": "^4.1.2", + "chownr": "^2.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.2", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.12", + "glob": "^8.0.1", + "graceful-fs": "^4.2.10", + "hosted-git-info": "^5.0.0", + "ini": "^3.0.0", + "init-package-json": "^3.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "libnpmaccess": "^6.0.2", + "libnpmdiff": "^4.0.2", + "libnpmexec": "^4.0.2", + "libnpmfund": "^3.0.1", + "libnpmhook": "^8.0.2", + "libnpmorg": "^4.0.2", + "libnpmpack": "^4.0.2", + "libnpmpublish": "^6.0.2", + "libnpmsearch": "^5.0.2", + "libnpmteam": "^4.0.2", + "libnpmversion": "^3.0.1", + "make-fetch-happen": "^10.1.6", + "minipass": "^3.1.6", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^9.0.0", + "nopt": "^5.0.0", + "npm-audit-report": "^3.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.2", + "npm-pick-manifest": "^7.0.1", + "npm-profile": "^6.0.3", + "npm-registry-fetch": "^13.1.1", + "npm-user-validate": "^1.0.1", + "npmlog": "^6.0.2", + "opener": "^1.5.2", + "pacote": "^13.6.0", + "parse-conflict-json": "^2.0.2", + "proc-log": "^2.0.1", "qrcode-terminal": "^0.12.0", - "query-string": "^6.8.2", - "qw": "~1.0.1", "read": "~1.0.7", - "read-cmd-shim": "^1.0.5", - "read-installed": "~4.0.3", - "read-package-json": "^2.1.1", - "read-package-tree": "^5.3.1", - "readable-stream": "^3.6.0", + "read-package-json": "^5.0.1", + "read-package-json-fast": "^2.0.3", "readdir-scoped-modules": "^1.1.0", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "^2.7.1", - "safe-buffer": "^5.1.2", - "semver": "^5.7.1", - "sha": "^3.0.0", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.1", - "stringify-package": "^1.0.1", - "tar": "^4.4.13", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.1", + "tar": "^6.1.11", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", - "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "^1.1.1", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.3", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.7.0", - "write-file-atomic": "^2.4.3" + "treeverse": "^2.0.0", + "validate-npm-package-name": "^4.0.0", + "which": "^2.0.2", + "write-file-atomic": "^4.0.1" }, "dependencies": { - "JSONStream": { - "version": "1.3.5", + "@colors/colors": { + "version": "1.5.0", + "bundled": true, + "optional": true + }, + "@gar/promisify": { + "version": "1.1.3", + "bundled": true + }, + "@isaacs/string-locale-compare": { + "version": "1.1.0", + "bundled": true + }, + "@npmcli/arborist": { + "version": "5.2.1", "bundled": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^2.0.3", + "@npmcli/metavuln-calculator": "^3.0.1", + "@npmcli/move-file": "^2.0.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/package-json": "^2.0.0", + "@npmcli/run-script": "^3.0.0", + "bin-links": "^3.0.0", + "cacache": "^16.0.6", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "npm-install-checks": "^5.0.0", + "npm-package-arg": "^9.0.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.0", + "npmlog": "^6.0.2", + "pacote": "^13.0.5", + "parse-conflict-json": "^2.0.1", + "proc-log": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^9.0.0", + "treeverse": "^2.0.0", + "walk-up-path": "^1.0.0" } }, + "@npmcli/ci-detect": { + "version": "2.0.0", + "bundled": true + }, + "@npmcli/config": { + "version": "4.1.0", + "bundled": true, + "requires": { + "@npmcli/map-workspaces": "^2.0.2", + "ini": "^3.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "proc-log": "^2.0.0", + "read-package-json-fast": "^2.0.3", + "semver": "^7.3.5", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/disparity-colors": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-styles": "^4.3.0" + } + }, + "@npmcli/fs": { + "version": "2.1.0", + "bundled": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "3.0.1", + "bundled": true, + "requires": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "bundled": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "2.0.3", + "bundled": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^8.0.1", + "minimatch": "^5.0.1", + "read-package-json-fast": "^2.0.3" + } + }, + "@npmcli/metavuln-calculator": { + "version": "3.1.0", + "bundled": true, + "requires": { + "cacache": "^16.0.0", + "json-parse-even-better-errors": "^2.3.1", + "pacote": "^13.0.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.0", + "bundled": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "bundled": true + }, + "@npmcli/package-json": { + "version": "2.0.0", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.1" + } + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "bundled": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "3.0.2", + "bundled": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "bundled": true + }, "abbrev": { "version": "1.1.1", "bundled": true }, "agent-base": { - "version": "4.3.0", + "version": "6.0.2", "bundled": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" } }, "agentkeepalive": { - "version": "3.5.2", + "version": "4.2.1", "bundled": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, - "ajv": { - "version": "5.5.2", + "aggregate-error": { + "version": "3.1.0", "bundled": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-align": { - "version": "2.0.0", - "bundled": true, - "requires": { - "string-width": "^2.0.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ansi-regex": { - "version": "2.1.1", + "version": "5.0.1", "bundled": true }, "ansi-styles": { - "version": "3.2.1", + "version": "4.3.0", "bundled": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, - "ansicolors": { - "version": "0.3.2", - "bundled": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true - }, "aproba": { "version": "2.0.0", "bundled": true @@ -13036,242 +8417,112 @@ "bundled": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "3.0.0", "bundled": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "readable-stream": "^3.6.0" } }, "asap": { "version": "2.0.6", "bundled": true }, - "asn1": { - "version": "0.2.4", - "bundled": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true - }, - "aws-sign2": { - "version": "0.7.0", - "bundled": true - }, - "aws4": { - "version": "1.8.0", - "bundled": true - }, "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "bcrypt-pbkdf": { "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } + "bundled": true }, "bin-links": { - "version": "1.1.8", + "version": "3.0.1", "bundled": true, "requires": { - "bluebird": "^3.5.3", - "cmd-shim": "^3.0.0", - "gentle-fs": "^2.3.0", - "graceful-fs": "^4.1.15", + "cmd-shim": "^5.0.0", + "mkdirp-infer-owner": "^2.0.0", "npm-normalize-package-bin": "^1.0.0", - "write-file-atomic": "^2.3.0" + "read-cmd-shim": "^3.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^4.0.0" } }, - "bluebird": { - "version": "3.5.5", + "binary-extensions": { + "version": "2.2.0", "bundled": true }, - "boxen": { - "version": "1.3.0", - "bundled": true, - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, "brace-expansion": { - "version": "1.1.11", + "version": "2.0.1", "bundled": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, - "buffer-from": { - "version": "1.0.0", - "bundled": true - }, "builtins": { - "version": "1.0.3", - "bundled": true - }, - "byline": { - "version": "5.0.0", - "bundled": true - }, - "byte-size": { "version": "5.0.1", - "bundled": true - }, - "cacache": { - "version": "12.0.3", "bundled": true, "requires": { - "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" + "semver": "^7.0.0" } }, - "call-limit": { - "version": "1.1.1", - "bundled": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "capture-stack-trace": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "chalk": { - "version": "2.4.1", + "cacache": { + "version": "16.1.0", "bundled": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "chalk": { + "version": "4.1.2", + "bundled": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "chownr": { - "version": "1.1.4", - "bundled": true - }, - "ci-info": { "version": "2.0.0", "bundled": true }, "cidr-regex": { - "version": "2.0.10", + "version": "3.1.1", "bundled": true, "requires": { - "ip-regex": "^2.1.0" + "ip-regex": "^4.1.0" } }, - "cli-boxes": { - "version": "1.0.0", + "clean-stack": { + "version": "2.2.0", "bundled": true }, "cli-columns": { - "version": "3.1.2", + "version": "4.0.0", "bundled": true, "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" } }, "cli-table3": { - "version": "0.5.1", + "version": "0.6.2", "bundled": true, "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "bundled": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "3.1.0", - "bundled": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" } }, "clone": { @@ -13279,192 +8530,56 @@ "bundled": true }, "cmd-shim": { - "version": "3.0.3", + "version": "5.0.0", "bundled": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "mkdirp-infer-owner": "^2.0.0" } }, - "co": { - "version": "4.6.0", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, "color-convert": { - "version": "1.9.1", + "version": "2.0.1", "bundled": true, "requires": { - "color-name": "^1.1.1" + "color-name": "~1.1.4" } }, "color-name": { + "version": "1.1.4", + "bundled": true + }, + "color-support": { "version": "1.1.3", "bundled": true }, - "colors": { - "version": "1.3.3", - "bundled": true, - "optional": true - }, "columnify": { - "version": "1.5.4", + "version": "1.6.0", "bundled": true, "requires": { - "strip-ansi": "^3.0.0", + "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" } }, - "combined-stream": { - "version": "1.0.6", - "bundled": true, - "requires": { - "delayed-stream": "~1.0.0" - } + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true }, "concat-map": { "version": "0.0.1", "bundled": true }, - "concat-stream": { - "version": "1.6.2", - "bundled": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "config-chain": { - "version": "1.1.12", - "bundled": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "3.1.5", - "bundled": true, - "requires": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, "console-control-strings": { "version": "1.1.0", "bundled": true }, - "copy-concurrently": { - "version": "1.0.5", - "bundled": true, - "requires": { - "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" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "create-error-class": { - "version": "3.0.2", - "bundled": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "bundled": true - } - } - }, - "crypto-random-string": { - "version": "1.0.0", - "bundled": true - }, - "cyclist": { - "version": "0.2.2", - "bundled": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "debug": { - "version": "3.1.0", + "version": "4.3.4", "bundled": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" }, "dependencies": { "ms": { - "version": "2.0.0", + "version": "2.1.2", "bundled": true } } @@ -13473,18 +8588,6 @@ "version": "1.0.1", "bundled": true }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true - }, "defaults": { "version": "1.0.3", "bundled": true, @@ -13492,341 +8595,55 @@ "clone": "^1.0.2" } }, - "define-properties": { - "version": "1.1.3", - "bundled": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, "delegates": { "version": "1.0.0", "bundled": true }, - "detect-indent": { - "version": "5.0.0", - "bundled": true - }, - "detect-newline": { - "version": "2.1.0", + "depd": { + "version": "1.1.2", "bundled": true }, "dezalgo": { - "version": "1.0.3", + "version": "1.0.4", "bundled": true, "requires": { "asap": "^2.0.0", "wrappy": "1" } }, - "dot-prop": { - "version": "4.2.1", - "bundled": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "dotenv": { - "version": "5.0.1", - "bundled": true - }, - "duplexer3": { - "version": "0.1.4", - "bundled": true - }, - "duplexify": { - "version": "3.6.0", - "bundled": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editor": { - "version": "1.0.0", + "diff": { + "version": "5.0.0", "bundled": true }, "emoji-regex": { - "version": "7.0.3", + "version": "8.0.0", "bundled": true }, "encoding": { - "version": "0.1.12", + "version": "0.1.13", "bundled": true, + "optional": true, "requires": { - "iconv-lite": "~0.4.13" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "requires": { - "once": "^1.4.0" + "iconv-lite": "^0.6.2" } }, "env-paths": { - "version": "2.2.0", + "version": "2.2.1", "bundled": true }, "err-code": { - "version": "1.1.2", + "version": "2.0.3", "bundled": true }, - "errno": { - "version": "0.1.7", - "bundled": true, - "requires": { - "prr": "~1.0.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "bundled": 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.2.0", - "bundled": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", + "fastest-levenshtein": { + "version": "1.0.12", "bundled": true }, - "es6-promisify": { - "version": "5.0.0", - "bundled": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true - } - } - }, - "extend": { - "version": "3.0.2", - "bundled": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true - }, - "fast-deep-equal": { - "version": "1.1.0", - "bundled": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "bundled": true - }, - "figgy-pudding": { - "version": "3.5.1", - "bundled": true - }, - "find-npm-prefix": { - "version": "1.0.2", - "bundled": true - }, - "flush-write-stream": { - "version": "1.0.3", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.3.2", - "bundled": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" - } - }, - "from2": { - "version": "2.3.0", - "bundled": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "fs-minipass": { - "version": "1.2.7", + "version": "2.1.0", "bundled": true, "requires": { - "minipass": "^2.6.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "fs-vacuum": { - "version": "1.2.10", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "iferr": { - "version": "0.1.5", - "bundled": true - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "minipass": "^3.0.0" } }, "fs.realpath": { @@ -13838,141 +8655,34 @@ "bundled": true }, "gauge": { - "version": "2.7.4", + "version": "4.0.4", "bundled": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "genfun": { - "version": "5.0.0", - "bundled": true - }, - "gentle-fs": { - "version": "2.3.1", - "bundled": true, - "requires": { - "aproba": "^1.1.2", - "chownr": "^1.1.2", - "cmd-shim": "^3.0.3", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "infer-owner": "^1.0.4", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "iferr": { - "version": "0.1.5", - "bundled": true - } - } - }, - "get-caller-file": { - "version": "2.0.5", - "bundled": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0" + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" } }, "glob": { - "version": "7.1.6", + "version": "8.0.3", "bundled": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-dirs": { - "version": "0.1.1", - "bundled": true, - "requires": { - "ini": "^1.3.4" - } - }, - "got": { - "version": "6.7.1", - "bundled": true, - "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "bundled": true - } + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, "graceful-fs": { - "version": "4.2.4", + "version": "4.2.10", "bundled": true }, - "har-schema": { - "version": "2.0.0", - "bundled": true - }, - "har-validator": { - "version": "5.1.0", - "bundled": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "bundled": true, @@ -13981,11 +8691,7 @@ } }, "has-flag": { - "version": "3.0.0", - "bundled": true - }, - "has-symbols": { - "version": "1.0.0", + "version": "4.0.0", "bundled": true }, "has-unicode": { @@ -13993,36 +8699,31 @@ "bundled": true }, "hosted-git-info": { - "version": "2.8.8", - "bundled": true + "version": "5.0.0", + "bundled": true, + "requires": { + "lru-cache": "^7.5.1" + } }, "http-cache-semantics": { - "version": "3.8.1", + "version": "4.1.0", "bundled": true }, "http-proxy-agent": { - "version": "2.1.0", + "version": "5.0.0", "bundled": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" } }, "https-proxy-agent": { - "version": "2.2.4", + "version": "5.0.1", "bundled": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "agent-base": "6", + "debug": "4" } }, "humanize-ms": { @@ -14033,31 +8734,28 @@ } }, "iconv-lite": { - "version": "0.4.23", + "version": "0.6.3", "bundled": true, + "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "iferr": { - "version": "1.0.2", - "bundled": true - }, "ignore-walk": { - "version": "3.0.3", + "version": "5.0.1", "bundled": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "^5.0.1" } }, - "import-lazy": { - "version": "2.1.0", - "bundled": true - }, "imurmurhash": { "version": "0.1.4", "bundled": true }, + "indent-string": { + "version": "4.0.0", + "bundled": true + }, "infer-owner": { "version": "1.0.4", "bundled": true @@ -14075,753 +8773,455 @@ "bundled": true }, "ini": { - "version": "1.3.5", + "version": "3.0.0", "bundled": true }, "init-package-json": { - "version": "1.10.3", + "version": "3.0.2", "bundled": true, "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "npm-package-arg": "^9.0.1", "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "read": "^1.0.7", + "read-package-json": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^4.0.0" } }, "ip": { - "version": "1.1.5", + "version": "1.1.8", "bundled": true }, "ip-regex": { - "version": "2.1.0", + "version": "4.3.0", "bundled": true }, - "is-callable": { - "version": "1.1.4", - "bundled": true - }, - "is-ci": { - "version": "1.2.1", - "bundled": true, - "requires": { - "ci-info": "^1.5.0" - }, - "dependencies": { - "ci-info": { - "version": "1.6.0", - "bundled": true - } - } - }, "is-cidr": { - "version": "3.0.0", + "version": "4.0.2", "bundled": true, "requires": { - "cidr-regex": "^2.0.10" + "cidr-regex": "^3.1.1" } }, - "is-date-object": { - "version": "1.0.1", - "bundled": true + "is-core-module": { + "version": "2.9.0", + "bundled": true, + "requires": { + "has": "^1.0.3" + } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "bundled": true, - "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - } - }, - "is-npm": { - "version": "1.0.0", + "version": "3.0.0", "bundled": true }, - "is-obj": { + "is-lambda": { "version": "1.0.1", "bundled": true }, - "is-path-inside": { - "version": "1.0.1", - "bundled": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-redirect": { - "version": "1.0.0", - "bundled": true - }, - "is-regex": { - "version": "1.0.4", - "bundled": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-retry-allowed": { - "version": "1.2.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "is-symbol": { - "version": "1.0.2", - "bundled": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, "isexe": { "version": "2.0.0", "bundled": true }, - "isstream": { - "version": "0.1.2", + "json-parse-even-better-errors": { + "version": "2.3.1", "bundled": true }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "optional": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "bundled": true - }, - "json-stringify-safe": { - "version": "5.0.1", + "json-stringify-nice": { + "version": "1.1.4", "bundled": true }, "jsonparse": { "version": "1.3.1", "bundled": true }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "latest-version": { - "version": "3.1.0", - "bundled": true, - "requires": { - "package-json": "^4.0.0" - } - }, - "lazy-property": { - "version": "1.0.0", + "just-diff": { + "version": "5.0.2", "bundled": true }, - "libcipm": { - "version": "4.0.8", - "bundled": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "ini": "^1.3.5", - "lock-verify": "^2.1.0", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^9.1.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" - } - }, - "libnpm": { - "version": "3.0.1", - "bundled": true, - "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.3", - "find-npm-prefix": "^1.0.2", - "libnpmaccess": "^3.0.2", - "libnpmconfig": "^1.2.1", - "libnpmhook": "^5.0.3", - "libnpmorg": "^1.0.1", - "libnpmpublish": "^1.1.2", - "libnpmsearch": "^2.0.2", - "libnpmteam": "^1.0.2", - "lock-verify": "^2.0.2", - "npm-lifecycle": "^3.0.0", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "npm-profile": "^4.0.2", - "npm-registry-fetch": "^4.0.0", - "npmlog": "^4.1.2", - "pacote": "^9.5.3", - "read-package-json": "^2.0.13", - "stringify-package": "^1.0.0" - } + "just-diff-apply": { + "version": "5.2.0", + "bundled": true }, "libnpmaccess": { - "version": "3.0.2", + "version": "6.0.3", "bundled": true, "requires": { "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0" + "minipass": "^3.1.1", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0" } }, - "libnpmconfig": { - "version": "1.2.1", + "libnpmdiff": { + "version": "4.0.3", "bundled": true, "requires": { - "figgy-pudding": "^3.5.1", - "find-up": "^3.0.0", - "ini": "^1.3.5" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "bundled": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "bundled": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "bundled": true - } + "@npmcli/disparity-colors": "^2.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.0.0", + "minimatch": "^5.0.1", + "npm-package-arg": "^9.0.1", + "pacote": "^13.0.5", + "tar": "^6.1.0" + } + }, + "libnpmexec": { + "version": "4.0.6", + "bundled": true, + "requires": { + "@npmcli/arborist": "^5.0.0", + "@npmcli/ci-detect": "^2.0.0", + "@npmcli/run-script": "^3.0.0", + "chalk": "^4.1.0", + "mkdirp-infer-owner": "^2.0.0", + "npm-package-arg": "^9.0.1", + "npmlog": "^6.0.2", + "pacote": "^13.0.5", + "proc-log": "^2.0.0", + "read": "^1.0.7", + "read-package-json-fast": "^2.0.2", + "walk-up-path": "^1.0.0" + } + }, + "libnpmfund": { + "version": "3.0.2", + "bundled": true, + "requires": { + "@npmcli/arborist": "^5.0.0" } }, "libnpmhook": { - "version": "5.0.3", + "version": "8.0.3", "bundled": true, "requires": { "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "npm-registry-fetch": "^13.0.0" } }, "libnpmorg": { - "version": "1.0.1", + "version": "4.0.3", "bundled": true, "requires": { "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "npm-registry-fetch": "^13.0.0" + } + }, + "libnpmpack": { + "version": "4.1.0", + "bundled": true, + "requires": { + "@npmcli/run-script": "^3.0.0", + "npm-package-arg": "^9.0.1", + "pacote": "^13.5.0" } }, "libnpmpublish": { - "version": "1.1.2", + "version": "6.0.4", "bundled": true, "requires": { - "aproba": "^2.0.0", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "lodash.clonedeep": "^4.5.0", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^4.0.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" + "normalize-package-data": "^4.0.0", + "npm-package-arg": "^9.0.1", + "npm-registry-fetch": "^13.0.0", + "semver": "^7.3.7", + "ssri": "^9.0.0" } }, "libnpmsearch": { - "version": "2.0.2", + "version": "5.0.3", "bundled": true, "requires": { - "figgy-pudding": "^3.5.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "npm-registry-fetch": "^13.0.0" } }, "libnpmteam": { - "version": "1.0.2", + "version": "4.0.3", "bundled": true, "requires": { "aproba": "^2.0.0", - "figgy-pudding": "^3.4.1", - "get-stream": "^4.0.0", - "npm-registry-fetch": "^4.0.0" + "npm-registry-fetch": "^13.0.0" } }, - "libnpx": { - "version": "10.2.4", - "bundled": true, - "requires": { - "dotenv": "^5.0.1", - "npm-package-arg": "^6.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.0", - "update-notifier": "^2.3.0", - "which": "^1.3.0", - "y18n": "^4.0.0", - "yargs": "^14.2.3" - } - }, - "lock-verify": { - "version": "2.1.0", - "bundled": true, - "requires": { - "npm-package-arg": "^6.1.0", - "semver": "^5.4.1" - } - }, - "lockfile": { - "version": "1.0.4", - "bundled": true, - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash._baseindexof": { - "version": "3.1.0", - "bundled": true - }, - "lodash._baseuniq": { - "version": "4.6.0", - "bundled": true, - "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "lodash._bindcallback": { - "version": "3.0.1", - "bundled": true - }, - "lodash._cacheindexof": { - "version": "3.0.2", - "bundled": true - }, - "lodash._createcache": { - "version": "3.1.2", - "bundled": true, - "requires": { - "lodash._getnative": "^3.0.0" - } - }, - "lodash._createset": { - "version": "4.0.3", - "bundled": true - }, - "lodash._getnative": { - "version": "3.9.1", - "bundled": true - }, - "lodash._root": { - "version": "3.0.1", - "bundled": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "bundled": true - }, - "lodash.restparam": { - "version": "3.6.1", - "bundled": true - }, - "lodash.union": { - "version": "4.6.0", - "bundled": true - }, - "lodash.uniq": { - "version": "4.5.0", - "bundled": true - }, - "lodash.without": { - "version": "4.4.0", - "bundled": true - }, - "lowercase-keys": { - "version": "1.0.1", - "bundled": true - }, - "lru-cache": { - "version": "5.1.1", - "bundled": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-fetch-happen": { - "version": "5.0.2", - "bundled": true, - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - } - }, - "meant": { - "version": "1.0.2", - "bundled": true - }, - "mime-db": { - "version": "1.35.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.19", - "bundled": true, - "requires": { - "mime-db": "~1.35.0" - } - }, - "minimatch": { + "libnpmversion": { "version": "3.0.4", "bundled": true, "requires": { - "brace-expansion": "^1.1.7" + "@npmcli/git": "^3.0.0", + "@npmcli/run-script": "^3.0.0", + "json-parse-even-better-errors": "^2.3.1", + "proc-log": "^2.0.0", + "semver": "^7.3.7" } }, - "minimist": { - "version": "1.2.5", + "lru-cache": { + "version": "7.9.0", "bundled": true }, - "minizlib": { - "version": "1.3.3", + "make-fetch-happen": { + "version": "10.1.6", "bundled": true, "requires": { - "minipass": "^2.9.0" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^9.0.0" } }, - "mississippi": { - "version": "3.0.0", + "minimatch": { + "version": "5.1.0", "bundled": true, "requires": { - "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" + "brace-expansion": "^2.0.1" } }, - "mkdirp": { - "version": "0.5.5", + "minipass": { + "version": "3.1.6", "bundled": true, "requires": { - "minimist": "^1.2.5" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "bundled": true - } + "yallist": "^4.0.0" } }, - "move-concurrently": { + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "2.1.0", + "bundled": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { "version": "1.0.1", "bundled": true, "requires": { - "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" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true - } + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" } }, "ms": { - "version": "2.1.1", + "version": "2.1.3", "bundled": true }, "mute-stream": { - "version": "0.0.7", + "version": "0.0.8", "bundled": true }, - "node-fetch-npm": { - "version": "2.0.2", - "bundled": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } + "negotiator": { + "version": "0.6.3", + "bundled": true }, "node-gyp": { - "version": "5.1.0", + "version": "9.0.0", "bundled": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.1.2", - "request": "^2.88.0", - "rimraf": "^2.6.3", - "semver": "^5.7.1", - "tar": "^4.4.12", - "which": "^1.3.1" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "dependencies": { - "resolve": { - "version": "1.10.0", + "brace-expansion": { + "version": "1.1.11", "bundled": true, "requires": { - "path-parse": "^1.0.6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" } } } }, - "npm-audit-report": { - "version": "1.3.3", + "nopt": { + "version": "5.0.0", "bundled": true, "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "4.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + } + }, + "npm-audit-report": { + "version": "3.0.0", + "bundled": true, + "requires": { + "chalk": "^4.0.0" } }, "npm-bundled": { - "version": "1.1.1", + "version": "1.1.2", "bundled": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, - "npm-cache-filename": { - "version": "1.0.2", - "bundled": true - }, "npm-install-checks": { - "version": "3.0.2", + "version": "5.0.0", "bundled": true, "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" + "semver": "^7.1.1" } }, - "npm-lifecycle": { - "version": "3.1.5", - "bundled": true, - "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.15", - "node-gyp": "^5.0.2", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", - "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" - } - }, - "npm-logical-tree": { - "version": "1.2.1", - "bundled": true - }, "npm-normalize-package-bin": { "version": "1.0.1", "bundled": true }, "npm-package-arg": { - "version": "6.1.1", + "version": "9.0.2", "bundled": true, "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^4.0.0" } }, "npm-packlist": { - "version": "1.4.8", + "version": "5.1.0", "bundled": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^1.1.2", "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "3.0.2", + "version": "7.0.1", "bundled": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-install-checks": "^5.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^9.0.0", + "semver": "^7.3.5" } }, "npm-profile": { - "version": "4.0.4", + "version": "6.0.3", "bundled": true, "requires": { - "aproba": "^1.1.2 || 2", - "figgy-pudding": "^3.4.1", - "npm-registry-fetch": "^4.0.0" + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0" } }, "npm-registry-fetch": { - "version": "4.0.7", + "version": "13.1.1", "bundled": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "bundled": true - } - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "^2.0.0" + "make-fetch-happen": "^10.0.6", + "minipass": "^3.1.6", + "minipass-fetch": "^2.0.3", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^9.0.1", + "proc-log": "^2.0.0" } }, "npm-user-validate": { - "version": "1.0.0", - "bundled": true - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { "version": "1.0.1", "bundled": true }, - "oauth-sign": { - "version": "0.9.0", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "object-keys": { - "version": "1.0.12", - "bundled": true - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", + "npmlog": { + "version": "6.0.2", "bundled": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" } }, "once": { @@ -14832,150 +9232,66 @@ } }, "opener": { - "version": "1.5.1", + "version": "1.5.2", "bundled": true }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.5", + "p-map": { + "version": "4.0.0", "bundled": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "package-json": { - "version": "4.0.1", - "bundled": true, - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "aggregate-error": "^3.0.0" } }, "pacote": { - "version": "9.5.12", + "version": "13.6.0", "bundled": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", + "@npmcli/git": "^3.0.0", + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/run-script": "^3.0.1", + "cacache": "^16.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } + "minipass": "^3.1.6", + "mkdirp": "^1.0.4", + "npm-package-arg": "^9.0.0", + "npm-packlist": "^5.1.0", + "npm-pick-manifest": "^7.0.0", + "npm-registry-fetch": "^13.0.1", + "proc-log": "^2.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^5.0.0", + "read-package-json-fast": "^2.0.3", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11" } }, - "parallel-transform": { - "version": "1.1.0", + "parse-conflict-json": { + "version": "2.0.2", "bundled": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "json-parse-even-better-errors": "^2.3.1", + "just-diff": "^5.0.1", + "just-diff-apply": "^5.2.0" } }, - "path-exists": { - "version": "3.0.0", - "bundled": true - }, "path-is-absolute": { "version": "1.0.1", "bundled": true }, - "path-is-inside": { - "version": "1.0.2", - "bundled": true - }, - "path-key": { + "proc-log": { "version": "2.0.1", "bundled": true }, - "path-parse": { - "version": "1.0.6", + "promise-all-reject-late": { + "version": "1.0.1", "bundled": true }, - "performance-now": { - "version": "2.1.0", - "bundled": true - }, - "pify": { - "version": "3.0.0", - "bundled": true - }, - "prepend-http": { - "version": "1.0.4", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", + "promise-call-limit": { + "version": "1.0.1", "bundled": true }, "promise-inflight": { @@ -14983,17 +9299,11 @@ "bundled": true }, "promise-retry": { - "version": "1.1.1", + "version": "2.0.1", "bundled": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - }, - "dependencies": { - "retry": { - "version": "0.10.1", - "bundled": true - } + "err-code": "^2.0.2", + "retry": "^0.12.0" } }, "promzard": { @@ -15003,91 +9313,10 @@ "read": "1" } }, - "proto-list": { - "version": "1.2.4", - "bundled": true - }, - "protoduck": { - "version": "5.0.1", - "bundled": true, - "requires": { - "genfun": "^5.0.0" - } - }, - "prr": { - "version": "1.0.1", - "bundled": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "psl": { - "version": "1.1.29", - "bundled": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "bundled": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "bundled": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "bundled": true - }, "qrcode-terminal": { "version": "0.12.0", "bundled": true }, - "qs": { - "version": "6.5.2", - "bundled": true - }, - "query-string": { - "version": "6.8.2", - "bundled": true, - "requires": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "qw": { - "version": "1.0.1", - "bundled": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, "read": { "version": "1.0.7", "bundled": true, @@ -15096,43 +9325,25 @@ } }, "read-cmd-shim": { - "version": "1.0.5", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "read-installed": { - "version": "4.0.3", - "bundled": true, - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - } + "version": "3.0.0", + "bundled": true }, "read-package-json": { - "version": "2.1.1", + "version": "5.0.1", "bundled": true, "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1" } }, - "read-package-tree": { - "version": "5.3.1", + "read-package-json-fast": { + "version": "2.0.3", "bundled": true, "requires": { - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "util-promisify": "^2.1.0" + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" } }, "readable-stream": { @@ -15154,203 +9365,102 @@ "once": "^1.3.0" } }, - "registry-auth-token": { - "version": "3.4.0", - "bundled": true, - "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "registry-url": { - "version": "3.1.0", - "bundled": true, - "requires": { - "rc": "^1.0.1" - } - }, - "request": { - "version": "2.88.0", - "bundled": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "2.0.0", - "bundled": true - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true - }, "retry": { "version": "0.12.0", "bundled": true }, "rimraf": { - "version": "2.7.1", + "version": "3.0.2", "bundled": true, "requires": { "glob": "^7.1.3" - } - }, - "run-queue": { - "version": "1.0.3", - "bundled": true, - "requires": { - "aproba": "^1.1.1" }, "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "bundled": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, "safe-buffer": { - "version": "5.1.2", + "version": "5.2.1", "bundled": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "bundled": true, + "optional": true }, "semver": { - "version": "5.7.1", - "bundled": true - }, - "semver-diff": { - "version": "2.1.0", + "version": "7.3.7", "bundled": true, "requires": { - "semver": "^5.0.3" + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "set-blocking": { "version": "2.0.0", "bundled": true }, - "sha": { - "version": "3.0.0", - "bundled": true, - "requires": { - "graceful-fs": "^4.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true - }, "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "slide": { - "version": "1.1.6", + "version": "3.0.7", "bundled": true }, "smart-buffer": { - "version": "4.1.0", + "version": "4.2.0", "bundled": true }, "socks": { - "version": "2.3.3", + "version": "2.6.2", "bundled": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "4.0.2", + "version": "6.2.0", "bundled": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "bundled": true, - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "sorted-object": { - "version": "2.0.1", - "bundled": true - }, - "sorted-union-stream": { - "version": "2.1.3", - "bundled": true, - "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" - }, - "dependencies": { - "from2": { - "version": "1.3.0", - "bundled": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" - } - }, - "isarray": { - "version": "0.0.1", - "bundled": true - }, - "readable-stream": { - "version": "1.1.14", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "bundled": true - } + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" } }, "spdx-correct": { - "version": "3.0.0", + "version": "3.1.1", "bundled": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -15358,11 +9468,11 @@ } }, "spdx-exceptions": { - "version": "2.1.0", + "version": "2.3.0", "bundled": true }, "spdx-expression-parse": { - "version": "3.0.0", + "version": "3.0.1", "bundled": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -15370,104 +9480,23 @@ } }, "spdx-license-ids": { - "version": "3.0.5", + "version": "3.0.11", "bundled": true }, - "split-on-first": { - "version": "1.1.0", - "bundled": true - }, - "sshpk": { - "version": "1.14.2", - "bundled": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { - "version": "6.0.1", + "version": "9.0.1", "bundled": true, "requires": { - "figgy-pudding": "^3.5.1" + "minipass": "^3.1.1" } }, - "stream-each": { - "version": "1.2.2", - "bundled": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-iterate": { - "version": "1.2.0", - "bundled": true, - "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "bundled": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "bundled": true - }, "string-width": { - "version": "2.1.1", + "version": "4.2.3", "bundled": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "string_decoder": { @@ -15475,146 +9504,44 @@ "bundled": true, "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.0", - "bundled": true - } } }, - "stringify-package": { - "version": "1.0.1", - "bundled": true - }, "strip-ansi": { - "version": "3.0.1", + "version": "6.0.1", "bundled": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - }, "supports-color": { - "version": "5.4.0", + "version": "7.2.0", "bundled": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "tar": { - "version": "4.4.13", + "version": "6.1.11", "bundled": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "dependencies": { - "minipass": { - "version": "2.9.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - } - } - }, - "term-size": { - "version": "1.2.0", - "bundled": true, - "requires": { - "execa": "^0.7.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } }, "text-table": { "version": "0.2.0", "bundled": true }, - "through": { - "version": "2.3.8", - "bundled": true - }, - "through2": { - "version": "2.0.3", - "bundled": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "timed-out": { - "version": "4.0.1", - "bundled": true - }, "tiny-relative-date": { "version": "1.3.0", "bundled": true }, - "tough-cookie": { - "version": "2.4.3", - "bundled": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "bundled": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - }, - "umask": { - "version": "1.1.0", + "treeverse": { + "version": "2.0.0", "bundled": true }, "unique-filename": { @@ -15625,69 +9552,16 @@ } }, "unique-slug": { - "version": "2.0.0", + "version": "2.0.2", "bundled": true, "requires": { "imurmurhash": "^0.1.4" } }, - "unique-string": { - "version": "1.0.0", - "bundled": true, - "requires": { - "crypto-random-string": "^1.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "bundled": true - }, - "unzip-response": { - "version": "2.0.1", - "bundled": true - }, - "update-notifier": { - "version": "2.5.0", - "bundled": true, - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "bundled": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, "util-deprecate": { "version": "1.0.2", "bundled": true }, - "util-extend": { - "version": "1.0.3", - "bundled": true - }, - "util-promisify": { - "version": "2.1.0", - "bundled": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "uuid": { - "version": "3.3.3", - "bundled": true - }, "validate-npm-package-license": { "version": "3.0.4", "bundled": true, @@ -15697,20 +9571,15 @@ } }, "validate-npm-package-name": { - "version": "3.0.0", + "version": "4.0.0", "bundled": true, "requires": { - "builtins": "^1.0.3" + "builtins": "^5.0.0" } }, - "verror": { - "version": "1.10.0", - "bundled": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } + "walk-up-path": { + "version": "1.0.0", + "bundled": true }, "wcwidth": { "version": "1.0.1", @@ -15720,81 +9589,17 @@ } }, "which": { - "version": "1.3.1", + "version": "2.0.2", "bundled": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, "wide-align": { - "version": "1.1.2", + "version": "1.1.5", "bundled": true, "requires": { - "string-width": "^1.0.2" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "2.0.1", - "bundled": true, - "requires": { - "string-width": "^2.1.1" - } - }, - "worker-farm": { - "version": "1.7.0", - "bundled": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "bundled": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "3.1.0", - "bundled": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "wrappy": { @@ -15802,131 +9607,19 @@ "bundled": true }, "write-file-atomic": { - "version": "2.4.3", + "version": "4.0.1", "bundled": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "signal-exit": "^3.0.7" } }, - "xdg-basedir": { - "version": "3.0.0", - "bundled": true - }, - "xtend": { - "version": "4.0.1", - "bundled": true - }, - "y18n": { - "version": "4.0.0", - "bundled": true - }, "yallist": { - "version": "3.0.3", + "version": "4.0.0", "bundled": true - }, - "yargs": { - "version": "14.2.3", - "bundled": true, - "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.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": "^15.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "bundled": true - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "bundled": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "bundled": true - }, - "string-width": { - "version": "3.1.0", - "bundled": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "bundled": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "15.0.1", - "bundled": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "bundled": true - } - } } } }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -15944,6 +9637,51 @@ "string.prototype.padend": "^3.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -15957,6 +9695,45 @@ "which": "^1.2.9" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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 + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -15966,6 +9743,12 @@ "pify": "^3.0.0" } }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -15988,92 +9771,82 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - } - } - }, - "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.0" - } - }, - "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.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - }, - "dependencies": { - "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 - } - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "null-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-2.0.0.tgz", - "integrity": "sha512-PhEeA3v/tAacxC5dNO1i2yXzGVWWrZ9jTx+TMEJ716amvnBXzvrxIwy9HW7MyJsHe8ACQzpiQgbrAjDRMA7gcg==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "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==", + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" } } } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } }, - "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 + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } }, "object-assign": { "version": "4.1.1", @@ -16081,47 +9854,10 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "object-keys": { @@ -16130,142 +9866,22 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, - "object.entries": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", - "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "requires": { "ee-first": "1.1.1" @@ -16281,108 +9897,83 @@ } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", - "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-6.0.1.tgz", + "integrity": "sha512-BshV2UZPfggZLdUfN3zFBbG4sl/DynUI+YCB6fRRDWaqO2OiWN8GPcp4Y0/fEV6B3k9Hzyk3czve3V/8B/SzKQ==", "dev": true, "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^3.0.0" + "cssnano": "^5.0.2", + "last-call-webpack-plugin": "^3.0.0", + "postcss": "^8.2.1" } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "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" - } - }, "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 }, - "outdent": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.7.1.tgz", - "integrity": "sha512-VjIzdUHunL74DdhcwMDt5FhNDQ8NYmTkuW0B+usIV2afS9aWT/1c9z1TsnFW349TP3nxmYeUl7Z++XpJRByvgg==", - "dev": true - }, "over": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=", "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": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "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 + "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, + "requires": { + "aggregate-error": "^3.0.0" + } }, "p-try": { "version": "2.2.0", @@ -16390,30 +9981,14 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "no-case": "^2.2.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "parent-module": { @@ -16425,29 +10000,10 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "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, "requires": { "@babel/code-frame": "^7.0.0", @@ -16456,53 +10012,21 @@ "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "path-exists": { "version": "4.0.0", @@ -16523,21 +10047,15 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-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=", + "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 }, "path-type": { @@ -16546,35 +10064,28 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pidtree": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", - "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz", + "integrity": "sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==", "dev": true }, "pify": { @@ -16599,1118 +10110,694 @@ } }, "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==", + "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, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } - }, - "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 } } }, - "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, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "postcss": { - "version": "7.0.34", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.34.tgz", - "integrity": "sha512-H/7V2VeNScX9KE83GDrDZNiGT1m2H+UTnlinIzhjlLX9hfMUn1mHNnGeX81a1c8JSBdBvqk7c2ZOG6ZPn5itGw==", + "version": "8.4.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", + "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" } }, "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.1.tgz", + "integrity": "sha512-wrt2VndqSLJpyBRNz9OmJcgnhI9MaongeWgapdBuUMu2a/KNJ8SENesG4SdiTnQwGO9b1VKbTWYAfCPeokLqZQ==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" + "postcss-selector-parser": "^6.0.10" } }, "postcss-calc": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz", - "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==", + "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, "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "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, + "requires": { + "postcss-value-parser": "^4.2.0" } }, "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz", + "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", "dev": true, "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - } - }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", - "dev": true, - "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz", + "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.1.tgz", + "integrity": "sha512-ZhBAYOOOeEV9eosUARv67HAhwM3PsKaWDxXs31usUoBd78VUiXZGgtbvGM1IFWgTaW2S5oYOJ2iD4dwSdHzfiQ==", + "dev": true }, "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", + "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", "dev": true, "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" + "postcss-value-parser": "^4.2.0" } }, "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.2.tgz", + "integrity": "sha512-vGkvyy7js/OPLdeJUCh+iH7xA2+w0lK4ecahUoCaZaDblQXZ9ADrLG4TNI0lNYrJWwe9k/jyLhliIoUs/og3SQ==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.4" } }, "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.9" } }, "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz", + "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==", + "dev": true }, "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true }, "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "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 }, "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "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 }, "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", "dev": true, "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "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, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "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, "requires": { - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.9" } }, "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "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, "requires": { - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.9" } }, "postcss-font-variant": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", - "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "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 }, "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true }, "postcss-image-set-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-initial": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", - "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", - "dev": true, - "requires": { - "lodash.template": "^4.5.0", - "postcss": "^7.0.2" - } + "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 }, "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.1.tgz", - "integrity": "sha512-D2ENobdoZsW0+BHy4x1CAkXtbXtYWYRIxL/JbtRBqrRGOPtJ2zoga/bEZWhV/ShWB5saVxJMzbMdSyA/vv4tXw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "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" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.0.tgz", + "integrity": "sha512-IDyttebFzTSY6DI24KuHUcBjbAev1i+RyICoPEWcAstZsj03r533uMXtDn506l6/wlsRYiS5XBdx7TpccCsyUg==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "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, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" } }, "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "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 }, "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true }, "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz", + "integrity": "sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA==", "dev": true, "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" } }, "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz", + "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==", "dev": true, "requires": { - "browserslist": "^4.0.0", + "browserslist": "^4.16.6", "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" } }, "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "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, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "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, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz", + "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "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 - } + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz", + "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.5" } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true }, "postcss-modules-local-by-default": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", - "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "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 - } + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", - "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "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, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" } }, "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.7.tgz", + "integrity": "sha512-Btho5XzDTpl117SmB3tvUHP8txg5n7Ayv7vQ5m4b1zXkfs1Y52C67uZjZ746h7QvOJ+rLRg50OlhhjFW+IQY6A==", "dev": true, "requires": { - "postcss": "^7.0.2" + "@csstools/selector-specificity": "1.0.0", + "postcss-selector-parser": "^6.0.10" } }, "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } + "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 }, "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "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, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz", + "integrity": "sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz", + "integrity": "sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "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, "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "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, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" } }, "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "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, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" }, "dependencies": { "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, - "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==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true } } }, "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, + "postcss-opacity-percentage": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", + "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "dev": true + }, "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz", + "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true }, "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } + "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 }, "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" + "postcss-value-parser": "^4.2.0" } }, "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.1.tgz", + "integrity": "sha512-1sx6+Nl1wMVJzaYLVaz4OAR6JodIN/Z1upmVqLwSPCLT6XyxrEoePgNMHPH08kseLe3z06i9Vfkt/32BYEKDeA==", "dev": true, "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" + "@csstools/postcss-cascade-layers": "^1.0.2", + "@csstools/postcss-color-function": "^1.1.0", + "@csstools/postcss-font-format-keywords": "^1.0.0", + "@csstools/postcss-hwb-function": "^1.0.1", + "@csstools/postcss-ic-unit": "^1.0.0", + "@csstools/postcss-is-pseudo-class": "^2.0.4", + "@csstools/postcss-normalize-display-values": "^1.0.0", + "@csstools/postcss-oklab-function": "^1.1.0", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.1", + "@csstools/postcss-unset-value": "^1.0.1", + "autoprefixer": "^10.4.7", + "browserslist": "^4.20.3", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^6.6.3", + "postcss-attribute-case-insensitive": "^5.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.3", + "postcss-color-hex-alpha": "^8.0.3", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.1", + "postcss-custom-properties": "^12.1.7", + "postcss-custom-selectors": "^6.0.2", + "postcss-dir-pseudo-class": "^6.0.4", + "postcss-double-position-gradients": "^3.1.1", + "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.3", + "postcss-image-set-function": "^4.0.6", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.0", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.7", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.3", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.4", + "postcss-pseudo-class-any-link": "^7.1.4", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.0", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.4.146", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz", + "integrity": "sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg==", + "dev": true + } } }, "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz", + "integrity": "sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" - }, - "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "postcss-selector-parser": "^6.0.10" } }, "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" } }, "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "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, "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - } - }, - "postcss-selector-matches": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - } + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true }, "postcss-selector-not": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", - "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.0.tgz", + "integrity": "sha512-i/HI/VNd3V9e1WOLCwJsf9nePBRXqcGtVibcJ9FsVo0agfDEfsLSlFt94aYjY35wUNcdG0KrvdyjEr7It50wLQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" + "postcss-selector-parser": "^6.0.10" } }, "postcss-selector-parser": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.3.tgz", - "integrity": "sha512-0ClFaY4X1ra21LRqbW6y3rUbWcxnSVkDFG57R7Nxus9J9myPFlv+jYDMohzpkBx0RrjjiqjtycpchQ+PLGmZ9w==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "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 - } + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" } }, "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "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, "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "postcss-selector-parser": "^6.0.5" } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "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 }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "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=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^3.0.0" } }, "private": { @@ -17719,86 +10806,18 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "pullstream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", @@ -17847,29 +10866,6 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -17889,31 +10885,18 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "side-channel": "^1.0.4" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "quick-lru": { @@ -17931,16 +10914,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -17948,46 +10921,25 @@ "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=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "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=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true } } }, @@ -18003,6 +10955,30 @@ "type-fest": "^0.6.0" }, "dependencies": { + "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 + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "type-fest": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", @@ -18022,6 +10998,43 @@ "type-fest": "^0.8.1" }, "dependencies": { + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "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, + "requires": { + "p-limit": "^2.2.0" + } + }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -18031,29 +11044,23 @@ } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "real-favicon-webpack-plugin": { @@ -18066,12 +11073,12 @@ } }, "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "^1.9.0" } }, "redent": { @@ -18085,80 +11092,70 @@ } }, "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", - "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "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 }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" } }, "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -18179,13 +11176,13 @@ "dev": true }, "remove-files-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/remove-files-webpack-plugin/-/remove-files-webpack-plugin-1.4.4.tgz", - "integrity": "sha512-vCtIPQRA9Sf6yn90qepj0A8zEMZK4oHxGH+rTG74ELPprDbhJ9Phe74fj9FM6Jc5I11Q5Ah6EogqJDzSqJ6mEA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/remove-files-webpack-plugin/-/remove-files-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-PWxldMWpXKmqAv0Lc6Gy1+9QnMLJad94xKSrD3mJLHuZbifVcbTaJn5iZY1YUqPv56GnvMdJZfU8807NxKhtvg==", "dev": true, "requires": { - "@types/webpack": "4.41.22", - "trash": "6.1.1" + "@types/webpack": "5.28.0", + "trash": "7.2.0" } }, "remove-markdown": { @@ -18194,54 +11191,19 @@ "integrity": "sha1-ZrDO66n7d8qWNrsbAwfOIaMqEqY=", "dev": true }, - "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 - }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" } }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -18296,9 +11258,9 @@ "dev": true }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true }, "tough-cookie": { @@ -18340,10 +11302,10 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "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 }, "requires-port": { @@ -18353,52 +11315,23 @@ "dev": true }, "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } + "resolve-from": "^5.0.0" } }, "resolve-from": { @@ -18414,110 +11347,47 @@ "dev": true, "requires": { "global-dirs": "^0.1.1" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" }, "dependencies": { - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "ini": "^1.3.4" } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } } } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" } }, - "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 + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } }, "reusify": { "version": "1.0.4", @@ -18525,139 +11395,104 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rfg-api": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/rfg-api/-/rfg-api-0.5.1.tgz", - "integrity": "sha512-F4JJDx7gTFcGNybw+0trDFSYjuy2hbdqDqdaNBkMdSVlasglkfwyTWHTFqSUOLszbpZLwatLy0dxAJonNZi6hw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/rfg-api/-/rfg-api-0.5.2.tgz", + "integrity": "sha512-2SaUwjAhRsIafTo4cBK9lvZm762IP2Z58JmtY0swxYcC6la2dRMR0i4ok9lIQ9Snz8hqh5RzG6y8ygrUmKHZ9A==", "dev": true, "requires": { - "axios": "^0.18.0", + "axios": "^0.21.1", "fstream": "^1.0.2", "metaparser": "^1.0.7", "mkdirp": "^0.5.0", "node-unzip-2": "^0.2.7" - } - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-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 - }, - "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 - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" }, "dependencies": { - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true + "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": { + "minimist": "^1.2.6" + } } } }, - "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 - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "ret": "~0.1.10" + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -18665,33 +11500,26 @@ "dev": true }, "sass": { - "version": "1.26.11", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.11.tgz", - "integrity": "sha512-W1l/+vjGjIamsJ6OnTe0K37U2DBO/dgsv2Z4c89XQ8ZOO6l/VwkqwLSqoYzJeJs6CLuGSTRWc91GbQFL3lvrvw==", + "version": "1.52.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.2.tgz", + "integrity": "sha512-mfHB2VSeFS7sZlPv9YohB9GB7yWIgQNTGniQwfQ04EoQN0wsQEv7SwpCwy/x48Af+Z3vDeFXz+iuXM3HK/phZQ==", "dev": true, "requires": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sass-loader": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", - "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.0.tgz", + "integrity": "sha512-IHCFecI+rbPvXE2zO/mqdVFe8MU7ElGrwga9hh2H65Ru4iaBJAMRteum1c4Gsxi9Cq1FOtTEDd6+/AEYuQDM4Q==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.0.1", - "neo-async": "^2.5.0", - "pify": "^4.0.1", - "semver": "^6.3.0" + "klona": "^2.0.4", + "neo-async": "^2.6.2" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -18704,103 +11532,34 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "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.4.0" + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, - "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.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -18808,19 +11567,45 @@ "dev": true }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, + "sha256-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha256-universal/-/sha256-universal-1.2.1.tgz", + "integrity": "sha512-ghn3muhdn1ailCQqqceNxRgkOeZSVfSE13RQWEg6njB+itsFzGVSJv+O//2hvNXZuxVIRyNzrgsZ37SPDdGJJw==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "b4a": "^1.0.1", + "sha256-wasm": "^2.2.1" + } + }, + "sha256-wasm": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", + "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", + "requires": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "sha512-universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sha512-universal/-/sha512-universal-1.2.1.tgz", + "integrity": "sha512-kehYuigMoRkIngCv7rhgruLJNNHDnitGTBdkcYbCbooL8Cidj/bS78MDxByIjcc69M915WxcQTgZetZ1JbeQTQ==", + "requires": { + "b4a": "^1.0.1", + "sha512-wasm": "^2.3.1" + } + }, + "sha512-wasm": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/sha512-wasm/-/sha512-wasm-2.3.4.tgz", + "integrity": "sha512-akWoxJPGCB3aZCrZ+fm6VIFhJ/p8idBv7AWGFng/CZIrQo51oQNsvDbTSRXWAzIiZJvpy16oIDiCCPqTe21sKg==", + "requires": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" } }, "shallow-clone": { @@ -18833,115 +11618,71 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "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 }, - "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "dev": true, - "requires": { - "debug": "^4.0.1" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "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 - } - } - }, "siphash24": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.1.1.tgz", - "integrity": "sha512-dKKwjIoTOa587TARYLlBRXq2lkbu5Iz35XrEVWpelhBP1m8r2BGOy1QlaZe84GTFHG/BTucEUd2btnNc8QzIVA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/siphash24/-/siphash24-1.3.1.tgz", + "integrity": "sha512-moemC3ZKiTzH29nbFo3Iw8fbemWWod4vNs/WgKbQ54oEs6mE6XVlguxvinYjB+UmaE0PThgyED9fUkWvirT8hA==", "requires": { - "nanoassert": "^1.0.0" + "nanoassert": "^2.0.0" } }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", + "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "dev": true + }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true } } @@ -18981,289 +11722,51 @@ } } }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "socket.io": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", - "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz", + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==", "dev": true, "requires": { - "debug": "~4.1.0", - "engine.io": "~3.4.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.3.0", - "socket.io-parser": "~3.4.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.0.4" } }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, - "socket.io-client": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", - "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "engine.io-client": "~3.4.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - }, - "dependencies": { - "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 - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", - "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "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 - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" } }, "sodium-javascript": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.6.tgz", - "integrity": "sha512-Uk+JpqHEbzsEmiMxwL7TB/ndhMEpc52KdReYXXSIX2oRFPaI7ZDlDImF8KbkFWbYl9BJRtc82AZ/kNf4/0n9KA==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.8.0.tgz", + "integrity": "sha512-rEBzR5mPxPES+UjyMDvKPIXy9ImF17KOJ32nJNi9uIquWpS/nfj+h6m05J5yLJaGXjgM72LmQoUbWZVxh/rmGg==", "requires": { "blake2b": "^2.1.1", - "nanoassert": "^1.0.0", + "chacha20-universal": "^1.0.4", + "nanoassert": "^2.0.0", + "sha256-universal": "^1.1.0", + "sha512-universal": "^1.1.0", "siphash24": "^1.0.1", "xsalsa20": "^1.0.0" } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -19271,39 +11774,27 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true }, "source-map-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==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -19331,9 +11822,9 @@ } }, "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, "split": { @@ -19345,46 +11836,19 @@ "through": "2" } }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { - "through2": "^2.0.2" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "^3.0.0" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -19398,173 +11862,120 @@ "tweetnacl": "~0.14.0" } }, - "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", - "dev": true - }, "standard-version": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.1.0.tgz", - "integrity": "sha512-EJcbKUGKBuHjiDSUL5XjPhT1KGVM+UCvv/ti70fHnJwJyJqTSJWl0mWj/Wj0WwsoskyvKWURESzBsZmCCMUZzg==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", "dev": true, "requires": { "chalk": "^2.4.2", - "conventional-changelog": "3.1.24", + "conventional-changelog": "3.1.25", "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.5.0", - "conventional-recommended-bump": "6.0.11", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "dotgitignore": "^2.1.0", "figures": "^3.1.0", "find-up": "^5.0.0", - "fs-access": "^1.0.1", "git-semver-tags": "^4.0.0", "semver": "^7.1.1", "stringify-package": "^1.0.1", - "yargs": "^15.3.1" + "yargs": "^16.0.0" }, "dependencies": { - "conventional-changelog-conventionalcommits": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz", - "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" + "color-convert": "^1.9.0" } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, "standard-version-updater-yaml": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/standard-version-updater-yaml/-/standard-version-updater-yaml-1.0.2.tgz", - "integrity": "sha512-hTaNAnsQ7HznYbt489qVPYs4lvZ5q6pVwZJ7kmPMhYmvNzq7hZnQoImTYvEB9hgkx/moBJkqF38Dp82xy+dqvw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/standard-version-updater-yaml/-/standard-version-updater-yaml-1.0.3.tgz", + "integrity": "sha512-K93X/FPgeBtYVpEi7AooHNlUu0cop98AeLKOIyBXoD4so4/7jbe9PVUVjsI4fk5iutnEVqit5oxRqZ812vEckA==", "dev": true, "requires": { "yaml": "^1.10.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, "stealthy-require": { @@ -19573,216 +11984,72 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-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, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "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, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "streamroller": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", - "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", + "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", "dev": true, "requires": { - "date-format": "^1.2.0", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "readable-stream": "^2.3.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "date-format": "^4.0.10", + "debug": "^4.3.4", + "fs-extra": "^10.1.0" } }, - "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-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "string.prototype.padend": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", - "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz", + "integrity": "sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "es-abstract": "^1.19.1" } }, "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" - } - }, - "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, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } + "safe-buffer": "~5.2.0" } }, "stringify-package": { @@ -19792,12 +12059,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -19806,10 +12073,10 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-indent": { @@ -19821,230 +12088,76 @@ "min-indent": "^1.0.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true }, - "style-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", - "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "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, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, + "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 + }, "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "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": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "@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" }, "dependencies": { - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", - "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==", + "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 - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } } } }, - "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 - }, - "synchronous-promise": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.13.tgz", - "integrity": "sha512-R9N6uDkVsghHePKh1TEqbnLddO2IY25OcsksyFp/qBe7XYd0PVbKEWxhcdMhpLzE1I6skj5l4aEZ3CRxcbArlA==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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 - }, - "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 - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tail.datetime": { - "version": "git+ssh://git@gitlab2.rz.ifi.lmu.de/uni2work/tail.DateTime.git#ef1237569ff22667acb64a9dfd64682ee55817eb", - "from": "git+ssh://git@gitlab2.rz.ifi.lmu.de/uni2work/tail.DateTime.git#uni2work" - }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, - "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -20054,149 +12167,36 @@ "dev": true }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } } } }, "terser-webpack-plugin": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", - "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", + "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", "dev": true, "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.3.1", - "jest-worker": "^25.4.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.6.12", - "webpack-sources": "^1.4.3" + "@jridgewell/trace-mapping": "^0.3.7", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.7.2" }, "dependencies": { - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "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, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "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, - "requires": { - "find-up": "^4.0.0" - } - }, - "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, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - }, - "yallist": { + "schema-utils": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, @@ -20219,119 +12219,42 @@ "dev": true }, "through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" + "readable-stream": "3" } }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmp": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", - "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "rimraf": "^2.6.3" + "rimraf": "^3.0.0" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "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 - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "toposort": { @@ -20357,22 +12280,40 @@ } }, "trash": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/trash/-/trash-6.1.1.tgz", - "integrity": "sha512-4i56lCmz2RG6WZN018hf4L75L5HboaFuKkHx3wDG/ihevI99e0OgFyl8w6G4ioqBm62V4EJqCy5xw3vQSNXU8A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/trash/-/trash-7.2.0.tgz", + "integrity": "sha512-3bR8Z5aWO8b9qybS6skBoaavH/hX9Onb1RrdIIhJxv9VpH3aBtpbKuAX4rIh/0xpDZ7K4ga36wONk/okbhjTlA==", "dev": true, "requires": { - "@stroncium/procfs": "^1.0.0", + "@stroncium/procfs": "^1.2.1", "globby": "^7.1.1", "is-path-inside": "^3.0.2", - "make-dir": "^3.0.0", - "move-file": "^1.1.0", - "p-map": "^3.0.0", - "p-try": "^2.2.0", - "uuid": "^3.3.2", - "xdg-trashdir": "^2.1.1" + "make-dir": "^3.1.0", + "move-file": "^2.0.0", + "p-map": "^4.0.0", + "uuid": "^8.3.2", + "xdg-trashdir": "^3.1.0" }, "dependencies": { + "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.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -20382,6 +12323,20 @@ "path-type": "^3.0.0" } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -20402,28 +12357,13 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "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==", + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { - "semver": "^6.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" + "brace-expansion": "^1.1.7" } }, "path-type": { @@ -20446,6 +12386,12 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true } } }, @@ -20456,15 +12402,9 @@ "dev": true }, "trim-newlines": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", - "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "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 }, "trim-right": { @@ -20473,16 +12413,31 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true + "ts-node": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", + "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true }, "tunnel-agent": { @@ -20500,25 +12455,19 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -20538,116 +12487,92 @@ "dev": true }, "typeface-roboto": { - "version": "0.0.75", - "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-0.0.75.tgz", - "integrity": "sha512-VrR/IiH00Z1tFP4vDGfwZ1esNqTiDMchBEXYY9kilT6wRGgFoCAlgkEUMHb1E3mB0FsfZhv756IF0+R+SFPfdg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-1.1.13.tgz", + "integrity": "sha512-YXvbd3a1QTREoD+FJoEkl0VQNJoEjewR2H11IjVv4bp6ahuIcw0yyw/3udC4vJkHw3T3cUh85FTg8eWef3pSaw==", "dev": true }, "typeface-source-code-pro": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/typeface-source-code-pro/-/typeface-source-code-pro-1.1.3.tgz", - "integrity": "sha512-BAQ8I7Xy5zS5+KuG+gjRPNYCdfwL8vSF9jT8q9wzCRiiOG4h7id5zt8wcQx59riGRbRsgycRfs/ubyAm2z/FJQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-source-code-pro/-/typeface-source-code-pro-1.1.13.tgz", + "integrity": "sha512-TX3c89uW9uc5SJNFWY8HBFkZqcxcNY7nJz0rw+0Pk2ZVsog/v2d04yKRsPU+jJI4wFegOvWXbOWt927i/xUdIw==", "dev": true }, "typeface-source-sans-pro": { - "version": "0.0.75", - "resolved": "https://registry.npmjs.org/typeface-source-sans-pro/-/typeface-source-sans-pro-0.0.75.tgz", - "integrity": "sha512-8aI6ywe+5py1MoMQjdnuQKepOATSLpFoyatVMweF6JNUD8cu+sWaVEfZBN08CRxPrSC4KYTArf6prrQzcqpyQA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/typeface-source-sans-pro/-/typeface-source-sans-pro-1.1.13.tgz", + "integrity": "sha512-eCczLh0FYByjVoMxZVDfSSTI8A6qJOBJftgWBVJL63AuemQTTvMU8DEk6ud/TQhkbIwWZ3A7ll/NfS9yI0lIrQ==", + "dev": true + }, + "typescript": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz", + "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==", "dev": true }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, "uglify-js": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.7.tgz", - "integrity": "sha512-SIZhkoh+U/wjW+BHGhVwE9nt8tWJspncloBcFapkpGRwNPqcH8pzX36BXe3TPBjzHWPMUZotpCigak/udWNr1Q==", + "version": "3.15.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.5.tgz", + "integrity": "sha512-hNM5q5GbBRB5xB+PMqVRcgYe4c8jbyZ1pzZhS6jbq54/4F2gFK869ZheiE5A8/t+W5jtTNpWef/5Q9zk639FNQ==", "dev": true, "optional": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "underscore": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", - "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, - "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, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, "unpipe": { @@ -20656,109 +12581,15 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-join": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", - "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -20768,39 +12599,12 @@ "os-homedir": "^1.0.0" } }, - "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" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -20820,9 +12624,15 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "validate-npm-package-license": { @@ -20841,12 +12651,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -20856,14 +12660,16 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } } }, - "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 - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -20871,520 +12677,133 @@ "dev": true }, "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "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, - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "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, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "5.73.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", + "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.9.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "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" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "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, - "requires": { - "yallist": "^3.0.2" - } - }, "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, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "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, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "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" - } - }, - "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true } } }, "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==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "requires": { - "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" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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 }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "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 - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "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 - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "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 - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } } } }, - "webpack-dev-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", - "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", - "dev": true, - "requires": { - "loud-rejection": "^1.6.0", - "memory-fs": "~0.4.1", - "mime": "^2.1.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "url-join": "^2.0.2", - "webpack-log": "^1.0.1" - }, - "dependencies": { - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", - "dev": true - } - } - }, - "webpack-log": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", - "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", - "dev": true, - "requires": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "loglevelnext": "^1.0.1", - "uuid": "^3.1.0" - } - }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-5.0.0.tgz", + "integrity": "sha512-8RQfMAdc5Uw3QbCQ/CBV/AXqOR8mt03B6GJmRbhWopE8GzRfEpn+k0ZuWywxW+5QZsffhmFDY1J6ohqJo+eMuw==", "dev": true, "requires": { - "fs-extra": "^7.0.0", - "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", - "tapable": "^1.0.0" + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" }, "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "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 } } }, - "webpack-plugin-hash-output": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-plugin-hash-output/-/webpack-plugin-hash-output-3.2.1.tgz", - "integrity": "sha512-Iu4Sox3/bdiqd6TdYwZAExuH+XNbnJStPrwh6yhzOflwc/hZUP9MdiZDbFwTXrmm9ZwoXNUmvn7C0Qj4qRez2A==", + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "requires": { - "outdent": "^0.7.0" + "lodash": "^4.17.15" } }, "webpack-sources": { @@ -21395,34 +12814,39 @@ "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "whatwg-fetch": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz", - "integrity": "sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-module": { + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wildcard": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, "word-wrap": { @@ -21437,51 +12861,15 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, - "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, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "wrappy": { @@ -21490,70 +12878,34 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "ws": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz", - "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true }, "xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true }, "xdg-trashdir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xdg-trashdir/-/xdg-trashdir-2.1.1.tgz", - "integrity": "sha512-KcVhPaOu2ZurYNHSRTf1+ZHORkTZGCQ+u0JHN17QixRISJq4pXOnjt/lQcehvtHL5QAKhSzKgyjrcNnPdkPBHA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/xdg-trashdir/-/xdg-trashdir-3.1.0.tgz", + "integrity": "sha512-N1XQngeqMBoj9wM4ZFadVV2MymImeiFfYD+fJrNlcVcOHsJFFQe7n3b+aBoTPwARuq2HQxukfzVpQmAk1gN4sQ==", "dev": true, "requires": { - "@sindresorhus/df": "^2.1.0", + "@sindresorhus/df": "^3.1.1", "mount-point": "^3.0.0", - "pify": "^2.2.0", "user-home": "^2.0.0", - "xdg-basedir": "^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 - } + "xdg-basedir": "^4.0.0" } }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true - }, "xsalsa20": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.1.0.tgz", - "integrity": "sha512-zd3ytX2cm+tcSndRU+krm0eL4TMMpZE7evs5hLRAoOy6gviqLfe3qOlkjF3i5SeAkQUCeJk0lJZrEU56kHRfWw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xsalsa20/-/xsalsa20-1.2.0.tgz", + "integrity": "sha512-FIr/DEeoHfj7ftfylnoFt3rAIRoWXpx2AoDfrT2qD2wtp7Dp+COajvs/Icb7uHqRW9m60f5iXZwdsJJO3kvb7w==" }, "xtend": { "version": "4.0.2", @@ -21562,56 +12914,56 @@ "dev": true }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", + "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "dependencies": { + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + } } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { @@ -21619,20 +12971,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true - }, - "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } } } } diff --git a/package.json b/package.json index 0a86aaf8d..395441f3c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uni2work", - "version": "25.24.5", + "version": "26.1.1", "description": "", "keywords": [], "author": "", @@ -10,7 +10,6 @@ "test": "run-s frontend:test yesod:test i18n:test", "lint": "run-s frontend:lint yesod:lint", "build": "run-s frontend:build yesod:build", - "cbt": "./cbt.sh", "yesod:db": "./db.sh", "yesod:start": "./start.sh", "yesod:lint": "./hlint.sh", @@ -45,85 +44,84 @@ "defaults" ], "devDependencies": { - "@babel/cli": "^7.10.5", - "@babel/core": "^7.11.4", - "@babel/plugin-proposal-class-properties": "^7.10.4", - "@babel/plugin-proposal-decorators": "^7.10.5", - "@babel/plugin-transform-runtime": "^7.11.0", - "@babel/preset-env": "^7.11.0", - "@commitlint/cli": "^10.0.0", - "@commitlint/config-conventional": "^10.0.0", - "@fortawesome/fontawesome-pro": "^5.14.0", - "autoprefixer": "^9.8.6", + "@babel/cli": "^7.17.10", + "@babel/core": "^7.18.2", + "@babel/eslint-parser": "^7.18.2", + "@babel/plugin-proposal-class-properties": "^7.17.12", + "@babel/plugin-proposal-decorators": "^7.18.2", + "@babel/plugin-proposal-private-property-in-object": "^7.17.12", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-runtime": "^7.18.2", + "@babel/preset-env": "^7.18.2", + "@commitlint/cli": "^17.0.2", + "@commitlint/config-conventional": "^17.0.2", + "@fortawesome/fontawesome-pro": "^6.1.1", + "autoprefixer": "^10.4.7", "babel-core": "^6.26.3", - "babel-eslint": "^10.1.0", - "babel-loader": "^8.1.0", + "babel-loader": "^8.2.5", "babel-plugin-syntax-dynamic-import": "^6.18.0", "babel-plugin-transform-decorators-legacy": "^1.3.5", + "babel-preset-env": "^1.7.0", "babel-preset-es2015": "^6.24.1", - "cbt_tunnels": "^1.2.2", - "changelog-parser": "^2.8.0", - "clean-webpack-plugin": "^3.0.0", - "copy-webpack-plugin": "^6.0.3", - "css-loader": "^2.1.1", - "eslint": "^5.16.0", - "file-loader": "^5.1.0", - "fs-extra": "^8.1.0", - "glob": "^7.1.6", - "html-webpack-plugin": "^3.2.0", - "husky": "^2.7.0", - "jasmine-core": "^3.6.0", - "js-yaml": "^3.14.0", - "karma": "^5.1.1", - "karma-chrome-launcher": "^2.2.0", + "changelog-parser": "^2.8.1", + "clean-webpack-plugin": "^4.0.0", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.7.1", + "eslint": "^8.17.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "glob": "^8.0.3", + "html-webpack-plugin": "^5.5.0", + "husky": "^8.0.1", + "jasmine-core": "^4.1.1", + "js-yaml": "^4.1.0", + "karma": "^6.3.20", + "karma-chrome-launcher": "^3.1.1", "karma-cli": "^2.0.0", - "karma-jasmine": "^2.0.1", - "karma-jasmine-html-reporter": "^1.5.4", + "karma-jasmine": "^5.0.1", + "karma-jasmine-html-reporter": "^2.0.0", "karma-mocha-reporter": "^2.2.5", - "karma-webpack": "^3.0.5", - "lint-staged": "^8.2.1", - "lodash.debounce": "^4.0.8", - "mini-css-extract-plugin": "^0.8.2", + "karma-webpack": "^5.0.0", + "lint-staged": "^13.0.0", + "mini-css-extract-plugin": "^2.6.0", "npm-run-all": "^4.1.5", - "null-loader": "^2.0.0", - "optimize-css-assets-webpack-plugin": "^5.0.3", - "postcss-loader": "^3.0.0", - "postcss-preset-env": "^6.7.0", + "null-loader": "^4.0.1", + "optimize-css-assets-webpack-plugin": "^6.0.1", + "postcss-loader": "^7.0.0", + "postcss-preset-env": "^7.7.1", "real-favicon-webpack-plugin": "^0.2.3", - "remove-files-webpack-plugin": "^1.4.3", + "remove-files-webpack-plugin": "^1.5.0", "request": "^2.88.2", "request-promise": "^4.2.6", - "resolve-url-loader": "^3.1.1", - "sass": "^1.26.10", - "sass-loader": "^7.3.1", - "semver": "^6.3.0", - "standard-version": "^9.1.0", - "standard-version-updater-yaml": "^1.0.2", - "style-loader": "^0.23.1", - "terser-webpack-plugin": "^2.3.8", - "tmp": "^0.1.0", - "typeface-roboto": "0.0.75", - "typeface-source-code-pro": "^1.1.3", - "typeface-source-sans-pro": "0.0.75", - "webpack": "^4.44.1", - "webpack-cli": "^3.3.12", - "webpack-manifest-plugin": "^2.2.0", - "webpack-plugin-hash-output": "^3.2.1" + "resolve-url-loader": "^5.0.0", + "sass": "^1.52.2", + "sass-loader": "^13.0.0", + "semver": "^7.3.7", + "standard-version": "^9.5.0", + "standard-version-updater-yaml": "^1.0.3", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.3", + "tmp": "^0.2.1", + "typeface-roboto": "1.1.13", + "typeface-source-code-pro": "^1.1.13", + "typeface-source-sans-pro": "1.1.13", + "webpack": "^5.73.0", + "webpack-cli": "^4.9.2", + "webpack-manifest-plugin": "^5.0.0" }, "dependencies": { - "@babel/runtime": "^7.11.2", - "@juggle/resize-observer": "^2.5.0", - "core-js": "^3.6.5", + "@babel/runtime": "^7.18.3", + "@juggle/resize-observer": "^3.3.1", + "core-js": "^3.22.8", "css.escape": "^1.5.1", - "js-cookie": "^2.2.1", + "js-cookie": "^3.0.1", "lodash.debounce": "^4.0.8", "lodash.defer": "^4.1.0", "lodash.throttle": "^4.1.1", - "moment": "^2.27.0", - "npm": "^6.14.8", - "sodium-javascript": "^0.5.6", - "tail.datetime": "git+ssh://git@gitlab2.rz.ifi.lmu.de/uni2work/tail.DateTime.git#uni2work", + "moment": "^2.29.3", + "npm": "^8.12.1", + "sodium-javascript": "^0.8.0", "toposort": "^2.0.2", - "whatwg-fetch": "^3.4.0" + "whatwg-fetch": "^3.6.2" } } diff --git a/package.yaml b/package.yaml index 4f1b83ff8..c43d95019 100644 --- a/package.yaml +++ b/package.yaml @@ -1,9 +1,10 @@ name: uniworx -version: 25.24.5 +version: 26.1.1 dependencies: - base - yesod - yesod-core + - yesod-persistent - yesod-auth - yesod-static - yesod-form @@ -119,6 +120,7 @@ dependencies: - hsass - semigroupoids - http-types + - http-client - jose-jwt - mono-traversable - mono-traversable-keys @@ -146,6 +148,19 @@ dependencies: - unidecode - pandoc - pandoc-types + - insert-ordered-containers + - servant + - servant-server + - servant-swagger + - servant-docs + - servant-client + - servant-client-core + - servant-quickcheck + - swagger2 + - haskell-src-meta + - network-uri + - vault + - tagged - token-bucket - async - pointedlist @@ -158,11 +173,11 @@ dependencies: - fastcdc - bimap - list-t - - insert-ordered-containers - topograph - network-uri - psqueues - nonce + - semver - IntervalMap - haskell-src-meta - either @@ -321,6 +336,7 @@ tests: - quickcheck-io - network-arbitrary - lens-properties + - http-media ghc-options: - -fno-warn-orphans - -threaded -rtsopts "-with-rtsopts=-N -T" diff --git a/records.json b/records.json index 1df7d5606..efeb5b9e7 100644 --- a/records.json +++ b/records.json @@ -1,819 +1,812 @@ { - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/app.scss": [ + "app-manifest-webpack-plugin for \"../../config/favicon.json\"": [ { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, "chunks": { "byName": {}, "bySource": {}, "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/alerts/alerts.scss": [ - { + }, "modules": { "byIdentifier": {}, "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-form/async-form.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/asidenav/asidenav.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-table/async-table-filter.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-table/async-table.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/show-hide/show-hide.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/form/form.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/inputs.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/radio.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/mass-input/mass-input.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/hide-columns/hide-columns.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/navbar/navbar.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/course-teaser/course-teaser.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/tooltips/tooltips.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/modal/modal.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/file-input.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/checkbox.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--5-1!node_modules/postcss-loader/src/index.js??ref--5-2!frontend/src/utils/form/datepicker.css": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "modules": { - "byIdentifier": { - "multi frontend/src/polyfill.js frontend/src/main.js": 0, - "ignored node_modules/libsodium/dist/modules fs": 1, - "ignored node_modules/readable-stream/lib util": 2, - "ignored node_modules/readable-stream/lib/internal/streams util": 3, - "ignored node_modules/bn.js/lib buffer": 4, - "ignored node_modules/brorand crypto": 5, - "ignored node_modules/sodium-javascript crypto": 1 - }, - "usedIds": { - "0": 0, - "1": 1, - "2": 2, - "3": 3, - "4": 4, - "5": 5 - } - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - }, - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/app.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/alerts/alerts.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/asidenav/asidenav.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/show-hide/show-hide.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-form/async-form.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table-filter.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/form/form.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/inputs.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/radio.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/mass-input/mass-input.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/hide-columns/hide-columns.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/navbar/navbar.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/tooltips/tooltips.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/course-teaser/course-teaser.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/modal/modal.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/file-input.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/checkbox.scss": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--5-1!node_modules/postcss-loader/src/index.js??ref--5-2!node_modules/resolve-url-loader/index.js??ref--5-3!frontend/src/utils/form/datepicker.css": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/app.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-form/async-form.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/alerts/alerts.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/asidenav/asidenav.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/form/form.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/hide-columns/hide-columns.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/navbar/navbar.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/course-teaser/course-teaser.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/modal/modal.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/tooltips/tooltips.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/mass-input/mass-input.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/radio.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/inputs.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/show-hide/show-hide.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table-filter.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/file-input.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/checkbox.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] - } - } - ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/exam-correct/exam-correct.sass": [ - { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, - "chunks": { - "byName": {}, - "bySource": {}, - "usedIds": [] } } ], "app-manifest-webpack-plugin for \"/home/gkleen/projects/uni2work/static/wp-4.41/iconstats-[hash].json\"": [ { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, "chunks": { "byName": {}, "bySource": {}, "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} } } ], - "app-manifest-webpack-plugin for \"../../config/favicon.json\"": [ + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--5-1!node_modules/postcss-loader/src/index.js??ref--5-2!frontend/src/utils/form/datepicker.css": [ { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, "chunks": { "byName": {}, "bySource": {}, "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} } } ], - "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/pageactions/pageactions.sass": [ + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--5-1!node_modules/postcss-loader/src/index.js??ref--5-2!node_modules/resolve-url-loader/index.js??ref--5-3!frontend/src/utils/form/datepicker.css": [ { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, "chunks": { "byName": {}, "bySource": {}, "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/app.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/app.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/alerts/alerts.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/alerts/alerts.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/asidenav/asidenav.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/asidenav/asidenav.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-form/async-form.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-form/async-form.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table-filter.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table-filter.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/async-table/async-table.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/course-teaser/course-teaser.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/course-teaser/course-teaser.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/exam-correct/exam-correct.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/form/form.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/form/form.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/hide-columns/hide-columns.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/hide-columns/hide-columns.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/checkbox.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/checkbox.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/file-input.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/file-input.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/inputs.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/inputs.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} } } ], "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/radio-group.sass": [ { - "modules": { - "byIdentifier": {}, - "usedIds": {} - }, "chunks": { "byName": {}, "bySource": {}, "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} } } - ] + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/radio.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/inputs/radio.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/mass-input/mass-input.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/mass-input/mass-input.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/modal/modal.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/modal/modal.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/navbar/navbar.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/navbar/navbar.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/pageactions/pageactions.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/show-hide/show-hide.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/show-hide/show-hide.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/tooltips/tooltips.sass": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/resolve-url-loader/index.js??ref--6-3!node_modules/sass-loader/dist/cjs.js??ref--6-4!frontend/src/utils/tooltips/tooltips.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/app.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/alerts/alerts.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/asidenav/asidenav.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-form/async-form.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-table/async-table-filter.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/async-table/async-table.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/course-teaser/course-teaser.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/form/form.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/hide-columns/hide-columns.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/checkbox.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/file-input.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/inputs.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/inputs/radio.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/mass-input/mass-input.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/modal/modal.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/navbar/navbar.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/show-hide/show-hide.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "mini-css-extract-plugin node_modules/css-loader/dist/cjs.js??ref--6-1!node_modules/postcss-loader/src/index.js??ref--6-2!node_modules/sass-loader/dist/cjs.js??ref--6-3!frontend/src/utils/tooltips/tooltips.scss": [ + { + "chunks": { + "byName": {}, + "bySource": {}, + "usedIds": [] + }, + "modules": { + "byIdentifier": {}, + "usedIds": {} + } + } + ], + "modules": { + "byIdentifier": { + "ignored node_modules/bn.js/lib buffer": 4, + "ignored node_modules/brorand crypto": 5, + "ignored node_modules/libsodium/dist/modules fs": 1, + "ignored node_modules/readable-stream/lib util": 2, + "ignored node_modules/readable-stream/lib/internal/streams util": 3, + "ignored node_modules/sodium-javascript crypto": 1, + "multi frontend/src/polyfill.js frontend/src/main.js": 0 + }, + "usedIds": [] + } } \ No newline at end of file diff --git a/routes b/routes index 3633b1e03..42afd5eff 100644 --- a/routes +++ b/routes @@ -73,6 +73,8 @@ /help HelpR GET POST !free +/external-apis ExternalApisR ServantApiExternalApis getServantApi + /user ProfileR GET POST !free /user/profile ProfileDataR GET !free /user/authpreds AuthPredsR GET POST !free @@ -82,7 +84,7 @@ /user/storage-key StorageKeyR POST !free /exam-office ExamOfficeR !exam-office: - / EOExamsR GET !system-exam-office + / EOExamsR GET POST !system-exam-office /fields EOFieldsR GET POST /users EOUsersR GET POST !system-exam-office /users/invite EOUsersInviteR GET POST !system-exam-office @@ -253,6 +255,27 @@ !/#UUID CryptoUUIDDispatchR GET !free -- just redirect -- !/*{CI FilePath} CryptoFileNameDispatchR GET !free -- Disabled until preliminary check for valid cID exists +-- for users +/qualification QualificationAllR GET !free +/qualification/#SchoolId QualificationSchoolR GET !free -- TODO +/qualification/#SchoolId/#QualificationShorthand QualificationR GET !free -- must be logged in though +-- OSIS CSV Export Demo +/lms LmsAllR GET POST +/lms/#SchoolId LmsSchoolR GET +/lms/#SchoolId/#QualificationShorthand LmsR GET POST +/lms/#SchoolId/#QualificationShorthand/edit LmsEditR GET POST +/lms/#SchoolId/#QualificationShorthand/users LmsUsersR GET +/lms/#SchoolId/#QualificationShorthand/users/direct LmsUsersDirectR GET +/lms/#SchoolId/#QualificationShorthand/userlist LmsUserlistR GET POST +/lms/#SchoolId/#QualificationShorthand/userlist/upload LmsUserlistUploadR GET POST +/lms/#SchoolId/#QualificationShorthand/userlist/direct LmsUserlistDirectR POST +/lms/#SchoolId/#QualificationShorthand/result LmsResultR GET POST +/lms/#SchoolId/#QualificationShorthand/result/upload LmsResultUploadR GET POST +/lms/#SchoolId/#QualificationShorthand/result/direct LmsResultDirectR POST +/api ApiDocsR GET !free +/swagger SwaggerR GET !free +/swagger.json SwaggerJsonR GET !free + !/*WellKnownFileName WellKnownR GET !free -- for users diff --git a/src/Application.hs b/src/Application.hs index f8fedf4f4..e8892582c 100644 --- a/src/Application.hs +++ b/src/Application.hs @@ -147,6 +147,10 @@ import Handler.Error import Handler.Upload import Handler.Qualification import Handler.LMS +import Handler.ApiDocs +import Handler.Swagger + +import ServantApi () -- YesodSubDispatch instances -- This line actually creates our YesodDispatch instance. It is the second half -- of the call to mkYesodData which occurs in Foundation.hs. Please see the diff --git a/src/Auth/Dummy.hs b/src/Auth/Dummy.hs index 351893fc9..05a9d05cb 100644 --- a/src/Auth/Dummy.hs +++ b/src/Auth/Dummy.hs @@ -28,7 +28,7 @@ dummyForm :: ( RenderMessage (HandlerSite m) FormMessage ) => WForm m (FormResult (CI Text)) dummyForm = do mr <- getMessageRender - wreq (ciField & addDatalist userList) (fslpI MsgDummyIdent (mr MsgDummyIdentPlaceholder) & noAutocomplete & addName PostLoginDummy) Nothing + wreq (ciField & addDatalist userList) (fslpI MsgDummyIdent (mr MsgDummyIdentPlaceholder) & addAttr "autocomplete" "username" & addName PostLoginDummy) Nothing where userList = fmap mkOptionList . runDB $ withReaderT projectBackend (map toOption <$> selectList [] [Asc UserIdent] :: ReaderT SqlBackend _ [Option UserIdent]) toOption (Entity _ User{..}) = Option userDisplayName userIdent (CI.original userIdent) @@ -40,7 +40,7 @@ dummyLogin :: forall site. ( YesodAuth site , YesodPersist site , SqlBackendCanRead (YesodPersistBackend site) - , RenderMessage site AFormMessage + , RenderAFormSite site , RenderMessage site DummyMessage , RenderMessage site (ValueRequired site) , Button site ButtonSubmit @@ -52,7 +52,7 @@ dummyLogin = AuthPlugin{..} apDispatch :: forall m. MonadAuthHandler site m => Text -> [Text] -> m TypedContent apDispatch method [] | encodeUtf8 method == methodPost = liftSubHandler $ do - ((loginRes, _), _) <- runFormPost $ renderWForm FormStandard dummyForm + ((loginRes, _), _) <- runFormPost $ renderWForm FormLogin dummyForm tp <- getRouteToParent case loginRes of FormFailure errs -> do @@ -69,7 +69,7 @@ dummyLogin = AuthPlugin{..} apLogin :: (Route Auth -> Route site) -> WidgetFor site () apLogin toMaster = do - (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormStandard dummyForm + (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormLogin dummyForm let loginForm = wrapForm login FormSettings { formMethod = POST , formAction = Just . SomeRoute . toMaster $ PluginR apName [] diff --git a/src/Auth/LDAP.hs b/src/Auth/LDAP.hs index d26695d5e..75b8acfdb 100644 --- a/src/Auth/LDAP.hs +++ b/src/Auth/LDAP.hs @@ -182,8 +182,8 @@ campusForm :: ( RenderMessage (HandlerSite m) FormMessage campusForm = do MsgRenderer mr <- getMsgRenderer aFormToWForm $ CampusLogin - <$> areq ciField (fslpI MsgCampusIdent (mr MsgCampusIdentPlaceholder) & addAttr "autofocus" "") Nothing - <*> areq passwordField (fslpI MsgCampusPassword (mr MsgCampusPasswordPlaceholder)) Nothing + <$> areq ciField (fslpI MsgCampusIdent (mr MsgCampusIdentPlaceholder) & addAttr "autofocus" "" & addAttr "autocomplete" "username") Nothing + <*> areq passwordField (fslpI MsgCampusPassword (mr MsgCampusPasswordPlaceholder) & addAttr "autocomplete" "current-password") Nothing apLdap :: Text apLdap = "LDAP" @@ -191,7 +191,7 @@ apLdap = "LDAP" campusLogin :: forall site. ( YesodAuth site , RenderMessage site CampusMessage - , RenderMessage site AFormMessage + , RenderAFormSite site , RenderMessage site (ValueRequired site) , RenderMessage site ADInvalidCredentials , Button site ButtonSubmit @@ -203,7 +203,7 @@ campusLogin pool mode = AuthPlugin{..} apDispatch :: forall m. MonadAuthHandler site m => Text -> [Text] -> m TypedContent apDispatch method [] | encodeUtf8 method == methodPost = liftSubHandler $ do - ((loginRes, _), _) <- runFormPost $ renderWForm FormStandard campusForm + ((loginRes, _), _) <- runFormPost $ renderWForm FormLogin campusForm tp <- getRouteToParent resp <- formResultMaybe loginRes $ \CampusLogin{ campusIdent = CI.original -> campusIdent, ..} -> Just <$> do @@ -258,7 +258,7 @@ campusLogin pool mode = AuthPlugin{..} apLogin :: (Route Auth -> Route site) -> WidgetFor site () apLogin toMaster = do - (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormStandard campusForm + (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormLogin campusForm let loginForm = wrapForm login FormSettings { formMethod = POST , formAction = Just . SomeRoute . toMaster $ PluginR apName [] diff --git a/src/Auth/PWHash.hs b/src/Auth/PWHash.hs index 9cca6d440..9617aa70a 100644 --- a/src/Auth/PWHash.hs +++ b/src/Auth/PWHash.hs @@ -37,8 +37,8 @@ hashForm :: ( RenderMessage (HandlerSite m) FormMessage hashForm = do MsgRenderer mr <- getMsgRenderer aFormToWForm $ HashLogin - <$> areq ciField (fslpI MsgPWHashIdent (mr MsgPWHashIdentPlaceholder)) Nothing - <*> areq passwordField (fslpI MsgPWHashPassword (mr MsgPWHashPasswordPlaceholder)) Nothing + <$> areq ciField (fslpI MsgPWHashIdent (mr MsgPWHashIdentPlaceholder) & addAttr "autocomplete" "username") Nothing + <*> areq passwordField (fslpI MsgPWHashPassword (mr MsgPWHashPasswordPlaceholder) & addAttr "autocomplete" "current-password") Nothing apHash :: Text apHash = "PWHash" @@ -49,7 +49,7 @@ hashLogin :: forall site. , SqlBackendCanRead (YesodPersistBackend site) , PersistRecordBackend User (YesodPersistBackend site) , RenderMessage site PWHashMessage - , RenderMessage site AFormMessage + , RenderAFormSite site , RenderMessage site (ValueRequired site) , Button site ButtonSubmit ) => PWHashAlgorithm -> AuthPlugin site @@ -60,7 +60,7 @@ hashLogin pwHashAlgo = AuthPlugin{..} apDispatch :: forall m. MonadAuthHandler site m => Text -> [Text] -> m TypedContent apDispatch method [] | encodeUtf8 method == methodPost = liftSubHandler $ do - ((loginRes, _), _) <- runFormPost $ renderWForm FormStandard hashForm + ((loginRes, _), _) <- runFormPost $ renderWForm FormLogin hashForm tp <- getRouteToParent resp <- formResultMaybe loginRes $ \HashLogin{..} -> Just <$> do @@ -81,7 +81,7 @@ hashLogin pwHashAlgo = AuthPlugin{..} apLogin :: (Route Auth -> Route site) -> WidgetFor site () apLogin toMaster = do - (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormStandard hashForm + (login, loginEnctype) <- handlerToWidget . generateFormPost $ renderWForm FormLogin hashForm let loginForm = wrapForm login FormSettings { formMethod = POST , formAction = Just . SomeRoute . toMaster $ PluginR apName [] diff --git a/src/Control/Monad/Trans/Except/Instances.hs b/src/Control/Monad/Trans/Except/Instances.hs new file mode 100644 index 000000000..1bceee959 --- /dev/null +++ b/src/Control/Monad/Trans/Except/Instances.hs @@ -0,0 +1,19 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Control.Monad.Trans.Except.Instances + () where + +import ClassyPrelude + +import Control.Monad.Trans.Except (ExceptT(..), runExceptT) + +import Control.Arrow (left) + + +newtype UnliftIOExceptTError e = UnliftIOExceptTError { getUnliftIOExceptTError :: e } + deriving (Read, Show, Generic, Typeable) + deriving newtype (Exception) + + +instance (Exception e, MonadUnliftIO m) => MonadUnliftIO (ExceptT e m) where + withRunInIO cont = ExceptT (withRunInIO $ \runInner -> fmap (left getUnliftIOExceptTError) . try $ cont (either (throwIO . UnliftIOExceptTError) return <=< runInner . runExceptT)) diff --git a/src/Control/Monad/Trans/Random/Instances.hs b/src/Control/Monad/Trans/Random/Instances.hs new file mode 100644 index 000000000..98bfdab77 --- /dev/null +++ b/src/Control/Monad/Trans/Random/Instances.hs @@ -0,0 +1,17 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Control.Monad.Trans.Random.Instances + () where + +-- import ClassyPrelude +import qualified Control.Monad.Trans.Random.Strict as Strict +import qualified Control.Monad.Trans.Random.Lazy as Lazy + +import Control.Monad.Morph (MFunctor(..)) + + +instance MFunctor (Strict.RandT g) where + hoist = Strict.mapRandT + +instance MFunctor (Lazy.RandT g) where + hoist = Lazy.mapRandT diff --git a/src/CryptoID.hs b/src/CryptoID.hs index c74ccf409..2e57178c8 100644 --- a/src/CryptoID.hs +++ b/src/CryptoID.hs @@ -52,6 +52,7 @@ decCryptoIDs [ ''SubmissionId , ''CourseNewsId , ''CourseEventId , ''TutorialId + , ''ExternalApiId , ''ExternalExamId , ''MaterialFileId , ''AllocationMatchingId diff --git a/src/Data/CaseInsensitive/Instances.hs b/src/Data/CaseInsensitive/Instances.hs index bc5a483bd..f54a38f1f 100644 --- a/src/Data/CaseInsensitive/Instances.hs +++ b/src/Data/CaseInsensitive/Instances.hs @@ -28,6 +28,8 @@ import Web.HttpApiData import qualified Data.Csv as Csv +import qualified Data.Swagger as Swagger + import Utils.Persist import Data.Proxy @@ -98,6 +100,8 @@ instance PathPiece [CI Char] where instance ToHttpApiData s => ToHttpApiData (CI s) where toUrlPiece = toUrlPiece . CI.original toEncodedUrlPiece = toEncodedUrlPiece . CI.original + toHeader = toHeader . CI.original + toQueryParam = toQueryParam . CI.original instance (CI.FoldCase s, FromHttpApiData s) => FromHttpApiData (CI s) where parseUrlPiece = fmap CI.mk . parseUrlPiece @@ -112,6 +116,12 @@ instance Csv.ToField s => Csv.ToField (CI s) where instance (CI.FoldCase s, Csv.FromField s) => Csv.FromField (CI s) where parseField = fmap CI.mk . Csv.parseField +instance Swagger.ToParamSchema s => Swagger.ToParamSchema (CI s) where + toParamSchema _ = Swagger.toParamSchema (Proxy @s) + +instance Swagger.ToSchema s => Swagger.ToSchema (CI s) where + declareNamedSchema _ = Swagger.declareNamedSchema (Proxy @s) + instance (CI.FoldCase s, Binary s) => Binary (CI s) where get = CI.mk <$> Binary.get put = Binary.put . CI.original diff --git a/src/Data/CryptoID/Instances.hs b/src/Data/CryptoID/Instances.hs index b48c0df70..56b4819bd 100644 --- a/src/Data/CryptoID/Instances.hs +++ b/src/Data/CryptoID/Instances.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE UndecidableInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Data.CryptoID.Instances @@ -5,6 +6,8 @@ module Data.CryptoID.Instances ) where import qualified Data.CryptoID as CID +import qualified Data.CryptoID.Poly as CID +import qualified Data.CryptoID.Class.ImplicitNamespace as I import Text.Blaze (ToMarkup(..)) @@ -18,6 +21,32 @@ import Data.Aeson (ToJSON(..), ToJSONKey(..), ToJSONKeyFunction(..)) import qualified Data.Csv as Csv +import Data.Swagger (ToSchema, ToParamSchema) + +import Servant.Docs (ToSample(..)) + +import Control.Monad.Catch.Pure + +import Data.Proxy +import Data.Tagged + +import System.IO.Unsafe + +import Control.Lens ((??)) + + +deriving newtype instance ToParamSchema s => ToParamSchema (CID.CryptoID c s) +deriving newtype instance ToSchema s => ToSchema (CID.CryptoID c s) + +sampleKey :: CID.CryptoIDKey +sampleKey = unsafePerformIO CID.genKey +{-# NOINLINE sampleKey #-} + +instance (ToSample p, ns ~ I.CryptoIDNamespace c p, CID.HasCryptoID ns c p (ReaderT CID.CryptoIDKey Catch)) => ToSample (Tagged p (CID.CryptoID ns c)) where + toSamples _ = mapMaybe (\(l, s) -> (l, ) <$> encrypt' s) $ toSamples (Proxy @p) + where + encrypt' :: p -> Maybe (Tagged p (CID.CryptoID ns c)) + encrypt' p = either (const Nothing) (Just . Tagged) . runCatch . (runReaderT ?? sampleKey) $ I.encrypt p instance ToMarkup s => ToMarkup (CID.CryptoID c s) where toMarkup = toMarkup . CID.ciphertext diff --git a/src/Data/HashSet/Instances.hs b/src/Data/HashSet/Instances.hs new file mode 100644 index 000000000..6c20a7af3 --- /dev/null +++ b/src/Data/HashSet/Instances.hs @@ -0,0 +1,17 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Data.HashSet.Instances + () where + +import ClassyPrelude + +import Servant.Docs + +import qualified Data.HashSet as HashSet + +import Control.Lens +import Data.Proxy + + +instance (ToSample a, Hashable a, Eq a) => ToSample (HashSet a) where + toSamples _ = over _2 HashSet.fromList <$> toSamples (Proxy @[a]) diff --git a/src/Data/NonNull/Instances.hs b/src/Data/NonNull/Instances.hs index ad472219a..76618cc4f 100644 --- a/src/Data/NonNull/Instances.hs +++ b/src/Data/NonNull/Instances.hs @@ -13,6 +13,12 @@ import qualified Data.Binary as Binary import Control.Monad.Fail +import Data.Swagger.Schema (ToSchema(..)) + +import Data.Proxy + +import Servant.Docs + instance ToJSON a => ToJSON (NonNull a) where toJSON = toJSON . toNullable @@ -20,6 +26,15 @@ instance ToJSON a => ToJSON (NonNull a) where instance (FromJSON a, MonoFoldable a) => FromJSON (NonNull a) where parseJSON = parseJSON >=> maybe (fail "Expected non-empty structure") return . fromNullable +instance ToSchema a => ToSchema (NonNull a) where + declareNamedSchema _ = declareNamedSchema $ Proxy @a + +instance (ToSample a, MonoFoldable a) => ToSample (NonNull a) where + toSamples _ = do + (l, s) <- toSamples (Proxy @a) + s' <- maybe mzero pure $ fromNullable s + return (l, s') + instance Hashable a => Hashable (NonNull a) where hashWithSalt s = hashWithSalt s . toNullable diff --git a/src/Data/SemVer/Instances.hs b/src/Data/SemVer/Instances.hs new file mode 100644 index 000000000..51d60dfb2 --- /dev/null +++ b/src/Data/SemVer/Instances.hs @@ -0,0 +1,31 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Data.SemVer.Instances + () where + +import ClassyPrelude +import qualified Data.SemVer as SemVer +import qualified Data.SemVer.Constraint as SemVer (Constraint(..)) +import qualified Data.SemVer.Constraint as SemVer.Constraint + +import Web.HttpApiData + + +instance ToHttpApiData SemVer.Version where + toUrlPiece = SemVer.toText + +instance ToHttpApiData SemVer.Constraint where + toUrlPiece SemVer.CAny = "*" + toUrlPiece (SemVer.CLt v) = "<" <> toUrlPiece v + toUrlPiece (SemVer.CLtEq v) = "<=" <> toUrlPiece v + toUrlPiece (SemVer.CGt v) = ">" <> toUrlPiece v + toUrlPiece (SemVer.CGtEq v) = ">=" <> toUrlPiece v + toUrlPiece (SemVer.CEq v) = toUrlPiece v + toUrlPiece (SemVer.CAnd a b) = toUrlPiece a <> " " <> toUrlPiece b + toUrlPiece (SemVer.COr a b) = toUrlPiece a <> " || " <> toUrlPiece b + +instance FromHttpApiData SemVer.Version where + parseUrlPiece = first pack . SemVer.fromText + +instance FromHttpApiData SemVer.Constraint where + parseUrlPiece = first pack . SemVer.Constraint.fromText diff --git a/src/Data/Time/Clock/Instances.hs b/src/Data/Time/Clock/Instances.hs index 979e474eb..466eba89a 100644 --- a/src/Data/Time/Clock/Instances.hs +++ b/src/Data/Time/Clock/Instances.hs @@ -12,6 +12,7 @@ import Data.Proxy import Data.Time.Clock import Data.Time.Calendar +import Data.Time.Clock.Instances.TH () import Data.Time.Calendar.Instances () import Web.PathPieces @@ -19,6 +20,11 @@ import qualified Data.Csv as Csv import Data.Time.Format.ISO8601 +import Servant.Docs (ToSample(..), samples) + +import qualified Language.Haskell.TH as TH +import qualified Language.Haskell.TH.Syntax as TH + instance Hashable DiffTime where hashWithSalt s = hashWithSalt s . toRational @@ -105,3 +111,10 @@ instance PersistField CalendarDiffDays where instance PersistFieldSql CalendarDiffDays where sqlType _ = sqlType (Proxy @(CDDdb, CDDdb)) + +instance ToSample UTCTime where + toSamples _ = samples $ do + diff <- [0,172801..] + sign <- [1, -1] + return $ (sign * diff) `addUTCTime` now + where now = $(TH.lift =<< TH.runIO getCurrentTime) diff --git a/src/Data/Time/Clock/Instances/TH.hs b/src/Data/Time/Clock/Instances/TH.hs new file mode 100644 index 000000000..4c705bf5d --- /dev/null +++ b/src/Data/Time/Clock/Instances/TH.hs @@ -0,0 +1,14 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Data.Time.Clock.Instances.TH + () where + +import ClassyPrelude + +import Data.Time.Calendar.Instances () + +import qualified Language.Haskell.TH.Syntax as TH + + +instance TH.Lift UTCTime where + liftTyped UTCTime{..} = [e||UTCTime $$(TH.liftTyped utctDay) $ fromRational $$(TH.liftTyped $ toRational utctDayTime)||] diff --git a/src/Data/UUID/Instances.hs b/src/Data/UUID/Instances.hs index 15655fd18..88b01a446 100644 --- a/src/Data/UUID/Instances.hs +++ b/src/Data/UUID/Instances.hs @@ -13,6 +13,9 @@ import Data.Proxy import Text.Blaze (ToMarkup(..)) +import Servant.Docs (ToSample(..), samples) +import Crypto.Random + instance PathPiece UUID where fromPathPiece = UUID.fromString . unpack @@ -38,3 +41,10 @@ instance ToMarkup UUID where instance ToWidget site UUID where toWidget = toWidget . toMarkup + +sampleNotRandom :: MonadPseudoRandom ChaChaDRG a -> a +sampleNotRandom = fst . withDRG (drgNewSeed $ seedFromInteger 0) + +instance ToSample UUID where + toSamples _ = samples $ sampleNotRandom getRandoms + where getRandoms = fmap (maybe id (:) . UUID.fromByteString . fromStrict) (getRandomBytes 16) <*> getRandoms diff --git a/src/Database/Persist/Class/Instances.hs b/src/Database/Persist/Class/Instances.hs index 02401e3af..98044d16f 100644 --- a/src/Database/Persist/Class/Instances.hs +++ b/src/Database/Persist/Class/Instances.hs @@ -21,6 +21,8 @@ import Data.Aeson (ToJSONKey, FromJSONKey) import Control.Monad.Fail +import Servant.Docs (ToSample(..), samples) + instance PersistEntity record => Hashable (Key record) where hashWithSalt s = hashWithSalt s . toPersistValue @@ -40,3 +42,6 @@ instance PersistEntity record => Eq (Unique record) where deriving newtype instance ToJSONKey (BackendKey SqlBackend) deriving newtype instance FromJSONKey (BackendKey SqlBackend) + +instance ToSample (BackendKey SqlBackend) where + toSamples _ = samples [0..] diff --git a/src/Foundation/Authorization.hs b/src/Foundation/Authorization.hs index 159f93275..6df5f3417 100644 --- a/src/Foundation/Authorization.hs +++ b/src/Foundation/Authorization.hs @@ -9,6 +9,7 @@ module Foundation.Authorization , wouldHaveReadAccessToIff, wouldHaveWriteAccessToIff , AuthContext(..), getAuthContext , isDryRun, isDryRunDB + , IsDryRun(..) , maybeBearerToken, requireBearerToken , requireCurrentBearerRestrictions, maybeCurrentBearerRestrictions , BearerAuthSite, MonadAP @@ -271,7 +272,9 @@ getAuthContext = liftHandler $ do return authCtx newtype IsDryRun = MkIsDryRun { unIsDryRun :: Bool } - deriving (Eq, Ord, Read, Show, Generic, Typeable) + deriving stock (Read, Show, Generic, Typeable) + deriving newtype (Eq, Ord) + deriving (Semigroup, Monoid) via Any isDryRun :: ( HasCallStack , BearerAuthSite UniWorX @@ -279,17 +282,19 @@ isDryRun :: ( HasCallStack => HandlerFor UniWorX Bool isDryRun = fmap unIsDryRun . cached . fmap MkIsDryRun $ runDBRead isDryRunDB -isDryRunDB :: forall m backend. +isDryRunDB :: forall m backend m'. ( HasCallStack , MonadAP m, MonadCatch m + , MonadSite UniWorX m' , BearerAuthSite UniWorX - , WithRunDB backend (HandlerFor UniWorX) m + , WithRunDB backend m' m , BackendCompatible SqlReadBackend backend ) => m Bool isDryRunDB = fmap unIsDryRun . cached . fmap MkIsDryRun $ orM [ hasGlobalPostParam PostDryRun , hasGlobalGetParam GetDryRun + , hasCustomHeader HeaderDryRun , and2M bearerDryRun bearerRequired ] where @@ -303,7 +308,7 @@ isDryRunDB = fmap unIsDryRun . cached . fmap MkIsDryRun $ orM noTokenAuth = over _dnfTerms . Set.filter . noneOf (re _nullable . folded) $ (== AuthToken) . plVar dnf <- throwLeft $ routeAuthTags currentRoute - let eval :: forall m'. MonadAP m' => AuthTagsEval m' + let eval :: forall m''. MonadAP m'' => AuthTagsEval m'' eval dnf' mAuthId' route' isWrite' = evalAuthTags 'isDryRun (AuthTagActive $ const True) eval (noTokenAuth dnf') mAuthId' route' isWrite' in guardAuthResult <=< evalWriterT $ eval dnf mAuthId currentRoute isWrite @@ -1717,9 +1722,6 @@ authTagSpecificity = comparing $ NTop . flip findIndex eqClasses . elem , [ AuthOwner, AuthRated ] -- Submission wide ] -defaultAuthDNF :: AuthDNF -defaultAuthDNF = predDNFVar AuthAdmin `predDNFOr` predDNFVar AuthToken - routeAuthTags :: Route UniWorX -> Either InvalidAuthTag AuthDNF -- ^ DNF up to entailment, see `predDNFEntail` routeAuthTags = fmap predDNFEntail . ofoldM parse defaultAuthDNF . routeAttrs diff --git a/src/Foundation/I18n.hs b/src/Foundation/I18n.hs index d84116792..8c635d4e7 100644 --- a/src/Foundation/I18n.hs +++ b/src/Foundation/I18n.hs @@ -140,6 +140,11 @@ ordinalEN (toMessage -> numStr) = case lastChar of where lastChar = last <$> fromNullable numStr +notDE :: Bool -> Text +notDE = bool "nicht" "" + +notEN :: Bool -> Text +notEN = bool "not" "" -- | Convenience function for i18n messages definitions maybeToMessage :: ToMessage m => Text -> Maybe m -> Text -> Text @@ -486,6 +491,12 @@ instance RenderMessage UniWorX ShortWeekDay where embedRenderMessage ''UniWorX ''ButtonSubmit id +instance RenderMessage UniWorX VolatileClusterSettingsKey where + renderMessage foundation ls = \case + ClusterVolatileQuickActionsEnabled -> mr MsgClusterVolatileQuickActionsEnabled + where + mr :: forall msg. RenderMessage UniWorX msg => msg -> Text + mr = renderMessage foundation ls unRenderMessage' :: (Ord a, Finite a, RenderMessage master a) => (Text -> Text -> Bool) -> master -> Text -> [a] unRenderMessage' cmp foundation inp = nubOrd $ do diff --git a/src/Foundation/Instances.hs b/src/Foundation/Instances.hs index 1bb5da169..bb721e34d 100644 --- a/src/Foundation/Instances.hs +++ b/src/Foundation/Instances.hs @@ -273,12 +273,12 @@ instance YesodMail UniWorX where wait mailProcess -- Abort transaction if sending failed wait mailProcess -- Rethrow exceptions for mailprocess; technically unnecessary due to linkage, doesn't hurt, though -instance (MonadThrow m, MonadHandler m, HandlerSite m ~ UniWorX) => MonadCrypto m where +instance (MonadThrow m, MonadSite UniWorX m) => MonadCrypto m where type MonadCryptoKey m = CryptoIDKey - cryptoIDKey f = getsYesod appCryptoIDKey >>= f + cryptoIDKey f = getsSite appCryptoIDKey >>= f -instance {-# OVERLAPPING #-} (Monad m, MonadHandler m, HandlerSite m ~ UniWorX) => MonadSecretBox m where - secretBoxKey = getsYesod appSecretBoxKey +instance {-# OVERLAPPING #-} (Monad m, MonadSite UniWorX m) => MonadSecretBox m where + secretBoxKey = getsSite appSecretBoxKey instance {-# OVERLAPPING #-} (Monad m, MonadHandler m, HandlerSite m ~ UniWorX) => MonadAuth m where authKey = getsYesod appAuthKey diff --git a/src/Foundation/Navigation.hs b/src/Foundation/Navigation.hs index 11cca667f..fefd51814 100644 --- a/src/Foundation/Navigation.hs +++ b/src/Foundation/Navigation.hs @@ -111,7 +111,6 @@ breadcrumb (SchoolR ssh sRoute) = case sRoute of School{..} <- MaybeT $ get ssh isAdmin <- lift $ hasReadAccessTo SchoolListR return (CI.original schoolName, bool Nothing (Just SchoolListR) isAdmin) - breadcrumb SchoolNewR = i18nCrumb MsgMenuSchoolNew $ Just SchoolListR breadcrumb (ExamOfficeR EOExamsR) = i18nCrumb MsgMenuExamOfficeExams Nothing @@ -386,6 +385,11 @@ breadcrumb (EExamR tid ssh coursen examn sRoute) = case sRoute of EEStaffInviteR -> i18nCrumb MsgBreadcrumbExternalExamStaffInvite . Just $ EExamR tid ssh coursen examn EEShowR EECorrectR -> i18nCrumb MsgBreadcrumbExternalExamCorrect . Just $ EExamR tid ssh coursen examn EEShowR +breadcrumb (ExternalApisR _) = i18nCrumb MsgBreadcrumbExternalApis Nothing + +breadcrumb ApiDocsR = i18nCrumb MsgBreadcrumbApiDocs Nothing +breadcrumb SwaggerR = i18nCrumb MsgBreadcrumbSwagger $ Just ApiDocsR +breadcrumb SwaggerJsonR = breadcrumb SwaggerR data NavQuickView = NavQuickViewFavourite @@ -524,8 +528,8 @@ navLinkAccess NavLink{..} = case navAccess' of defaultLinks :: ( MonadHandler m , HandlerSite m ~ UniWorX - -- , MonadThrow m - -- , WithRunDB SqlReadBackend (HandlerFor UniWorX) m + -- , MonadThrow m + -- , WithRunDB SqlReadBackend (HandlerFor UniWorX) m , BearerAuthSite UniWorX ) => m [Nav] defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the header. @@ -661,6 +665,14 @@ defaultLinks = fmap catMaybes . mapM runMaybeT $ -- Define the menu items of the , navQuick' = mempty , navForceActive = False } + , return $ NavFooter NavLink + { navLabel = MsgMenuApiDocs + , navRoute = ApiDocsR + , navAccess' = NavAccessTrue + , navType = NavTypeLink { navModal = False } + , navQuick' = mempty + , navForceActive = False + } , return NavHeader { navHeaderRole = NavHeaderPrimary , navIcon = IconMenuNews @@ -2448,7 +2460,19 @@ pageActions (LmsR sid qsh) = return navLink = defNavLink MsgMenuLmsEdit $ LmsEditR sid qsh } ] - +pageActions ApiDocsR = return + [ NavPageActionPrimary + { navLink = NavLink + { navLabel = MsgMenuSwagger + , navRoute = SwaggerR + , navAccess' = NavAccessTrue + , navType = NavTypeLink { navModal = False } + , navQuick' = mempty + , navForceActive = False + } + , navChildren = [] + } + ] pageActions _ = return [] submissionList :: ( MonadIO m diff --git a/src/Foundation/Routes.hs b/src/Foundation/Routes.hs index 03051889d..7a6824df4 100644 --- a/src/Foundation/Routes.hs +++ b/src/Foundation/Routes.hs @@ -11,6 +11,10 @@ import Foundation.Type import Foundation.Routes.Definitions + +import ServantApi.ExternalApis.Type + + -- This is where we define all of the routes in our application. For a full -- explanation of the syntax, please see: -- http://www.yesodweb.com/book/routing-and-handlers @@ -41,6 +45,27 @@ deriving instance Generic CourseEventR deriving instance Generic AMatchingR deriving instance Generic (Route UniWorX) + +instance Hashable CourseR +instance Hashable SheetR +instance Hashable SubmissionR +instance Hashable MaterialR +instance Hashable TutorialR +instance Hashable ExamR +instance Hashable EExamR +instance Hashable CourseApplicationR +instance Hashable AllocationR +instance Hashable SchoolR +instance Hashable ExamOfficeR +instance Hashable CourseNewsR +instance Hashable CourseEventR +instance Hashable AMatchingR +instance Hashable (Route UniWorX) +instance Hashable (Route EmbeddedStatic) where + hashWithSalt s = hashWithSalt s . renderRoute +instance Hashable (Route Auth) where + hashWithSalt s = hashWithSalt s . renderRoute + instance Ord (Route Auth) where compare = compare `on` renderRoute instance Ord (Route EmbeddedStatic) where @@ -65,6 +90,7 @@ deriving instance Ord (Route UniWorX) data RouteChildren type instance Children RouteChildren a = ChildrenRouteChildren a type family ChildrenRouteChildren a where + ChildrenRouteChildren (Route (ServantApi _)) = '[] ChildrenRouteChildren (Route EmbeddedStatic) = '[] ChildrenRouteChildren (Route Auth) = '[] ChildrenRouteChildren UUID = '[] diff --git a/src/Foundation/Servant.hs b/src/Foundation/Servant.hs new file mode 100644 index 000000000..380703d79 --- /dev/null +++ b/src/Foundation/Servant.hs @@ -0,0 +1,195 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE UndecidableInstances, InstanceSigs #-} + +module Foundation.Servant + ( ServantApiDispatchUniWorX(..) + , UniWorXContext + , ServantHandler, ServantDB + ) where + +import Import.Servant.NoFoundation +import Foundation.DB (runSqlPoolRetry') +import Foundation.Authorization (maybeBearerToken, IsDryRun(..), isDryRun) +import Foundation.Instances () + +import qualified Data.HashMap.Strict.InsOrd as HashMap + +import Network.Wai (Middleware, modifyResponse, mapResponseHeaders) +import qualified Network.Wai as W + +import Servant.Server.Internal.DelayedIO (DelayedIO, delayedFail, delayedFailFatal) + +import qualified Yesod.Servant as Servant + +import qualified Data.Text as Text + +import Control.Monad.Catch.Pure + +import Servant.Server.Internal.Delayed +import Servant.Server.Internal.Router + +import Database.Persist.Sql (transactionUndo) + +import qualified Data.CaseInsensitive as CI + + +instance ( HasServer sub context + , ToJSON restr, FromJSON restr + , SBoolI (FoldRequired mods) + , HasContextEntry context (Maybe (BearerToken UniWorX)) + , HasContextEntry context (Maybe (Route UniWorX)) + ) + => HasServer (CaptureBearerRestriction' mods restr :> sub) context + where + type ServerT (CaptureBearerRestriction' mods restr :> sub) m + = RequiredArgument mods restr -> ServerT sub m + + hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy @sub) pc nt . s + + route _ context subserver + = route (Proxy @sub) context (subserver `addAuthCheck` bearerCheck) + where + bearerCheck :: DelayedIO (RequiredArgument mods restr) + bearerCheck = do + let bearer :: Maybe (BearerToken UniWorX) + bearer = getContextEntry context + cRoute :: Maybe (Route UniWorX) + cRoute = getContextEntry context + + noRouteStored, noTokenProvided, noRestrictionProvided :: ServerError + noTokenProvided = err400 { errBody = "The behaviour of this route depends on restrictions stored in the bearer token used for authorization. Therefor providing a bearer token is required." } + noRestrictionProvided = err400 { errBody = "The behaviour of this route depends on restrictions stored in the bearer token used for authorization. Therefor the provided bearer token must contain a restriction entry for this route." } + noRouteStored = err500 { errBody = "servantYesodMiddleware did not store current route in WAI vault." } + + exceptT delayedFailFatal return $ do + cRoute' <- maybeExceptT' noRouteStored cRoute + + let mbRet :: Maybe (Maybe restr) + mbRet = bearer <&> preview (_bearerRestrictionIx cRoute') + case sbool @(FoldRequired mods) of + SFalse -> return $ join mbRet + STrue -> maybe (throwE noTokenProvided) (maybe (throwE noRestrictionProvided) return) mbRet + + +instance ( HasServer sub context + , SBoolI (FoldRequired mods) + , HasContextEntry context (Maybe (BearerToken UniWorX)) + ) + => HasServer (CaptureBearerToken' mods :> sub) context + where + type ServerT (CaptureBearerToken' mods :> sub) m + = RequiredArgument mods (BearerToken UniWorX) -> ServerT sub m + + hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy @sub) pc nt . s + + route _ context subserver + = route (Proxy @sub) context (subserver `addAuthCheck` bearerCheck) + where + bearerCheck :: DelayedIO (RequiredArgument mods (BearerToken UniWorX)) + bearerCheck = do + let bearer :: Maybe (BearerToken UniWorX) + bearer = getContextEntry context + + noTokenProvided :: ServerError + noTokenProvided = err400 { errBody = "The behaviour of this route depends on restrictions stored in the bearer token used for authorization. Therefor providing a bearer token is required." } + + exceptT delayedFailFatal return $ do + case sbool @(FoldRequired mods) of + SFalse -> return bearer + STrue -> maybe (throwE noTokenProvided) return bearer + + +instance ( HasServer sub context + , HasCryptoID ciphertext plaintext (ReaderT CryptoIDKey Catch) + , SBoolI (FoldLenient mods) + , FromHttpApiData ciphertext + , HasContextEntry context UniWorX + ) => HasServer (CaptureCryptoID' mods ciphertext sym plaintext :> sub) context where + type ServerT (CaptureCryptoID' mods ciphertext sym plaintext :> sub) m + = If (FoldLenient mods) (Either String plaintext) plaintext -> ServerT sub m + + hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy @sub) pc nt . s + + route _ context subserver = CaptureRouter . + route (Proxy @sub) context . addCapture subserver $ \txt -> case ( sbool :: SBool (FoldLenient mods) + , decrypt' <$> parseUrlPiece txt + ) of + (SFalse, Left e ) -> delayedFail err400{ errBody = fromStrict $ encodeUtf8 e } + (SFalse, Right (Left _ )) -> delayedFail err400{ errBody = "Could not decrypt CryptoID" } + (SFalse, Right (Right pID)) -> return pID + (STrue, join -> piece) -> return $ left unpack piece + where + decrypt' :: CryptoID ciphertext plaintext -> Either Text plaintext + decrypt' inp = left tshow . runCatch . runReaderT (decrypt inp) . appCryptoIDKey $ getContextEntry context + + +type UniWorXContext = Maybe (Route UniWorX) ': Maybe (BearerToken UniWorX) ': IsDryRun ': UniWorX ': '[] +type ServantHandler = ServantHandlerFor UniWorX +type ServantDB = ServantDBFor UniWorX + +deriving via (ServantLogYesod UniWorX) instance ServantLog UniWorX + +instance HasServantHandlerContext UniWorX where + data ServantHandlerContextFor UniWorX = ServantHandlerContextForUniWorX + { usctxSite :: UniWorX + , usctxRequest :: W.Request + , usctxIsDryRun :: IsDryRun + } + getSCtxSite = usctxSite + getSCtxRequest = usctxRequest + +class (HasServer (ServantApiUnproxy' proxy) UniWorXContext, Servant.HasRoute (ServantApiUnproxy' proxy)) => ServantApiDispatchUniWorX proxy where + servantServer' :: ServantApi proxy -> ServerT (ServantApiUnproxy' proxy) ServantHandler + +instance ServantApiDispatchUniWorX proxy => ServantApiDispatch UniWorXContext ServantHandler UniWorX proxy where + servantContext _ app _ = do + isDryRun' <- MkIsDryRun <$> isDryRun + restr <- maybeBearerToken + cRoute <- getCurrentRoute + return $ cRoute :. restr :. isDryRun' :. app :. EmptyContext + servantHoist _ usctxSite usctxRequest ctx = ($ ServantHandlerContextForUniWorX{ usctxIsDryRun = getContextEntry ctx, .. }) . unServantHandlerFor + servantMiddleware _ _ ctx = appEndo . foldMap Endo $ + guardOn (unIsDryRun $ getContextEntry ctx) (modifyResponse $ mapResponseHeaders setDryRunHeader) + ++ [ modifyResponse (mapResponseHeaders setDefaultHeaders) + , fixTrailingSlash + ] + servantYesodMiddleware _ _ = return id + servantServer proxy _ = servantServer' proxy + +setDefaultHeaders, setDryRunHeader :: ResponseHeaders -> ResponseHeaders +setDefaultHeaders existing = HashMap.toList $ HashMap.fromList existing <> defaultHeaders + where defaultHeaders = HashMap.fromList + [ ("X-Frame-Options", "sameorigin") + , ("X-Content-Type-Options", "nosniff") + , ("Vary", "Accept") + , ("X-XSS-Protection", "1; mode=block") + ] +setDryRunHeader existing = HashMap.toList $ HashMap.fromList existing <> HashMap.singleton (CI.mk . encodeUtf8 $ toPathPiece HeaderDryRun) (encodeUtf8 $ toPathPiece True) + +fixTrailingSlash :: Middleware +-- ^ `servant-server` contains a special case in their implementation +-- of `runRouter`, that discards trailing slashes. +-- +-- Because all slashes matter, this duplicates trailing slashes. +fixTrailingSlash = (. fixTrailingSlash') + where fixTrailingSlash' req + | Just pathInfo' <- fromNullable $ W.pathInfo req + , Text.null $ last pathInfo' + = req { W.pathInfo = W.pathInfo req ++ [Text.empty] } + | otherwise + = req + + +instance ServantPersist UniWorX where + runDB :: HasCallStack => ServantDBFor UniWorX a -> ServantHandlerFor UniWorX a + runDB = runDB' callStack + +runDB' :: CallStack -> ServantDBFor UniWorX a -> ServantHandlerFor UniWorX a +runDB' lbl action = do + $logDebugS "ServantPersist" "runDB" + MkIsDryRun dryRun <- getsServantContext usctxIsDryRun + let action' + | dryRun = action <* transactionUndo + | otherwise = action + + flip (runSqlPoolRetry' action') lbl . appConnPool =<< getSite diff --git a/src/Foundation/Servant/Types.hs b/src/Foundation/Servant/Types.hs new file mode 100644 index 000000000..3f3ca79b8 --- /dev/null +++ b/src/Foundation/Servant/Types.hs @@ -0,0 +1,424 @@ +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -fno-warn-redundant-constraints #-} + +module Foundation.Servant.Types + ( CaptureBearerRestriction, CaptureBearerRestriction' + , CaptureBearerToken, CaptureBearerToken' + , CaptureCryptoID', CaptureCryptoID, CaptureCryptoUUID, CaptureCryptoFileName + , ApiVersion, apiVersionToSemVer, matchesApiVersion + , BearerAuth, SessionAuth + ) where + +import ClassyPrelude hiding (fromList) +import Data.Proxy + +import Servant.API +import Servant.API.Modifiers (FoldRequired) +import Servant.API.Description +import Servant.Swagger +import Servant.Docs +import Servant.Server +import Servant.Server.Internal.Router +import Servant.Server.Internal.RouteResult +import Servant.Server.Internal.Delayed +import Servant.Server.Internal.ErrorFormatter +-- import Servant.Server.Internal.DelayedIO + +import Servant.Client.Core.RunClient (RunClient) +import Servant.Client.Core.HasClient +import qualified Servant.Client.Core.Request as Servant (Request) +import qualified Servant.Client.Core.Request as Request + +import Jose.Jwt (Jwt(..)) + +import Network.Wai (mapResponseHeaders, requestHeaders) + +import Control.Lens hiding (Context) + +import Data.UUID (UUID) +import Data.CaseInsensitive (CI) +import Data.CryptoID.Class.ImplicitNamespace +import Data.CryptoID.Instances () + +import GHC.TypeLits +import GHC.Exts (IsList(..)) + +import Data.Swagger hiding (version) + +import Data.Kind (Type) + +import qualified Data.SemVer as SemVer +import qualified Data.SemVer.Constraint as SemVer (Constraint) +import qualified Data.SemVer.Constraint as SemVer.Constraint + +import Data.SemVer.Instances () + + +type CaptureBearerRestriction = CaptureBearerRestriction' '[Required] +data CaptureBearerRestriction' (mods :: [Type]) (restr :: Type) + +type CaptureBearerToken = CaptureBearerToken' '[Required] +data CaptureBearerToken' (mods :: [Type]) + +data CaptureCryptoID' (mods :: [Type]) (ciphertext :: Type) (sym :: Symbol) (plaintext :: Type) +type CaptureCryptoID = CaptureCryptoID' '[] +type CaptureCryptoUUID = CaptureCryptoID UUID +type CaptureCryptoFileName = CaptureCryptoID (CI FilePath) + +data ApiVersion (major :: Nat) (minor :: Nat) (patch :: Nat) + +apiVersionToSemVer :: forall major minor patch p. + ( KnownNat major, KnownNat minor, KnownNat patch ) + => p (ApiVersion major minor patch) + -> SemVer.Version +apiVersionToSemVer _ = SemVer.version + (fromIntegral . natVal $ Proxy @major) + (fromIntegral . natVal $ Proxy @minor) + (fromIntegral . natVal $ Proxy @patch) + [] + [] + +matchesApiVersion :: forall major minor patch p. + ( KnownNat major, KnownNat minor, KnownNat patch ) + => p (ApiVersion major minor patch) + -> SemVer.Constraint + -> Bool +matchesApiVersion _ = SemVer.Constraint.satisfies . apiVersionToSemVer $ Proxy @(ApiVersion major minor patch) + + +instance HasLink sub => HasLink (CaptureBearerRestriction' mods restr :> sub) where + type MkLink (CaptureBearerRestriction' mods restr :> sub) r = MkLink sub r + toLink toA _ = toLink toA $ Proxy @sub + +instance HasLink sub => HasLink (CaptureBearerToken' mods :> sub) where + type MkLink (CaptureBearerToken' mods :> sub) r = MkLink sub r + toLink toA _ = toLink toA $ Proxy @sub + +instance (HasLink sub, ToHttpApiData ciphertext) => HasLink (CaptureCryptoID' mods ciphertext sym plaintext :> sub) where + type MkLink (CaptureCryptoID' mods ciphertext sym plaintext :> sub) r = MkLink (Capture' mods sym (CryptoID ciphertext plaintext) :> sub) r + toLink toA _ = toLink toA $ Proxy @(Capture' mods sym (CryptoID ciphertext plaintext) :> sub) + +instance HasLink sub => HasLink (ApiVersion major minor patch :> sub) where + type MkLink (ApiVersion major minor patch :> sub) r = MkLink sub r + toLink toA _ = toLink toA $ Proxy @sub + +instance HasSwagger sub => HasSwagger (CaptureBearerRestriction' mods restr :> sub) where + toSwagger _ = toSwagger $ Proxy @sub + +instance HasSwagger sub => HasSwagger (CaptureBearerToken' mods :> sub) where + toSwagger _ = toSwagger $ Proxy @sub + +instance (HasSwagger sub, ToParamSchema ciphertext, KnownSymbol sym, KnownSymbol (FoldDescription mods)) => HasSwagger (CaptureCryptoID' mods ciphertext sym plaintext :> sub) where + toSwagger _ = toSwagger $ Proxy @(Capture' mods sym (CryptoID ciphertext plaintext) :> sub) + +instance HasSwagger sub => HasSwagger (ApiVersion major minor patch :> sub) where + toSwagger _ = toSwagger $ Proxy @sub + +instance HasDocs sub => HasDocs (CaptureBearerRestriction' mods restr :> sub) where + docsFor _ (endpoint, action) = docsFor (Proxy @sub) (endpoint, action') + where action' = action & notes <>~ [DocNote "Bearer restrictions" ["The behaviour of this route dependes on the restrictions stored for it in the bearer token used for authorization"]] + +instance HasDocs sub => HasDocs (CaptureBearerToken' mods :> sub) where + docsFor _ (endpoint, action) = docsFor (Proxy @sub) (endpoint, action') + where action' = action & notes <>~ [DocNote "Bearer token" ["The behaviour of this route dependes on the exact bearer token used for authorization"]] + +instance (ToCapture (Capture sym ciphertext), KnownSymbol sym, HasDocs sub) => HasDocs (CaptureCryptoID' mods ciphertext sym plaintext :> sub) where + docsFor _ = docsFor $ Proxy @(Capture' mods sym ciphertext :> sub) + +instance (RunClient m, HasClient m (Capture' mods sym (CryptoID ciphertext plaintext) :> sub)) => HasClient m (CaptureCryptoID' mods ciphertext sym plaintext :> sub) where + type Client m (CaptureCryptoID' mods ciphertext sym plaintext :> sub) = Client m (Capture' mods sym (CryptoID ciphertext plaintext) :> sub) + clientWithRoute pm _ = clientWithRoute pm $ Proxy @(Capture' mods sym (CryptoID ciphertext plaintext) :> sub) + hoistClientMonad pm _ = hoistClientMonad pm $ Proxy @(Capture' mods sym (CryptoID ciphertext plaintext) :> sub) + + +type family ApiVersionSub major minor patch sup sub where + ApiVersionSub major minor patch (ApiVersion major' minor' patch') sub = ApiVersion major' minor' patch' :> sub + ApiVersionSub major minor patch sup sub = sup :> (ApiVersion major minor patch :> sub) + +instance HasServer (ApiVersionSub major minor patch sup sub) context => HasServer (ApiVersion major minor patch :> ((sup :: Type) :> sub)) context where + type ServerT (ApiVersion major minor patch :> (sup :> sub)) m = ServerT (ApiVersionSub major minor patch sup sub) m + hoistServerWithContext _ = hoistServerWithContext $ Proxy @(ApiVersionSub major minor patch sup sub) + route _ = route $ Proxy @(ApiVersionSub major minor patch sup sub) + +instance HasServer (sup :> (ApiVersion major minor patch :> sub)) context => HasServer (ApiVersion major minor patch :> ((sup :: Symbol) :> sub)) context where + type ServerT (ApiVersion major minor patch :> (sup :> sub)) m = ServerT (sup :> (ApiVersion major minor patch :> sub)) m + hoistServerWithContext _ = hoistServerWithContext $ Proxy @(sup :> (ApiVersion major minor patch :> sub)) + route _ = route $ Proxy @(sup :> (ApiVersion major minor patch :> sub)) + +instance ( HasServer (ApiVersion major minor patch :> a) context + , HasServer (ApiVersion major minor patch :> b) context + , SBoolI (IsLT (CmpVersion (FinalApiVersion (ApiVersion major minor patch :> a)) (FinalApiVersion (ApiVersion major minor patch :> b)))) + ) => HasServer (ApiVersion major minor patch :> (a :<|> b)) context where + type ServerT (ApiVersion major minor patch :> (a :<|> b)) m = ServerT (ApiVersion major minor patch :> a) m :<|> ServerT (ApiVersion major minor patch :> b) m + hoistServerWithContext _ = hoistServerWithContext $ Proxy @((ApiVersion major minor patch :> a) :<|> (ApiVersion major minor patch :> b)) + route Proxy context server = choice' + (route (Proxy @(ApiVersion major minor patch :> a)) context $ (\(a :<|> _) -> a) <$> server) + (route (Proxy @(ApiVersion major minor patch :> b)) context $ (\(_ :<|> b) -> b) <$> server) + where + choice' :: forall env' a'. Router' env' a' -> Router' env' a' -> Router' env' a' + choice' = case (sbool :: SBool (IsLT (CmpVersion (FinalApiVersion (ApiVersion major minor patch :> a)) (FinalApiVersion (ApiVersion major minor patch :> b))))) of + STrue -> flip choice + SFalse -> choice + +instance (RunClient m, HasClient m (ApiVersionSub major minor patch sup sub)) => HasClient m (ApiVersion major minor patch :> ((sup :: Type) :> sub)) where + type Client m (ApiVersion major minor patch :> (sup :> sub)) = Client m (ApiVersionSub major minor patch sup sub) + clientWithRoute pm _ = clientWithRoute pm $ Proxy @(ApiVersionSub major minor patch sup sub) + hoistClientMonad pm _ = hoistClientMonad pm $ Proxy @(ApiVersionSub major minor patch sup sub) + +instance (RunClient m, HasClient m (sup :> (ApiVersion major minor patch :> sub))) => HasClient m (ApiVersion major minor patch :> ((sup :: Symbol) :> sub)) where + type Client m (ApiVersion major minor patch :> (sup :> sub)) = Client m (sup :> (ApiVersion major minor patch :> sub)) + clientWithRoute pm _ = clientWithRoute pm $ Proxy @(sup :> (ApiVersion major minor patch :> sub)) + hoistClientMonad pm _ = hoistClientMonad pm $ Proxy @(sup :> (ApiVersion major minor patch :> sub)) + +instance ( HasClient m (ApiVersion major minor patch :> a) + , HasClient m (ApiVersion major minor patch :> b) + ) => HasClient m (ApiVersion major minor patch :> (a :<|> b)) where + type Client m (ApiVersion major minor patch :> (a :<|> b)) = Client m (ApiVersion major minor patch :> a) :<|> Client m (ApiVersion major minor patch :> b) + clientWithRoute pm _ req = clientWithRoute pm (Proxy @(ApiVersion major minor patch :> a)) req + :<|> clientWithRoute pm (Proxy @(ApiVersion major minor patch :> b)) req + hoistClientMonad pm _ f (ca :<|> cb) = hoistClientMonad pm (Proxy @(ApiVersion major minor patch :> a)) f ca + :<|> hoistClientMonad pm (Proxy @(ApiVersion major minor patch :> b)) f cb + + +versionRequestHeaderName :: CI ByteString +versionRequestHeaderName = "Accept-API-Version" + +routeWithApiVersion :: forall api context env major minor patch. + ( HasServer api context + , KnownNat major, KnownNat minor, KnownNat patch + , HasContextEntry (context .++ DefaultErrorFormatters) ErrorFormatters + ) + => Proxy (ApiVersion major minor patch) + -> Proxy api -> Context context -> Delayed env (Server api) -> Router env +routeWithApiVersion _ _ context subserver = RawRouter $ \env req ((. addVersion) -> cont) -> case maybe (pure SemVer.Constraint.CAny) parseHeader . lookup versionRequestHeaderName $ requestHeaders req of + Left parseErr -> cont $ FailFatal err400 { errBody = encodeUtf8 . fromStrict $ "Could not parse version constraint: " <> parseErr } + Right vHdr -> if + | version `SemVer.Constraint.satisfies` vHdr -> runRouterEnv notFound (route (Proxy @api) context subserver) env req cont + | otherwise -> cont $ Fail err400 { errBody = encodeUtf8 "Requested version could not be satisfied" } + where addVersion (Fail sError) = Fail sError { errHeaders = addVersionHeader $ errHeaders sError} + addVersion (FailFatal sError) = FailFatal sError { errHeaders = addVersionHeader $ errHeaders sError } + addVersion (Route resp) = Route $ mapResponseHeaders addVersionHeader resp + + addVersionHeader hdrs + | has (folded . _1 . only versionHeaderName) hdrs = hdrs + | otherwise = hdrs <> pure (versionHeaderName, versionHeader) + + version = apiVersionToSemVer $ Proxy @(ApiVersion major minor patch) + + versionHeaderName = "API-Version" + versionHeader = encodeUtf8 $ SemVer.toText version + + notFound = notFoundErrorFormatter . getContextEntry $ mkContextWithErrorFormatter context + +instance ( HasServer (Verb method statusCode contentTypes a) context + , KnownNat major, KnownNat minor, KnownNat patch + , HasContextEntry (context .++ DefaultErrorFormatters) ErrorFormatters + ) => HasServer (ApiVersion major minor patch :> Verb method statusCode contentTypes a) context where + type ServerT (ApiVersion major minor patch :> Verb method statusCode contentTypes a) m = ServerT (Verb method statusCode contentTypes a) m + + hoistServerWithContext _ = hoistServerWithContext $ Proxy @(Verb method statusCode contentTypes a) + + route _ = routeWithApiVersion (Proxy @(ApiVersion major minor patch)) (Proxy @(Verb method statusCode contentTypes a)) + +instance ( HasServer (NoContentVerb method) context + , KnownNat major, KnownNat minor, KnownNat patch + , HasContextEntry (context .++ DefaultErrorFormatters) ErrorFormatters + ) => HasServer (ApiVersion major minor patch :> NoContentVerb method) context where + type ServerT (ApiVersion major minor patch :> NoContentVerb method) m = ServerT (NoContentVerb method) m + + hoistServerWithContext _ = hoistServerWithContext $ Proxy @(NoContentVerb method) + + route _ = routeWithApiVersion (Proxy @(ApiVersion major minor patch)) (Proxy @(NoContentVerb method)) + + +semVerCompatibleTo :: SemVer.Version -> SemVer.Constraint +semVerCompatibleTo v = SemVer.Constraint.CAnd (SemVer.Constraint.CGtEq v) (SemVer.Constraint.CLt $ SemVer.incrementMajor v) + +instance ( HasClient m (Verb method statusCode contentTypes a) + , KnownNat major, KnownNat minor, KnownNat patch + ) => HasClient m (ApiVersion major minor patch :> Verb method statusCode contentTypes a) where + type Client m (ApiVersion major minor patch :> Verb method statusCode contentTypes a) = Client m (Verb method statusCode contentTypes a) + clientWithRoute pm _ = clientWithRoute pm (Proxy @(Verb method statusCode contentTypes a)) . Request.addHeader versionRequestHeaderName (semVerCompatibleTo version) + where version = apiVersionToSemVer $ Proxy @(ApiVersion major minor patch) + hoistClientMonad pm _ = hoistClientMonad pm $ Proxy @(Verb method statusCode contentTypes a) + +instance ( HasClient m (NoContentVerb method) + , KnownNat major, KnownNat minor, KnownNat patch + ) => HasClient m (ApiVersion major minor patch :> NoContentVerb method) where + type Client m (ApiVersion major minor patch :> NoContentVerb method) = Client m (NoContentVerb method) + clientWithRoute pm _ = clientWithRoute pm (Proxy @(NoContentVerb method)) . Request.addHeader versionRequestHeaderName (semVerCompatibleTo version) + where version = apiVersionToSemVer $ Proxy @(ApiVersion major minor patch) + hoistClientMonad pm _ = hoistClientMonad pm $ Proxy @(NoContentVerb method) + + +instance ( HasDocs (ApiVersionSub major minor patch sup sub) + ) => HasDocs (ApiVersion major minor patch :> ((sup :: Type) :> sub)) where + docsFor _ = docsFor $ Proxy @(ApiVersionSub major minor patch sup sub) + +instance ( HasDocs (sup :> (ApiVersion major minor patch :> sub)) + ) => HasDocs (ApiVersion major minor patch :> ((sup :: Symbol) :> sub)) where + docsFor _ = docsFor $ Proxy @(sup :> (ApiVersion major minor patch :> sub)) + +instance ( HasDocs (ApiVersion major minor patch :> a) + , HasDocs (ApiVersion major minor patch :> b) + ) => HasDocs (ApiVersion major minor patch :> (a :<|> b)) where + docsFor _ = docsFor $ Proxy @(ApiVersion major minor patch :> a :<|> ApiVersion major minor patch :> b) + + +apiVersionDocNote :: forall major minor patch. + ( KnownNat major, KnownNat minor, KnownNat patch ) + => Proxy (ApiVersion major minor patch) + -> DocNote +apiVersionDocNote p = DocNote "Versioning" ["This route is provided in version " <> SemVer.toString (apiVersionToSemVer p)] + +instance ( HasDocs (Verb method statusCode contentTypes a) + , KnownNat major, KnownNat minor, KnownNat patch + ) => HasDocs (ApiVersion major minor patch :> Verb method statusCode contentTypes a) where + docsFor _ (endpoint, action) = docsFor (Proxy @(Verb method statusCode contentTypes a)) (endpoint, action') + where action' = action & notes <>~ [apiVersionDocNote $ Proxy @(ApiVersion major minor patch)] + +instance ( HasDocs (NoContentVerb method) + , KnownNat major, KnownNat minor, KnownNat patch + ) => HasDocs (ApiVersion major minor patch :> NoContentVerb method) where + docsFor _ (endpoint, action) = docsFor (Proxy @(NoContentVerb method)) (endpoint, action') + where action' = action & notes <>~ [apiVersionDocNote $ Proxy @(ApiVersion major minor patch)] + + +type family FinalApiVersion api where + FinalApiVersion (ApiVersion major minor patch :> sub) = AlternativeMaybe (FinalApiVersion sub) ('Just (ApiVersion major minor patch)) + FinalApiVersion (sup :> sub) = FinalApiVersion sub + FinalApiVersion (a :<|> b) = MaxMaybe (CmpVersion (FinalApiVersion a) (FinalApiVersion b)) (FinalApiVersion a) (FinalApiVersion b) + FinalApiVersion (Verb method statusCode contentTypes a) = 'Nothing + FinalApiVersion (NoContentVerb method) = 'Nothing + +type family MaxMaybe ord a b where + MaxMaybe _ a 'Nothing = a + MaxMaybe _ 'Nothing b = b + MaxMaybe 'LT _ b = b + MaxMaybe _ a _ = a + +type family MappendOrdering a b where + MappendOrdering 'EQ b = b + MappendOrdering a _ = a + +type family AlternativeMaybe a b where + AlternativeMaybe ('Just a) _ = 'Just a + AlternativeMaybe _ ('Just b) = 'Just b + AlternativeMaybe _ _ = 'Nothing + +type family CmpVersion x y where + CmpVersion 'Nothing 'Nothing = 'EQ + CmpVersion 'Nothing _ = 'GT + CmpVersion _ 'Nothing = 'LT + CmpVersion ('Just (ApiVersion major minor patch)) ('Just (ApiVersion major' minor' patch')) = MappendOrdering (CmpNat major major') (MappendOrdering (CmpNat minor minor') (CmpNat patch patch')) + +type family IsLT x where + IsLT 'LT = 'True + IsLT _ = 'False + + +type instance IsElem' sa (CaptureCryptoID' mods ciphertext sym plaintext :> sb) = IsElem sa (Capture' mods sym (CryptoID ciphertext plaintext) :> sb) + +type instance IsElem' sa (ApiVersion major minor patch :> sb) = IsElem sa sb + + +type family StripBearer api where + StripBearer (CaptureBearerRestriction' mods restr :> sub) = sub + StripBearer (CaptureBearerToken' mods :> sub) = sub + StripBearer (BearerAuth :> sub) = sub + StripBearer (sup :> sub) = sup :> StripBearer sub + StripBearer (a :<|> b) = StripBearer a :<|> StripBearer b + StripBearer (Verb method statusCode contentTypes a) = Verb method statusCode contentTypes a + StripBearer (NoContentVerb method) = NoContentVerb method + +type family BearerRequired api where + BearerRequired (CaptureBearerRestriction' mods restr :> sub) = OrBool (FoldRequired mods) (BearerRequired sub) + BearerRequired (CaptureBearerToken' mods :> sub) = OrBool (FoldRequired mods) (BearerRequired sub) + BearerRequired (BearerAuth :> sub) = 'True + BearerRequired (sup :> sub) = BearerRequired sub + BearerRequired (a :<|> b) = OrBool (BearerRequired a) (BearerRequired b) + BearerRequired (Verb method statusCode contentTypes a) = 'False + BearerRequired (NoContentVerb method) = 'False + +type family OrBool a b where + OrBool 'False 'False = 'False + OrBool a b = 'True + +maybeWithJwt :: forall (a :: Bool). SBoolI a => Proxy a -> If a Jwt (Maybe Jwt) -> Servant.Request -> Servant.Request +maybeWithJwt _ mparam = case (sbool :: SBool a, mparam) of + (STrue, jwt) -> add jwt + (SFalse, mJwt) -> maybe id add mJwt + where add (Jwt jwt) = Request.addHeader "Authorization" . decodeUtf8 $ "Bearer " <> jwt + +instance ( HasClient m (StripBearer sub) + , RunClient m + , SBoolI (BearerRequired (CaptureBearerRestriction' mods restr :> sub)) + ) => HasClient m (CaptureBearerRestriction' mods restr :> sub) where + type Client m (CaptureBearerRestriction' mods restr :> sub) = If (BearerRequired (CaptureBearerRestriction' mods restr :> sub)) Jwt (Maybe Jwt) -> Client m (StripBearer sub) + clientWithRoute pm _ req mparam = clientWithRoute pm (Proxy @(StripBearer sub)) $ maybeWithJwt (Proxy @(BearerRequired (CaptureBearerRestriction' mods restr :> sub))) mparam req + hoistClientMonad pm _ f cl = hoistClientMonad pm (Proxy @(StripBearer sub)) f . cl + +instance ( HasClient m (StripBearer sub) + , RunClient m + , SBoolI (BearerRequired (CaptureBearerToken' mods :> sub)) + ) => HasClient m (CaptureBearerToken' mods :> sub) where + type Client m (CaptureBearerToken' mods :> sub) = If (BearerRequired (CaptureBearerToken' mods :> sub)) Jwt (Maybe Jwt) -> Client m (StripBearer sub) + clientWithRoute pm _ req mparam = clientWithRoute pm (Proxy @(StripBearer sub)) $ maybeWithJwt (Proxy @(BearerRequired (CaptureBearerToken' mods :> sub))) mparam req + hoistClientMonad pm _ f cl = hoistClientMonad pm (Proxy @(StripBearer sub)) f . cl + +instance ( HasClient m (StripBearer sub) + , RunClient m + , SBoolI (BearerRequired (BearerAuth :> sub)) + ) => HasClient m (BearerAuth :> sub) where + type Client m (BearerAuth :> sub) = If (BearerRequired (BearerAuth :> sub)) Jwt (Maybe Jwt) -> Client m (StripBearer sub) + clientWithRoute pm _ req mparam = clientWithRoute pm (Proxy @(StripBearer sub)) $ maybeWithJwt (Proxy @(BearerRequired (BearerAuth :> sub))) mparam req + hoistClientMonad pm _ f cl = hoistClientMonad pm (Proxy @(StripBearer sub)) f . cl + + +data BearerAuth +data SessionAuth + +instance HasSwagger sub => HasSwagger (BearerAuth :> sub) where + toSwagger _ = toSwagger (Proxy @sub) + & securityDefinitions <>~ SecurityDefinitions (fromList [(defnKey, defn)]) + & allOperations . security <>~ [SecurityRequirement $ fromList [(defnKey, [])]] + where defnKey :: Text + defnKey = "bearer" + defn = SecurityScheme + { _securitySchemeType + = SecuritySchemeApiKey ApiKeyParams + { _apiKeyName = "Authorization" + , _apiKeyIn = ApiKeyHeader + } + , _securitySchemeDescription = Just + "JSON Web Token-based API key" + } + +instance HasSwagger sub => HasSwagger (SessionAuth :> sub) where + toSwagger _ = toSwagger (Proxy @sub) + & allOperations . security <>~ [SecurityRequirement mempty] + -- We do not expect API clients to be able/willing to conform with + -- our CSRF mitigation, so we mark routes that require it as + -- having unfullfillable security requirements + +instance HasLink sub => HasLink (BearerAuth :> sub) where + type MkLink (BearerAuth :> sub) a = MkLink sub a + toLink toA _ = toLink toA (Proxy @sub) + +instance HasLink sub => HasLink (SessionAuth :> sub) where + type MkLink (SessionAuth :> sub) a = MkLink sub a + toLink toA _ = toLink toA (Proxy @sub) + +instance HasDocs sub => HasDocs (BearerAuth :> sub) where + docsFor _ (endpoint, action) = docsFor (Proxy @sub) (endpoint, action') + where action' = action & authInfo %~ (|> authInfo') + authInfo' = DocAuthentication + "" + "A JSON Web Token-based API key" + +instance HasDocs sub => HasDocs (SessionAuth :> sub) where + docsFor _ (endpoint, action) = docsFor (Proxy @sub) (endpoint, action') + where action' = action & authInfo %~ (|> authInfo') + authInfo' = DocAuthentication + "When a web session is used for authorization, CSRF-mitigation measures must be observed." + "An active web session identifying the user as one with sufficient authorization" diff --git a/src/Foundation/SiteLayout.hs b/src/Foundation/SiteLayout.hs index be39543fc..6a768f364 100644 --- a/src/Foundation/SiteLayout.hs +++ b/src/Foundation/SiteLayout.hs @@ -29,6 +29,7 @@ import Handler.Utils.Memcached import qualified Data.Text as Text import qualified Data.Set as Set import qualified Data.HashMap.Strict as HashMap +import qualified Data.Text.Lazy.Builder as LTB import qualified Database.Esqueleto.Legacy as E import qualified Database.Esqueleto.Utils as E @@ -114,15 +115,16 @@ data MemcachedLimitKeyFavourites deriving anyclass (Hashable, Binary) -siteLayoutMsg :: (RenderMessage site msg, site ~ UniWorX, BearerAuthSite UniWorX, YesodPersistBackend UniWorX ~ SqlBackend) => msg -> WidgetFor UniWorX () -> HandlerFor UniWorX Html +siteLayoutMsg :: (RenderMessage site msg, site ~ UniWorX, BearerAuthSite UniWorX, YesodPersistBackend UniWorX ~ SqlBackend, MonadSecretBox (HandlerFor UniWorX)) => msg -> WidgetFor UniWorX () -> HandlerFor UniWorX Html siteLayoutMsg = siteLayout . i18n {-# DEPRECATED siteLayoutMsg' "Use siteLayoutMsg" #-} -siteLayoutMsg' :: (RenderMessage site msg, site ~ UniWorX, BearerAuthSite UniWorX, YesodPersistBackend UniWorX ~ SqlBackend) => msg -> WidgetFor UniWorX () -> HandlerFor UniWorX Html +siteLayoutMsg' :: (RenderMessage site msg, site ~ UniWorX, BearerAuthSite UniWorX, YesodPersistBackend UniWorX ~ SqlBackend, MonadSecretBox (HandlerFor UniWorX)) => msg -> WidgetFor UniWorX () -> HandlerFor UniWorX Html siteLayoutMsg' = siteLayoutMsg siteLayout :: ( BearerAuthSite UniWorX , YesodPersistBackend UniWorX ~ SqlBackend + , MonadSecretBox (HandlerFor UniWorX) ) => WidgetFor UniWorX () -- ^ `pageHeading` -> WidgetFor UniWorX () -> HandlerFor UniWorX Html @@ -130,6 +132,7 @@ siteLayout = siteLayout' . Just siteLayout' :: ( BearerAuthSite UniWorX , YesodPersistBackend UniWorX ~ SqlBackend + , MonadSecretBox (HandlerFor UniWorX) ) => Maybe (WidgetFor UniWorX ()) -- ^ `pageHeading` -> WidgetFor UniWorX () -> HandlerFor UniWorX Html @@ -496,6 +499,12 @@ siteLayout' overrideHeading widget = do toWidget $(juliusFile "templates/current-route.julius") wellKnownHtmlLinks + whenM doFormHoneypots $ do + honeypotSecrets' <- liftHandler $ sortOn (view _2) . ifoldMap (\isHoneypot -> map (isHoneypot, ) . otoList) <$> honeypotSecrets + forM_ honeypotSecrets' $ \(isHoneypot, hpSecret) -> toWidget $ if + | isHoneypot -> CssBuilder . LTB.fromLazyText $ "[data-uw-field-display=\"" <> fromStrict hpSecret <> "\"]{display:none!important}" + | otherwise -> CssBuilder . LTB.fromLazyText $ "[data-uw-field-display=\"" <> fromStrict hpSecret <> "\"]{/*display:none!important*/}" + $(widgetFile "default-layout") withUrlRenderer $(hamletFile "templates/default-layout-wrapper.hamlet") diff --git a/src/Foundation/Yesod/Auth.hs b/src/Foundation/Yesod/Auth.hs index a1bd943ac..00d8227a0 100644 --- a/src/Foundation/Yesod/Auth.hs +++ b/src/Foundation/Yesod/Auth.hs @@ -256,6 +256,8 @@ upsertCampusUser upsertMode ldapData = do , userWarningDays = userDefaultWarningDays , userShowSex = userDefaultShowSex , userSex = Nothing + , userExamOfficeGetSynced = userDefaultExamOfficeGetSynced + , userExamOfficeGetLabels = userDefaultExamOfficeGetLabels , userNotificationSettings = def , userLanguages = Nothing , userCsvOptions = def diff --git a/src/Foundation/Yesod/StaticContent.hs b/src/Foundation/Yesod/StaticContent.hs index a60ace7ff..057c7b873 100644 --- a/src/Foundation/Yesod/StaticContent.hs +++ b/src/Foundation/Yesod/StaticContent.hs @@ -27,10 +27,10 @@ addStaticContent ext _mime content = do for ((,) <$> appWidgetMemcached <*> appWidgetMemcachedConf appSettings') $ \(mConn, WidgetMemcachedConf{ widgetMemcachedConf = MemcachedConf { memcachedExpiry }, widgetMemcachedBaseUrl }) -> do let expiry = maybe 0 ceiling memcachedExpiry touch = liftIO $ Memcached.touch expiry (encodeUtf8 $ pack fileName) mConn - add = liftIO $ Memcached.add zeroBits expiry (encodeUtf8 $ pack fileName) content mConn + addItem = liftIO $ Memcached.add zeroBits expiry (encodeUtf8 $ pack fileName) content mConn absoluteLink = unpack widgetMemcachedBaseUrl fileName catchIf Memcached.isKeyNotFound touch . const $ - handleIf Memcached.isKeyExists (const $ return ()) add + handleIf Memcached.isKeyExists (const $ return ()) addItem return . Left $ pack absoluteLink where -- Generate a unique filename based on the content itself, this is used diff --git a/src/Handler/ApiDocs.hs b/src/Handler/ApiDocs.hs new file mode 100644 index 000000000..6775333dc --- /dev/null +++ b/src/Handler/ApiDocs.hs @@ -0,0 +1,35 @@ +module Handler.ApiDocs + ( getApiDocsR + ) where + +import Import +import ServantApi + +import qualified Servant.Docs as Servant + +import Servant.Docs.Internal.Pretty + +import Handler.Utils.Pandoc + + +getApiDocsR :: Handler TypedContent +getApiDocsR = selectRep $ do + case htmlDocs of + Right html -> provideRep . siteLayoutMsg MsgBreadcrumbApiDocs $ do + setTitleI MsgBreadcrumbApiDocs + + [whamlet| + $newline never +

+ ^{html} + |] + Left _err -> return () + provideRepType "text/markdown" $ return mdDocs + where + mdDocs = pack . Servant.markdown $ Servant.docsWith Servant.defaultDocOptions docIntros docExtra (Proxy @(Pretty UniWorXApi)) + htmlDocs = parseMarkdownWith markdownReaderOptions htmlWriterOptions mdDocs + + docIntros = mempty + docExtra = mconcat + [ + ] diff --git a/src/Handler/Course/Communication.hs b/src/Handler/Course/Communication.hs index eac35ee83..cb9e762d2 100644 --- a/src/Handler/Course/Communication.hs +++ b/src/Handler/Course/Communication.hs @@ -7,8 +7,6 @@ import Import import Handler.Utils import Handler.Utils.Communication -import qualified Data.Map as Map - import qualified Database.Esqueleto.Legacy as E @@ -17,8 +15,8 @@ getCCommR = postCCommR postCCommR tid ssh csh = do (cid, tuts, exams, sheets) <- runDB $ do cid <- getKeyBy404 $ TermSchoolCourseShort tid ssh csh - tuts' <- selectKeysList [TutorialCourse ==. cid] [] - tuts <- forM tuts' $ \tutid -> do + tuts'' <- selectKeysList [TutorialCourse ==. cid] [] + tuts' <- forM tuts'' $ \tutid -> do cID <- encrypt tutid return ( RGTutorialParticipants cID , E.from $ \(user `E.InnerJoin` participant) -> do @@ -26,6 +24,18 @@ postCCommR tid ssh csh = do E.where_ $ participant E.^. TutorialParticipantTutorial E.==. E.val tutid return user ) + let + tuts | length tuts' < 2 = tuts' + | otherwise = ( RGCourseParticipantsInTutorial + , E.from $ \(user `E.InnerJoin` participant) -> do + E.on $ user E.^. UserId E.==. participant E.^. CourseParticipantUser + E.where_ $ participant E.^. CourseParticipantCourse E.==. E.val cid + E.&&. participant E.^. CourseParticipantState E.==. E.val CourseParticipantActive + E.&&. (E.exists . E.from $ \tutParticipant -> E.where_ $ + tutParticipant E.^. TutorialParticipantUser E.==. user E.^. UserId + ) + return user + ) : tuts' exams' <- selectKeysList [ExamCourse ==. cid] [] exams <- forM exams' $ \examid -> do @@ -55,7 +65,7 @@ postCCommR tid ssh csh = do , crUltDest = SomeRoute $ CourseR tid ssh csh CCommR , crJobs = crJobsCourseCommunication cid , crTestJobs = crTestJobsCourseCommunication cid - , crRecipients = Map.fromList $ + , crRecipients = [ ( RGCourseParticipants , E.from $ \(user `E.InnerJoin` participant) -> do E.on $ user E.^. UserId E.==. participant E.^. CourseParticipantUser @@ -69,14 +79,6 @@ postCCommR tid ssh csh = do E.where_ $ lecturer E.^. LecturerCourse E.==. E.val cid return user ) - , ( RGCourseCorrectors - , E.from $ \user -> do - E.where_ $ E.exists $ E.from $ \(sheet `E.InnerJoin` corrector) -> do - E.on $ sheet E.^. SheetId E.==. corrector E.^. SheetCorrectorSheet - E.where_ $ sheet E.^. SheetCourse E.==. E.val cid - E.&&. user E.^. UserId E.==. corrector E.^. SheetCorrectorUser - return user - ) , ( RGCourseTutors , E.from $ \user -> do E.where_ $ E.exists $ E.from $ \(tutorial `E.InnerJoin` tutor) -> do @@ -85,7 +87,16 @@ postCCommR tid ssh csh = do E.&&. user E.^. UserId E.==. tutor E.^. TutorUser return user ) - , ( RGCourseUnacceptedApplicants + , ( RGCourseCorrectors + , E.from $ \user -> do + E.where_ $ E.exists $ E.from $ \(sheet `E.InnerJoin` corrector) -> do + E.on $ sheet E.^. SheetId E.==. corrector E.^. SheetCorrectorSheet + E.where_ $ sheet E.^. SheetCourse E.==. E.val cid + E.&&. user E.^. UserId E.==. corrector E.^. SheetCorrectorUser + return user + ) + ] ++ tuts ++ exams ++ sheets ++ + [ ( RGCourseUnacceptedApplicants , E.from $ \user -> do E.where_ . E.exists . E.from $ \courseApplication -> E.where_ $ courseApplication E.^. CourseApplicationCourse E.==. E.val cid @@ -96,7 +107,7 @@ postCCommR tid ssh csh = do E.&&. courseParticipant E.^. CourseParticipantState E.==. E.val CourseParticipantActive return user ) - ] ++ tuts ++ exams ++ sheets + ] , crRecipientAuth = Just $ \uid -> do cID <- encrypt uid evalAccessDB (CourseR tid ssh csh $ CUserR cID) False diff --git a/src/Handler/Course/Edit.hs b/src/Handler/Course/Edit.hs index b39286c65..a43db9ec1 100644 --- a/src/Handler/Course/Edit.hs +++ b/src/Handler/Course/Edit.hs @@ -29,29 +29,29 @@ import qualified Data.Conduit.List as C data CourseForm = CourseForm - { cfCourseId :: Maybe CourseId - , cfName :: CourseName - , cfShort :: CourseShorthand - , cfSchool :: SchoolId - , cfTerm :: TermId - , cfDesc :: Maybe StoredMarkup - , cfLink :: Maybe URI - , cfVisFrom :: Maybe UTCTime - , cfVisTo :: Maybe UTCTime - , cfMatFree :: Bool - , cfAllocation :: Maybe AllocationCourseForm + { cfCourseId :: Maybe CourseId + , cfName :: CourseName + , cfShort :: CourseShorthand + , cfSchool :: SchoolId + , cfTerm :: TermId + , cfDesc :: Maybe StoredMarkup + , cfLink :: Maybe URI + , cfVisFrom :: Maybe UTCTime + , cfVisTo :: Maybe UTCTime + , cfMatFree :: Bool + , cfAllocation :: Maybe AllocationCourseForm , cfAppRequired :: Bool , cfAppInstructions :: Maybe StoredMarkup , cfAppInstructionFiles :: Maybe FileUploads , cfAppText :: Bool , cfAppFiles :: UploadMode , cfAppRatingsVisible :: Bool - , cfCapacity :: Maybe Int - , cfSecret :: Maybe Text - , cfRegFrom :: Maybe UTCTime - , cfRegTo :: Maybe UTCTime - , cfDeRegUntil :: Maybe UTCTime - , cfLecturers :: [Either (UserEmail, Maybe LecturerType) (UserId, LecturerType)] + , cfCapacity :: Maybe Int + , cfSecret :: Maybe Text + , cfRegFrom :: Maybe UTCTime + , cfRegTo :: Maybe UTCTime + , cfDeRegUntil :: Maybe UTCTime + , cfLecturers :: [Either (UserEmail, Maybe LecturerType) (UserId, LecturerType)] } data AllocationCourseForm = AllocationCourseForm @@ -278,30 +278,28 @@ makeCourseForm miButtonAction template = identifyForm FIDcourse . validateFormDB hoist (censorM $ traverseOf _head addTip) $ optionalActionW' (bool mforcedJust mpopt mayChange) allocationForm' (fslI MsgCourseAllocationParticipate) (is _Just . cfAllocation <$> template) - -- let autoUnzipInfo = [|Entpackt hochgeladene Zip-Dateien (*.zip) automatisch und fügt den Inhalt dem Stamm-Verzeichnis der Abgabe hinzu. TODO|] - multipleSchoolsMsg <- messageI Warning MsgCourseSchoolMultipleTip multipleTermsMsg <- messageI Warning MsgCourseSemesterMultipleTip (result, widget) <- flip (renderAForm FormStandard) html $ CourseForm (cfCourseId =<< template) - <$> areq (textField & cfStrip & cfCI) (fslI MsgCourseName) (cfName <$> template) + <$> areq (textField & cfStrip & cfCI) (fslI MsgCourseName) (cfName <$> template) <*> areq (textField & cfStrip & cfCI) (fslpI MsgCourseShorthand "ProMo, LinAlg1, AlgoDat, Ana2, EiP, …" -- & addAttr "disabled" "disabled" - & setTooltip MsgCourseShorthandUnique) (cfShort <$> template) + & setTooltip MsgCourseShorthandUnique) (cfShort <$> template) <* bool (pure ()) (aformMessage multipleSchoolsMsg) (length userSchools > 1) - <*> areq (schoolFieldFor userSchools) (fslI MsgCourseSchool) (cfSchool <$> template) + <*> areq (schoolFieldFor userSchools) (fslI MsgCourseSchool) (cfSchool <$> template) <* bool (pure ()) (aformMessage multipleTermsMsg) (length userTerms > 1) - <*> areq termsField (fslI MsgCourseSemester) (cfTerm <$> template) + <*> areq termsField (fslI MsgCourseSemester) (cfTerm <$> template) <*> aopt htmlField (fslpI MsgCourseDescription (mr MsgCourseDescriptionPlaceholder)) - (cfDesc <$> template) + (cfDesc <$> template) <*> aopt urlField (fslpI MsgCourseHomepageExternal (mr MsgCourseHomepageExternalPlaceholder)) - (cfLink <$> template) + (cfLink <$> template) <*> aopt utcTimeField (fslpI MsgCourseVisibleFrom (mr MsgCourseDate) - & setTooltip MsgCourseVisibleFromTip) (deepAlt (cfVisFrom <$> template) newVisFrom) + & setTooltip MsgCourseVisibleFromTip) (deepAlt (cfVisFrom <$> template) newVisFrom) <*> aopt utcTimeField (fslpI MsgCourseVisibleTo (mr MsgCourseDate) - & setTooltip MsgCourseVisibleToTip) (cfVisTo <$> template) - <*> apopt checkBoxField (fslI MsgCourseMaterialFree) (cfMatFree <$> template) + & setTooltip MsgCourseVisibleToTip) (cfVisTo <$> template) + <*> apopt checkBoxField (fslI MsgCourseMaterialFree) (cfMatFree <$> template) <* aformSection MsgCourseFormSectionRegistration <*> allocationForm <*> apopt checkBoxField (fslI MsgCourseApplicationRequired & setTooltip MsgCourseApplicationRequiredTip) (cfAppRequired <$> template) diff --git a/src/Handler/Course/List.hs b/src/Handler/Course/List.hs index c62fdc82a..ddc530d74 100644 --- a/src/Handler/Course/List.hs +++ b/src/Handler/Course/List.hs @@ -250,6 +250,12 @@ makeCourseTable colChoices psValidator' = do Just needle -> (E.castString (course E.^. CourseName) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%)) E.||. (E.castString (course E.^. CourseShorthand) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%)) E.||. (E.maybe (E.val mempty) (E.castString . esqueletoMarkupOutput) (course E.^. CourseDescription) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%)) + , singletonMap "search-shorthand" . FilterColumn $ \(view queryCourse -> course) criterion -> case getLast (criterion :: Last Text) of + Nothing -> E.val True :: E.SqlExpr (E.Value Bool) + Just needle -> E.castString (course E.^. CourseShorthand) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%) + , singletonMap "search-title" . FilterColumn $ \(view queryCourse -> course) criterion -> case getLast (criterion :: Last Text) of + Nothing -> E.val True :: E.SqlExpr (E.Value Bool) + Just needle -> E.castString (course E.^. CourseName) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%) , singletonMap "allocation" . FilterColumn $ \row (criteria :: Set AllocationSearch) -> if | Set.null criteria -> E.true | otherwise -> flip E.any criteria $ \case @@ -264,6 +270,8 @@ makeCourseTable colChoices psValidator' = do , pure $ prismAForm (singletonFilter "schoolshort" . maybePrism (_PathPiece . from _SchoolId)) mPrev $ aopt (hoistField lift schoolField) (fslI MsgTableCourseSchool) , pure $ prismAForm (singletonFilter "lecturer") mPrev $ aopt textField (fslI MsgCourseLecturer) , pure $ prismAForm (singletonFilter "search") mPrev $ aopt textField (fslI MsgFilterCourseSearch) + , pure $ prismAForm (singletonFilter "search-shorthand") mPrev $ aopt textField (fslI MsgFilterCourseSearchShorthand) + , pure $ prismAForm (singletonFilter "search-title") mPrev $ aopt textField (fslI MsgFilterCourseSearchTitle) , pure $ prismAForm (singletonFilter "openregistration" . maybePrism _PathPiece) mPrev $ fmap (\x -> if isJust x && not (fromJust x) then Nothing else x) . aopt checkBoxField (fslI MsgFilterCourseRegisterOpen) , guardOn (is _Just muid) $ prismAForm (singletonFilter "registered" . maybePrism _PathPiece) mPrev (aopt (boolField . Just $ SomeMessage MsgBoolIrrelevant) (fslI MsgFilterCourseRegistered)) diff --git a/src/Handler/Course/Show.hs b/src/Handler/Course/Show.hs index fab484c0b..1f25a0b29 100644 --- a/src/Handler/Course/Show.hs +++ b/src/Handler/Course/Show.hs @@ -30,7 +30,7 @@ getCShowR :: TermId -> SchoolId -> CourseShorthand -> Handler Html getCShowR tid ssh csh = do mbAid <- maybeAuthId now <- liftIO getCurrentTime - (cid,course,courseVisible,schoolName,participants,registration,lecturers,assistants,correctors,tutors,mAllocation,mApplicationTemplate,mApplication,news,events,submissionGroup,hasAllocationRegistrationOpen,mayReRegister,(mayViewSheets, mayViewAnySheet), (mayViewMaterials, mayViewAnyMaterial)) <- runDB . maybeT notFound $ do + (cid,course,courseVisible,schoolName,participants,registration,lecturers,assistants,administrators,correctors,tutors,mAllocation,mApplicationTemplate,mApplication,news,events,submissionGroup,hasAllocationRegistrationOpen,mayReRegister,(mayViewSheets, mayViewAnySheet), (mayViewMaterials, mayViewAnyMaterial)) <- runDB . maybeT notFound $ do [(E.Entity cid course, E.Value courseVisible, E.Value schoolName, E.Value participants, fmap entityVal -> registration, E.Value hasAllocationRegistrationOpen)] <- lift . E.select . E.from $ \((school `E.InnerJoin` course) `E.LeftOuterJoin` allocation `E.LeftOuterJoin` participant) -> do @@ -62,10 +62,10 @@ getCShowR tid ssh csh = do E.orderBy [ E.asc $ user E.^. UserSurname, E.asc $ user E.^. UserDisplayName ] return ( lecturer E.^. LecturerType , user E.^. UserDisplayEmail, user E.^. UserDisplayName, user E.^. UserSurname) - let partStaff :: (LecturerType, UserEmail, Text, Text) -> Either (UserEmail, Text, Text) (UserEmail, Text, Text) - partStaff (CourseLecturer ,name,surn,mail) = Right (name,surn,mail) - partStaff (_courseAssistant,name,surn,mail) = Left (name,surn,mail) - (assistants,lecturers) = partitionWith partStaff $ map $(unValueN 4) staff + let + (administrators', regularStaff) = partition ((==) CourseAdministrator . view _1) $ map (\(E.Value lecType, E.Value lecName, E.Value lecSurn, E.Value lecMail) -> (lecType,(lecName,lecSurn,lecMail))) staff + (lecturers', assistants') = partition ((==) CourseLecturer . view _1) regularStaff + (administrators, lecturers, assistants) = (view _2 <$> administrators', view _2 <$> lecturers', view _2 <$> assistants') correctors <- fmap (map $(unValueN 3)) . lift . E.select $ E.from $ \(sheet `E.InnerJoin` sheetCorrector `E.InnerJoin` user) -> E.distinctOnOrderBy [E.asc $ user E.^. UserSurname, E.asc $ user E.^. UserDisplayName, E.asc $ user E.^. UserEmail ] $ do E.on $ sheetCorrector E.^. SheetCorrectorUser E.==. user E.^. UserId E.on $ sheetCorrector E.^. SheetCorrectorSheet E.==. sheet E.^. SheetId @@ -142,7 +142,7 @@ getCShowR tid ssh csh = do return $ material E.^. MaterialName mayViewAnyMaterial <- lift . anyM materials $ \(E.Value mnm) -> hasReadAccessTo $ CMaterialR tid ssh csh mnm MShowR - return (cid,course,courseVisible,schoolName,participants,registration,lecturers,assistants,correctors,tutors,mAllocation,mApplicationTemplate,mApplication,news,events,submissionGroup,hasAllocationRegistrationOpen,mayReRegister, (mayViewSheets, mayViewAnySheet), (mayViewMaterials, mayViewAnyMaterial)) + return (cid,course,courseVisible,schoolName,participants,registration,lecturers,assistants,administrators,correctors,tutors,mAllocation,mApplicationTemplate,mApplication,news,events,submissionGroup,hasAllocationRegistrationOpen,mayReRegister, (mayViewSheets, mayViewAnySheet), (mayViewMaterials, mayViewAnyMaterial)) let mDereg' = maybe id min (allocationOverrideDeregister =<< mAllocation) <$> courseDeregisterUntil course mDereg <- traverse (formatTime SelFormatDateTime) mDereg' diff --git a/src/Handler/Course/Users.hs b/src/Handler/Course/Users.hs index 0d25a488b..37cb6ee00 100644 --- a/src/Handler/Course/Users.hs +++ b/src/Handler/Course/Users.hs @@ -176,6 +176,7 @@ data UserTableCsv = UserTableCsv , csvUserName :: UserDisplayName , csvUserSex :: Maybe Sex , csvUserMatriculation :: Maybe UserMatriculation + , csvUserEPPN :: Maybe UserEduPersonPrincipalName , csvUserEmail :: UserEmail , csvUserStudyFeatures :: UserTableStudyFeatures , csvUserSubmissionGroup :: Maybe SubmissionGroupName @@ -194,6 +195,7 @@ instance Csv.ToNamedRecord UserTableCsv where , "name" Csv..= csvUserName , "sex" Csv..= csvUserSex , "matriculation" Csv..= csvUserMatriculation + , "eduPersonPrincipalName" Csv..= csvUserEPPN , "email" Csv..= csvUserEmail , "study-features" Csv..= csvUserStudyFeatures , "submission-group" Csv..= csvUserSubmissionGroup @@ -239,7 +241,7 @@ userTableCsvHeader :: Bool -> [Entity Tutorial] -> [Entity Sheet] -> UserCsvExpo userTableCsvHeader showSex tuts sheets UserCsvExportData{..} = Csv.header $ [ "surname", "first-name", "name" ] ++ [ "sex" | showSex ] ++ - [ "matriculation", "email", "study-features"] ++ + [ "matriculation", "eduPersonPrincipalName", "email", "study-features"] ++ [ "tutorial" | hasEmptyRegGroup ] ++ map (encodeUtf8 . CI.foldedCase) regGroups ++ [ "exams", "registration" ] ++ @@ -255,6 +257,7 @@ data UserTableJson = UserTableJson , jsonUserName :: UserDisplayName , jsonUserSex :: Maybe (Maybe Sex) , jsonUserMatriculation :: Maybe UserMatriculation + , jsonUserEPPN :: Maybe UserEduPersonPrincipalName , jsonUserEmail :: UserEmail , jsonUserStudyFeatures :: UserTableStudyFeatures , jsonUserSubmissionGroup :: Maybe SubmissionGroupName @@ -291,6 +294,7 @@ instance ToJSON UserTableJson where , pure $ "name" JSON..= jsonUserName , ("sex" JSON..=) <$> jsonUserSex , ("matriculation" JSON..=) <$> jsonUserMatriculation + , ("eduPersonPrincipalName" JSON..=) <$> jsonUserEPPN , pure $ "email" JSON..= jsonUserEmail , ("study-features" JSON..=) <$> assertM' (views _Wrapped $ not . onull) jsonUserStudyFeatures , ("submission-group" JSON..=) <$> jsonUserSubmissionGroup @@ -523,6 +527,7 @@ makeCourseUserTable cid acts restrict colChoices psValidator csvColumns = do <*> view (hasUser . _userDisplayName) <*> view (hasUser . _userSex) <*> view (hasUser . _userMatrikelnummer) + <*> view (hasUser . _userLdapPrimaryKey) <*> view (hasUser . _userEmail) <*> view _userStudyFeatures <*> preview (_userSubmissionGroup . _entityVal . _submissionGroupName) @@ -550,12 +555,13 @@ makeCourseUserTable cid acts restrict colChoices psValidator csvColumns = do repUserJson = C.foldMapM $ \(E.Value uid, res) -> Map.singleton <$> encrypt uid <*> mkUserTableJson res where mkUserTableJson res' = flip runReaderT res' $ UserTableJson - <$> view (hasUser . _userSurname) - <*> view (hasUser . _userFirstName) - <*> view (hasUser . _userDisplayName) + <$> view (hasUser . _userSurname) + <*> view (hasUser . _userFirstName) + <*> view (hasUser . _userDisplayName) <*> views (hasUser . _userSex) (guardOn showSex) - <*> view (hasUser . _userMatrikelnummer) - <*> view (hasUser . _userEmail) + <*> view (hasUser . _userMatrikelnummer) + <*> view (hasUser . _userLdapPrimaryKey) + <*> view (hasUser . _userEmail) <*> view _userStudyFeatures <*> preview (_userSubmissionGroup . _entityVal . _submissionGroupName) <*> view _userTableRegistration diff --git a/src/Handler/Exam/Form.hs b/src/Handler/Exam/Form.hs index 927f98bac..d7e2e3f43 100644 --- a/src/Handler/Exam/Form.hs +++ b/src/Handler/Exam/Form.hs @@ -330,9 +330,8 @@ examPartsForm prev = wFormToAForm $ do miIdent' :: Text miIdent' = "exam-parts" -examFormTemplate :: ( MonadHandler m - , HandlerSite m ~ UniWorX - , MonadThrow m +examFormTemplate :: ( MonadHandler m, HandlerSite m ~ UniWorX + , MonadCrypto m, MonadCryptoKey m ~ CryptoIDKey ) => Entity Exam -> SqlPersistT m ExamForm examFormTemplate (Entity eId Exam{..}) = do @@ -342,8 +341,10 @@ examFormTemplate (Entity eId Exam{..}) = do invitations <- Map.keysSet <$> sourceInvitationsF @ExamCorrector eId extraSchools <- selectList [ ExamOfficeSchoolExam ==. eId ] [] - examParts' <- forM examParts $ \(Entity pid part) -> (,) <$> encrypt pid <*> pure part - occurrences' <- forM occurrences $ \(Entity oid occ) -> (,) <$> encrypt oid <*> pure occ + examParts' <- lift . forM examParts $ \(Entity pid part) -> (,) <$> encrypt pid <*> pure part + occurrences' <- lift . forM occurrences $ \(Entity oid occ) -> (,) <$> encrypt oid <*> pure occ + + mAuthorshipStatement <- maybe (pure Nothing) getEntity examAuthorshipStatement mAuthorshipStatement <- maybe (pure Nothing) getEntity examAuthorshipStatement @@ -455,6 +456,8 @@ examTemplate cid = runMaybeT $ do validateExam :: forall m. ( MonadHandler m , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) + , MonadCryptoKey m ~ CryptoIDKey ) => CourseId -> Maybe (Entity Exam) -> FormValidator ExamForm (SqlPersistT m) () validateExam cId oldExam = do @@ -495,7 +498,7 @@ validateExam cId oldExam = do , examOccurrence E.^. ExamOccurrenceName ) forM_ (join $ hoistMaybe oldOccurrencesWithRegistrations) $ \(E.Value eoId, E.Value eoName) -> - guardValidationM (MsgExamOccurrenceCannotBeDeletedDueToRegistrations eoName) . anyM (otoList efOccurrences) $ \ExamOccurrenceForm{..} -> (== Just eoId) <$> traverse decrypt eofId + guardValidationM (MsgExamOccurrenceCannotBeDeletedDueToRegistrations eoName) . lift . anyM (otoList efOccurrences) $ \ExamOccurrenceForm{..} -> (== Just eoId) <$> traverse decrypt eofId oldPartsWithResults <- for oldExam $ \(Entity eId _) -> lift . E.select . E.from $ \examPart -> do diff --git a/src/Handler/Exam/Users.hs b/src/Handler/Exam/Users.hs index 6c5fe13bd..629fd1827 100644 --- a/src/Handler/Exam/Users.hs +++ b/src/Handler/Exam/Users.hs @@ -183,6 +183,7 @@ data ExamUserTableCsv = ExamUserTableCsv , csvEUserFirstName :: Maybe Text , csvEUserName :: Maybe Text , csvEUserMatriculation :: Maybe Text + , csvEUserEPPN :: Maybe UserEduPersonPrincipalName , csvEUserStudyFeatures :: UserTableStudyFeatures , csvEUserOccurrence :: Maybe (CI Text) , csvEUserExercisePoints :: Maybe (Maybe Points) @@ -203,6 +204,7 @@ instance ToNamedRecord ExamUserTableCsv where , "first-name" Csv..= csvEUserFirstName , "name" Csv..= csvEUserName , "matriculation" Csv..= csvEUserMatriculation + , "eduPersonPrincipalName" Csv..= csvEUserEPPN , "study-features" Csv..= csvEUserStudyFeatures , "occurrence" Csv..= csvEUserOccurrence ] ++ catMaybes @@ -228,6 +230,7 @@ instance FromNamedRecord ExamUserTableCsv where <*> csv .:?? "first-name" <*> csv .:?? "name" <*> csv .:?? "matriculation" + <*> csv .:?? "eduPersonPrincipalName" <*> pure mempty <*> csv .:?? "occurrence" <*> fmap Just (csv .:?? "exercise-points") @@ -270,7 +273,7 @@ examUserTableCsvHeader :: ( MonoFoldable mono => SheetGradeSummary -> Bool -> mono -> Csv.Header examUserTableCsvHeader allBoni doBonus pNames = Csv.header $ [ "surname", "first-name", "name" - , "matriculation" + , "matriculation", "eduPersonPrincipalName" , "study-features" , "course-note" , "occurrence" @@ -608,6 +611,7 @@ postEUsersR tid ssh csh examn = do <*> view (resultUser . _entityVal . _userFirstName . to Just) <*> view (resultUser . _entityVal . _userDisplayName . to Just) <*> view (resultUser . _entityVal . _userMatrikelnummer) + <*> view (resultUser . _entityVal . _userLdapPrimaryKey) <*> view resultStudyFeatures <*> preview (resultExamOccurrence . _entityVal . _examOccurrenceName) <*> fmap (bool (const Nothing) Just showPoints) (preview $ resultUser . _entityKey . to (examBonusAchieved ?? bonus) . _achievedPoints . _Wrapped) @@ -933,6 +937,7 @@ postEUsersR tid ssh csh examn = do guessUser' ExamUserTableCsv{..} = do let criteria = PredDNF . maybe Set.empty Set.singleton . fromNullable . Set.fromList . fmap PLVariable $ catMaybes [ GuessUserMatrikelnummer <$> csvEUserMatriculation + , GuessUserEduPersonPrincipalName <$> csvEUserEPPN , GuessUserDisplayName <$> csvEUserName , GuessUserSurname <$> csvEUserSurname , GuessUserFirstName <$> csvEUserFirstName diff --git a/src/Handler/ExamOffice/Exam.hs b/src/Handler/ExamOffice/Exam.hs index cc631665f..69a32fd3f 100644 --- a/src/Handler/ExamOffice/Exam.hs +++ b/src/Handler/ExamOffice/Exam.hs @@ -216,24 +216,33 @@ embedRenderMessage ''UniWorX ''ExamUserAction id data ExamUserActionData = ExamUserMarkSynchronisedData -newtype ExamUserCsvExportData = ExamUserCsvExportData +data ExamUserCsvExportData = ExamUserCsvExportData { csvEUserMarkSynchronised :: Bool - } deriving (Eq, Ord, Read, Show, Generic, Typeable) + , csvEUserSetLabel :: Bool + } + deriving (Eq, Ord, Read, Show, Generic, Typeable) -- | View a list of all users' grades that the current user has access to getEGradesR, postEGradesR :: TermId -> SchoolId -> CourseShorthand -> ExamName -> Handler Html getEGradesR = postEGradesR postEGradesR tid ssh csh examn = do - uid <- requireAuthId + Entity uid User{userCsvOptions=csvOpts} <- requireAuth now <- liftIO getCurrentTime ((usersResult, examUsersTable), Entity eId Exam{examFinished}) <- runDB $ do exam@(Entity eid Exam{..}) <- fetchExam tid ssh csh examn Course{..} <- getJust examCourse isLecturer <- hasReadAccessTo $ CExamR tid ssh csh examn EUsersR + isExamOffice <- hasReadAccessTo $ ExamOfficeR EOExamsR userFunctions <- selectList [ UserFunctionUser ==. uid, UserFunctionFunction ==. SchoolExamOffice ] [] + userCsvExportLabel' <- E.select . E.from $ \examOfficeLabel -> do + E.where_ $ maybe E.false (\expLbl -> examOfficeLabel E.^. ExamOfficeLabelName E.==. E.val expLbl) (csvExportLabel csvOpts) + E.&&. examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid + return examOfficeLabel + let userCsvExportLabel = listToMaybe userCsvExportLabel' + let participantLink :: (MonadHandler m, HandlerSite m ~ UniWorX) => UserId -> m (SomeRoute UniWorX) participantLink partId = liftHandler $ do @@ -284,9 +293,15 @@ postEGradesR tid ssh csh examn = do isSynced <- view . queryIsSynced $ E.val uid lift $ do - E.on $ courseParticipant E.?. CourseParticipantCourse E.==. E.just (E.val examCourse) - E.&&. courseParticipant E.?. CourseParticipantUser E.==. E.just (user E.^. UserId) - E.&&. courseParticipant E.?. CourseParticipantState E.==. E.just (E.val CourseParticipantActive) + E.on $ E.maybe E.true (\cCourse -> + cCourse E.==. E.val examCourse + ) (courseParticipant E.?. CourseParticipantCourse) + E.&&. E.maybe E.true (\cUser -> + cUser E.==. user E.^. UserId + ) (courseParticipant E.?. CourseParticipantUser) + E.&&. E.maybe E.true (\cState -> + cState E.==. E.val CourseParticipantActive + ) (courseParticipant E.?. CourseParticipantState) E.on $ occurrence E.?. ExamOccurrenceExam E.==. E.just (E.val eid) E.&&. occurrence E.?. ExamOccurrenceId E.==. E.joinV (examRegistration E.?. ExamRegistrationOccurrence) E.on $ examRegistration E.?. ExamRegistrationUser E.==. E.just (user E.^. UserId) @@ -332,7 +347,7 @@ postEGradesR tid ssh csh examn = do colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised lastChange <- view $ resultExamResult . _entityVal . _examResultLastChanged - user <- view $ resultUser . _entityVal + User{..} <- view $ resultUser . _entityVal isSynced <- view resultIsSynced let hasSyncs = has folded syncs @@ -431,8 +446,17 @@ postEGradesR tid ssh csh examn = do dbtCsvEncode = Just DBTCsvEncode { dbtCsvExportForm = ExamUserCsvExportData <$> apopt checkBoxField (fslI MsgExamOfficeExamUserMarkSynchronisedCsv & setTooltip MsgExamOfficeExamUserMarkSynchronisedCsvTip) (Just False) + <*> bool + ( pure False ) + ( maybe + (aforced checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip MsgExamOfficeLabelSetLabelOnExportForcedTip) False) + (\expLbl -> apopt checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip (MsgExamOfficeLabelSetLabelOnExportTip expLbl)) (Just True)) + (examOfficeLabelName . entityVal <$> userCsvExportLabel) + ) + isExamOffice , dbtCsvDoEncode = \ExamUserCsvExportData{..} -> C.mapM $ \(E.Value k, row) -> do when csvEUserMarkSynchronised $ markSynced k + when csvEUserSetLabel $ maybe (return ()) (\lbl -> void $ upsert (ExamOfficeExamLabel eid lbl) [ExamOfficeExamLabelLabel =. lbl]) (entityKey <$> userCsvExportLabel) return $ ExamUserTableCsv (row ^. resultUser . _entityVal . _userSurname) (row ^. resultUser . _entityVal . _userFirstName) diff --git a/src/Handler/ExamOffice/Exams.hs b/src/Handler/ExamOffice/Exams.hs index f98eac37f..c6ec5ee37 100644 --- a/src/Handler/ExamOffice/Exams.hs +++ b/src/Handler/ExamOffice/Exams.hs @@ -1,7 +1,7 @@ {-# OPTIONS_GHC -fno-warn-redundant-constraints #-} module Handler.ExamOffice.Exams - ( getEOExamsR + ( getEOExamsR, postEOExamsR ) where import Import @@ -16,46 +16,94 @@ import qualified Database.Esqueleto.Utils as E import qualified Colonnade import qualified Data.Conduit.Combinators as C +import qualified Data.Map as Map +import qualified Data.Set as Set + + +data ExamAction = ExamSetLabel | ExamRemoveLabel + deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable) + deriving anyclass (Universe, Finite) + +nullaryPathPiece ''ExamAction $ camelToPathPiece' 1 +embedRenderMessage ''UniWorX ''ExamAction id + +data ExamActionData = ExamSetLabelData + { easlNewLabel :: ExamOfficeLabelId + } + | ExamRemoveLabelData + deriving (Eq, Ord, Read, Show, Generic, Typeable) data ExamsTableFilterProj = ExamsTableFilterProj - { etProjFilterMayAccess :: Maybe Bool + { etProjFilterMayAccess :: Maybe Bool , etProjFilterHasResults :: Maybe Bool - , etProjFilterIsSynced :: Maybe Bool + , etProjFilterLabel :: Maybe (Either ExamOfficeExternalExamLabelId ExamOfficeExamLabelId) + , etProjFilterIsSynced :: Maybe Bool } instance Default ExamsTableFilterProj where def = ExamsTableFilterProj - { etProjFilterMayAccess = Nothing + { etProjFilterMayAccess = Nothing , etProjFilterHasResults = Nothing - , etProjFilterIsSynced = Nothing + , etProjFilterLabel = Nothing + , etProjFilterIsSynced = Nothing } makeLenses_ ''ExamsTableFilterProj -type ExamsTableExpr = ( E.SqlExpr (Maybe (Entity Exam)) - `E.InnerJoin` E.SqlExpr (Maybe (Entity Course)) - `E.InnerJoin` E.SqlExpr (Maybe (Entity School)) +type ExamsTableExpr = ( ( E.SqlExpr (Maybe (Entity Exam )) + `E.InnerJoin` E.SqlExpr (Maybe (Entity Course)) + `E.InnerJoin` E.SqlExpr (Maybe (Entity School)) + ) + `E.LeftOuterJoin` + ( E.SqlExpr (Maybe (Entity ExamOfficeExamLabel)) + `E.InnerJoin` E.SqlExpr (Maybe (Entity ExamOfficeLabel)) + ) + ) + `E.FullOuterJoin` ( E.SqlExpr (Maybe (Entity ExternalExam)) + `E.LeftOuterJoin` + ( E.SqlExpr (Maybe (Entity ExamOfficeExternalExamLabel)) + `E.InnerJoin` E.SqlExpr (Maybe (Entity ExamOfficeLabel)) + ) ) - `E.FullOuterJoin` E.SqlExpr (Maybe (Entity ExternalExam)) -type ExamsTableData = DBRow ( Either (Entity ExternalExam) (Entity Exam, Entity Course, Entity School) - , Natural, Natural +type ExamsTableData = DBRow ( Either + ( Entity ExternalExam + , Maybe (Entity ExamOfficeLabel) + ) + ( Entity Exam + , Entity Course + , Entity School + , Maybe (Entity ExamOfficeLabel) + ) + , Maybe Natural + , Maybe Natural ) queryExam :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity Exam))) -queryExam = to $ $(E.sqlIJproj 3 1) . $(E.sqlFOJproj 2 1) +queryExam = to $ $(E.sqlIJproj 3 1) . $(E.sqlLOJproj 2 1) . $(E.sqlFOJproj 2 1) queryCourse :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity Course))) -queryCourse = to $ $(E.sqlIJproj 3 2) . $(E.sqlFOJproj 2 1) +queryCourse = to $ $(E.sqlIJproj 3 2) . $(E.sqlLOJproj 2 1) . $(E.sqlFOJproj 2 1) querySchool :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity School))) -querySchool = to $ $(E.sqlIJproj 3 3) . $(E.sqlFOJproj 2 1) +querySchool = to $ $(E.sqlIJproj 3 3) . $(E.sqlLOJproj 2 1) . $(E.sqlFOJproj 2 1) + +queryExamLabel :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity ExamOfficeExamLabel))) +queryExamLabel = to $ $(E.sqlIJproj 2 1) . $(E.sqlLOJproj 2 2) . $(E.sqlFOJproj 2 1) + +queryLabelExam :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity ExamOfficeLabel))) +queryLabelExam = to $ $(E.sqlIJproj 2 2) . $(E.sqlLOJproj 2 2) . $(E.sqlFOJproj 2 1) queryExternalExam :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity ExternalExam))) -queryExternalExam = to $(E.sqlFOJproj 2 2) +queryExternalExam = to $ $(E.sqlLOJproj 2 1) . $(E.sqlFOJproj 2 2) +queryExternalExamLabel :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity ExamOfficeExternalExamLabel))) +queryExternalExamLabel = to $ $(E.sqlIJproj 2 1) . $(E.sqlLOJproj 2 2) . $(E.sqlFOJproj 2 2) + +queryLabelExternalExam :: Getter ExamsTableExpr (E.SqlExpr (Maybe (Entity ExamOfficeLabel))) +queryLabelExternalExam = to $ $(E.sqlIJproj 2 2) . $(E.sqlLOJproj 2 2) . $(E.sqlFOJproj 2 2) resultExam :: Traversal' ExamsTableData (Entity Exam) resultExam = _dbrOutput . _1 . _Right . _1 @@ -67,9 +115,12 @@ resultSchool :: Traversal' ExamsTableData (Entity School) resultSchool = _dbrOutput . _1 . _Right . _3 resultExternalExam :: Traversal' ExamsTableData (Entity ExternalExam) -resultExternalExam = _dbrOutput . _1 . _Left +resultExternalExam = _dbrOutput . _1 . _Left . _1 -resultSynchronised, resultResults :: Lens' ExamsTableData Natural +resultLabel :: Traversal' ExamsTableData (Maybe (Entity ExamOfficeLabel)) +resultLabel = _dbrOutput . _1 . choosing _2 _4 + +resultSynchronised, resultResults :: Lens' ExamsTableData (Maybe Natural) resultSynchronised = _dbrOutput . _2 resultResults = _dbrOutput . _3 @@ -77,14 +128,45 @@ resultIsSynced :: Getter ExamsTableData Bool resultIsSynced = to $ (>=) <$> view resultSynchronised <*> view resultResults --- | List of all exams where the current user may (in her function as --- exam-office) access users grades -getEOExamsR :: Handler Html -getEOExamsR = do - uid <- requireAuthId +-- | List of all exams where the current user may (in their function as exam-office) access users grades +getEOExamsR, postEOExamsR :: Handler Html +getEOExamsR = postEOExamsR +postEOExamsR = do + (uid, User{..}) <- requireAuthPair now <- liftIO getCurrentTime + mr <- getMessageRender + + getSynced <- lookupGetParam "synced" <&> + (\case + Just "yes" -> True + Just "no" -> False + _ -> userExamOfficeGetSynced + ) + + getLabels <- lookupGetParam "labels" <&> + (\case + Just "yes" -> True + Just "no" -> False + _ -> userExamOfficeGetLabels + ) + + (examsRes, examsTable) <- runDB $ do + let labelFilterNoLabelOption = Option + { optionDisplay = mr MsgExamOfficeExamsNoLabel + , optionInternalValue = Nothing + , optionExternalValue = "no-label" + } + labelFilterOptions <- mkOptionList . (labelFilterNoLabelOption :) <$> do + labels <- E.select . E.from $ \examOfficeLabel -> do + E.where_ $ examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid + E.orderBy [ E.asc $ examOfficeLabel E.^. ExamOfficeLabelName ] + return examOfficeLabel + return . flip map labels $ \(Entity lblId ExamOfficeLabel{..}) + -> Option { optionDisplay = examOfficeLabelName + , optionInternalValue = Just lblId + , optionExternalValue = examOfficeLabelName + } - examsTable <- runDB $ do let examLink :: Course -> Exam -> SomeRoute UniWorX examLink Course{..} Exam{..} @@ -98,43 +180,63 @@ getEOExamsR = do externalExamLink ExternalExam{..} = SomeRoute $ EExamR externalExamTerm externalExamSchool externalExamCourseName externalExamExamName EEGradesR + examActions :: Map ExamAction (AForm Handler ExamActionData) + examActions = Map.fromList $ + bool mempty + [ ( ExamSetLabel, ExamSetLabelData + <$> apopt (selectField' Nothing . fmap (fmap entityKey) $ optionsPersist [ExamOfficeLabelUser ==. uid] [Asc ExamOfficeLabelName] examOfficeLabelName) (fslI MsgExamLabel) Nothing + ) + , ( ExamRemoveLabel, pure ExamRemoveLabelData ) + ] getLabels + examsDBTable = DBTable{..} where dbtSQLQuery = runReaderT $ do - exam <- view queryExam - course <- view queryCourse - school <- view querySchool - externalExam <- view queryExternalExam + exam <- view queryExam + course <- view queryCourse + school <- view querySchool + mExamLabel <- view queryExamLabel + mLabelExam <- view queryLabelExam + externalExam <- view queryExternalExam + mExternalExamLabel <- view queryExternalExamLabel + mLabelExternalExam <- view queryLabelExternalExam lift $ do + E.on $ mExternalExamLabel E.?. ExamOfficeExternalExamLabelLabel E.==. mLabelExternalExam E.?. ExamOfficeLabelId + E.on $ E.maybe E.true (\externalExamLabelExternalExamId -> + externalExam E.?. ExternalExamId E.==. E.just externalExamLabelExternalExamId + ) (mExternalExamLabel E.?. ExamOfficeExternalExamLabelExternalExam) E.on E.false - E.on $ school E.?. SchoolId E.==. course E.?. CourseSchool - E.on $ exam E.?. ExamCourse E.==. course E.?. CourseId + E.on $ mExamLabel E.?. ExamOfficeExamLabelLabel E.==. mLabelExam E.?. ExamOfficeLabelId + E.on $ E.maybe E.true (\examLabelExamId -> + exam E.?. ExamId E.==. E.just examLabelExamId + ) (mExamLabel E.?. ExamOfficeExamLabelExam) + E.on $ course E.?. CourseSchool E.==. school E.?. SchoolId + E.on $ exam E.?. ExamCourse E.==. course E.?. CourseId E.where_ $ (E.not_ (E.isNothing $ exam E.?. ExamId) E.&&. E.not_ (E.isNothing $ course E.?. CourseId) E.&&. E.isNothing (externalExam E.?. ExternalExamId)) E.||. ( E.isNothing (exam E.?. ExamId) E.&&. E.isNothing (course E.?. CourseId) E.&&. E.not_ (E.isNothing $ externalExam E.?. ExternalExamId)) + E.where_ $ E.val (not getLabels) E.||. ( + E.val getLabels + E.&&. E.maybe E.true (\labelExamUser -> + labelExamUser E.==. E.val uid + ) (mLabelExam E.?. ExamOfficeLabelUser) + E.&&. E.maybe E.true (\labelExternalExamUser -> + labelExternalExamUser E.==. E.val uid + ) (mLabelExternalExam E.?. ExamOfficeLabelUser) + ) - return (exam, course, school, externalExam) + return (exam, course, school, mLabelExam, externalExam, mLabelExternalExam) dbtRowKey = views ($(multifocusG 2) queryExam queryExternalExam) (bimap (E.?. ExamId) (E.?. ExternalExamId)) - -- [ singletonMap "may-access" . FilterProjected $ \(Any b) r -> (== b) <$> if - -- | Just exam <- r ^? resultExam . _entityVal - -- , Just course <- r ^? resultCourse . _entityVal - -- -> hasReadAccessTo . urlRoute $ examLink course exam - -- | Just eexam <- r ^? resultExternalExam . _entityVal - -- -> hasReadAccessTo . urlRoute $ externalExamLink eexam :: DB Bool - -- | otherwise - -- -> return $ error "Got neither exam nor externalExam in result" - -- , singletonMap "has-results" . FilterProjected $ \(Any b) r -> (return $ b == (r ^. resultResults > 0) :: DB Bool) - -- , singletonMap "is-synced" . FilterProjected $ \(Any b) r -> (return $ b == (r ^. resultSynchronised >= r ^. resultResults) :: DB Bool) - -- ] - dbtProj :: _ ExamsTableData - dbtProj = (views _dbtProjRow . set _dbrOutput) =<< do -- dbtProjSimple . runReaderT $ do - exam <- view $ _dbtProjRow . _dbrOutput . _1 - course <- view $ _dbtProjRow . _dbrOutput . _2 - school <- view $ _dbtProjRow . _dbrOutput . _3 - externalExam <- view $ _dbtProjRow . _dbrOutput . _4 + dbtProj = (views _dbtProjRow . set _dbrOutput) =<< do + exam <- view $ _dbtProjRow . _dbrOutput . _1 + course <- view $ _dbtProjRow . _dbrOutput . _2 + school <- view $ _dbtProjRow . _dbrOutput . _3 + mExamLabel <- view $ _dbtProjRow . _dbrOutput . _4 + externalExam <- view $ _dbtProjRow . _dbrOutput . _5 + mExternalExamLabel <- view $ _dbtProjRow . _dbrOutput . _6 forMM_ (view $ _dbtProjFilter . _etProjFilterMayAccess) $ \b -> if | Just (Entity _ exam') <- exam @@ -156,24 +258,41 @@ getEOExamsR = do return $ ExternalExam.resultIsSynced (E.val uid) externalExamResult getResults = getExamResults >> getExternalExamResults foldResult (E.Value isSynced) = (Sum 1, guardMonoid isSynced $ Sum 1) - (Sum resultCount, Sum syncedCount) <- lift . lift . runConduit $ getResults .| C.foldMap foldResult + + mCounts <- if getSynced + then do + (Sum resCount, Sum synCount) <- lift . lift . runConduit $ getResults .| C.foldMap foldResult + forMM_ (view $ _dbtProjFilter . _etProjFilterHasResults) $ \b -> + guard $ b == (resCount > 0) + forMM_ (view $ _dbtProjFilter . _etProjFilterIsSynced) $ \b -> + guard $ b == (synCount >= resCount) + return $ Just (resCount, synCount) + else do + forMM_ (view $ _dbtProjFilter . _etProjFilterHasResults) guard + return Nothing - forMM_ (view $ _dbtProjFilter . _etProjFilterHasResults) $ \b -> - guard $ b == (resultCount > 0) - forMM_ (view $ _dbtProjFilter . _etProjFilterIsSynced) $ \b -> - guard $ b == (syncedCount >= resultCount) - - case (exam, course, school, externalExam) of - (Just exam', Just course', Just school', Nothing) -> return - (Right (exam', course', school'), syncedCount, resultCount) - (Nothing, Nothing, Nothing, Just externalExam') -> return - (Left externalExam', syncedCount, resultCount) + case (exam, course, school, mExamLabel, externalExam, mExternalExamLabel) of + (Just exam', Just course', Just school', mExamLabel', Nothing, Nothing) -> return + (Right (exam', course', school', mExamLabel'), snd <$> mCounts, fst <$> mCounts) + (Nothing, Nothing, Nothing, Nothing, Just externalExam', mExternalExamLabel') -> return + (Left (externalExam', mExternalExamLabel'), snd <$> mCounts, fst <$> mCounts) _other -> return $ error "Got exam & externalExam in same result" + colLabel = Colonnade.singleton (fromSortable . Sortable (Just "label") $ i18nCell MsgTableExamLabel) $ \x -> flip runReader x $ do + mLabel <- preview resultLabel + + -- TODO: use select frontend util + if + | Just (Just (Entity _ ExamOfficeLabel{..})) <- mLabel + -> return $ cell $(widgetFile "widgets/exam-office-label") + | otherwise -> return $ cell mempty + colSynced = Colonnade.singleton (fromSortable . Sortable (Just "synced") $ i18nCell MsgExamSynchronised) $ \x -> flip runReader x $ do - mExam <- preview resultExam - mSchool <- preview resultSchool + mExam <- preview resultExam + mSchool <- preview resultSchool + mSynced <- view resultSynchronised + mResults <- view resultResults if | Just (Entity _ Exam{examClosed, examFinished}) <- mExam @@ -182,12 +301,10 @@ getEOExamsR = do (NTop examClosed > NTop (Just now)) $ is _ExamCloseSeparate schoolExamCloseMode -> return . cell $ toWidget iconNew - | otherwise + | Just synced <- mSynced + , Just results <- mResults -> do - synced <- view resultSynchronised - results <- view resultResults isSynced <- view resultIsSynced - return $ cell [whamlet| $newline never @@ -199,11 +316,14 @@ getEOExamsR = do & cellAttrs <>~ [ ("class", "heated") , ("style", [st|--hotness: #{tshow (heat results synced)}|]) ] + | otherwise -> return $ cell mempty dbtColonnade :: Colonnade Sortable _ _ dbtColonnade = mconcat - [ colSynced + [ bool mempty (dbSelect (applying _2) id $ \DBRow{ dbrOutput=(ex,_,_) } -> return $ bimap (\(Entity eeId _,_) -> eeId) (\(Entity eId _,_,_,_) -> eId) ex) (not $ Map.null examActions) + , bool mempty colLabel getLabels + , bool mempty colSynced getSynced , maybeAnchorColonnade ( runMaybeT $ mpreview ($(multifocusG 2) (pre $ resultCourse . _entityVal) (pre $ resultExam . _entityVal) . to (uncurry $ liftA2 examLink) . _Just) <|> mpreviews (resultExternalExam . _entityVal) externalExamLink ) @@ -216,12 +336,20 @@ getEOExamsR = do , emptyOpticColonnade (resultCourse . _entityVal . _courseSchool <> resultExternalExam . _entityVal . _externalExamSchool) colSchool , emptyOpticColonnade (resultCourse . _entityVal . _courseTerm <> resultExternalExam . _entityVal . _externalExamTerm) colTermShort ] - dbtSorting = mconcat + dbtSorting = mconcat $ + bool mempty + [ singletonMap "label-prio" $ + SortProjected . comparing $ (fmap . fmap $ examOfficeLabelPriority . entityVal) <$> preview resultLabel + , singletonMap "label-status" $ + SortProjected . comparing $ (fmap . fmap $ examOfficeLabelStatus . entityVal) <$> preview resultLabel + ] getLabels <> + bool mempty [ singletonMap "synced" $ - SortProjected . comparing $ ((/) `on` toRational) <$> view resultSynchronised <*> view resultResults + SortProjected . comparing $ ((/) `on` toRational . fromMaybe 0) <$> view resultSynchronised <*> view resultResults , singletonMap "is-synced" $ SortProjected . comparing $ (>=) <$> view resultSynchronised <*> view resultResults - , sortExamName (to $ E.unsafeCoalesce . sequence [views queryExam (E.?. ExamName), views queryExternalExam (E.?. ExternalExamExamName)]) + ] getSynced <> + [ sortExamName (to $ E.unsafeCoalesce . sequence [views queryExam (E.?. ExamName), views queryExternalExam (E.?. ExternalExamExamName)]) , sortExamTime (queryExam . $(multifocusG 2) (to $ E.joinV . (E.?. ExamStart)) (to $ E.joinV . (E.?. ExamEnd))) , sortExamFinished (queryExam . to (E.joinV . (E.?. ExamFinished))) , sortExamClosed (queryExam . to (E.joinV . (E.?. ExamClosed))) @@ -231,31 +359,67 @@ getEOExamsR = do ] dbtFilter = mconcat - [ singletonMap "may-access" . FilterProjected $ (_etProjFilterMayAccess ?~) . getAny + [ singletonMap "may-access" . FilterProjected $ (_etProjFilterMayAccess ?~) . getAny , singletonMap "has-results" . FilterProjected $ (_etProjFilterHasResults ?~) . getAny - , singletonMap "is-synced" . FilterProjected $ (_etProjFilterIsSynced ?~) . getAny - ] - dbtFilterUI = mconcat - [ flip (prismAForm $ singletonFilter "is-synced" . maybePrism _PathPiece) $ aopt (boolField . Just $ SomeMessage MsgBoolIrrelevant) (fslI MsgExamSynchronised) + , singletonMap "is-synced" . FilterProjected $ (_etProjFilterIsSynced ?~) . getAny + , singletonMap "label" . FilterColumn . E.mkExactFilter $ views queryLabelExam (E.?. ExamOfficeLabelId) ] + dbtFilterUI mPrev = mconcat $ + [ prismAForm (singletonFilter "label" . maybePrism _PathPiece) mPrev $ aopt (selectField' (Just $ SomeMessage MsgTableNoFilter) $ return labelFilterOptions) (fslI MsgExamLabel) + | getLabels ] <> + [ prismAForm (singletonFilter "is-synced" . maybePrism _PathPiece) mPrev $ aopt (boolField . Just $ SomeMessage MsgBoolIrrelevant) (fslI MsgExamSynchronised) + | getSynced ] dbtStyle = def { dbsFilterLayout = defaultDBSFilterLayout } - dbtParams = def + + dbtParams = DBParamsForm + { dbParamsFormMethod = POST + , dbParamsFormAction = Just . SomeRoute $ ExamOfficeR EOExamsR + , dbParamsFormAttrs = [] + , dbParamsFormSubmit = FormSubmit + , dbParamsFormAdditional + = renderAForm FormStandard + $ (, mempty) . First . Just + <$> multiActionA examActions (fslI MsgTableAction) Nothing + , dbParamsFormEvaluate = liftHandler . runFormPost + , dbParamsFormResult = id + , dbParamsFormIdent = def + } dbtIdent :: Text dbtIdent = "exams" dbtCsvEncode = noCsvEncode dbtCsvDecode = Nothing - + dbtExtraReps = [] examsDBTableValidator = def - & defaultSorting [SortAscBy "is-synced", SortAscBy "exam-time"] + & defaultSorting (bool mempty [SortDescBy "label-prio", SortAscBy "label-status"] getLabels <> bool mempty [SortAscBy "is-synced"] getSynced <> [SortAscBy "exam-time"]) & forceFilter "may-access" (Any True) & forceFilter "has-results" (Any True) - dbTableWidget' examsDBTableValidator examsDBTable + postprocess :: FormResult (First ExamActionData , DBFormResult (Either ExternalExamId ExamId) Bool (DBRow (Either (Entity ExternalExam, Maybe (Entity ExamOfficeLabel)) (Entity Exam, Entity Course, Entity School, Maybe (Entity ExamOfficeLabel)), Maybe Natural, Maybe Natural))) + -> FormResult ( ExamActionData , Set (Either ExternalExamId ExamId)) + postprocess (FormFailure errs) = FormFailure errs + postprocess FormMissing = FormMissing + postprocess (FormSuccess (First mExamActionData, examRes)) + | Just act <- mExamActionData = FormSuccess . (act,) . Map.keysSet . Map.filter id $ getDBFormResult (const False) examRes + | otherwise = FormMissing + + over _1 postprocess <$> dbTable examsDBTableValidator examsDBTable + + formResult examsRes $ \(examAction, exams) -> case examAction of + ExamSetLabelData{..} -> do + runDB . forM_ (Set.toList exams) $ either (\eeid -> void $ upsert (ExamOfficeExternalExamLabel eeid easlNewLabel) [ExamOfficeExternalExamLabelLabel =. easlNewLabel]) (\eid -> void $ upsert (ExamOfficeExamLabel eid easlNewLabel) [ExamOfficeExamLabelLabel =. easlNewLabel]) + addMessageI Success $ MsgExamLabelsSet (Set.size exams) + redirect $ ExamOfficeR EOExamsR + ExamRemoveLabelData -> do + runDB . forM_ (Set.toList exams) $ either + (\eeId -> E.delete . E.from $ \extExLabel -> E.where_ (extExLabel E.^. ExamOfficeExternalExamLabelExternalExam E.==. E.val eeId)) + (\eId -> E.delete . E.from $ \exLabel -> E.where_ (exLabel E.^. ExamOfficeExamLabelExam E.==. E.val eId)) + addMessageI Success $ MsgExamLabelsRemoved (Set.size exams) + redirect $ ExamOfficeR EOExamsR siteLayoutMsg MsgHeadingExamList $ do setTitleI MsgHeadingExamList diff --git a/src/Handler/Help.hs b/src/Handler/Help.hs index 2a5e4de81..e0c4d6ea7 100644 --- a/src/Handler/Help.hs +++ b/src/Handler/Help.hs @@ -35,7 +35,7 @@ helpForm mReferer mUid = renderWForm FormStandard $ do let defaultActions = [ ( HIEmail - , Left . Just <$> (Address <$> aopt textField (fslpI MsgHelpName $ mr MsgHelpName) Nothing <*> apreq emailField (fslpI MsgHelpEmail $ mr MsgEMail) Nothing) + , Left . Just <$> (Address <$> aopt textField (fslpI MsgHelpName (mr MsgHelpName) & addAttr "autocomplete" "name") Nothing <*> apreq emailField (fslpI MsgHelpEmail (mr MsgEMail) & addAttr "autocomplete" "email") Nothing) ) , ( HIAnonymous , pure $ Left Nothing diff --git a/src/Handler/Info.hs b/src/Handler/Info.hs index eac3e22dc..170a156f7 100644 --- a/src/Handler/Info.hs +++ b/src/Handler/Info.hs @@ -42,11 +42,13 @@ getLegalR = -- | Allgemeine Informationen getInfoR :: Handler Html getInfoR = do + AppSettings{..} <- getsYesod appSettings' changelogEntries' <- runDB $ selectList [ ChangelogItemFirstSeenItem <-. universeF ] [] let changelogEntries = Map.fromListWith Set.union [ (Down changelogItemFirstSeenFirstSeen, Set.singleton changelogItemFirstSeenItem) | Entity _ ChangelogItemFirstSeen{..} <- changelogEntries' ] + changelogItems = $(i18nWidgetFiles "changelog") siteLayoutMsg MsgInfoHeading $ do setTitleI MsgInfoHeading @@ -58,9 +60,6 @@ getInfoR = do gitInfo = $gitDescribe <> " (" <> $gitCommitDate <> ")" $(widgetFile "versionHistory") - where - changelogItems = $(i18nWidgetFiles "changelog") - getGlossaryR :: Handler Html getGlossaryR = diff --git a/src/Handler/Metrics.hs b/src/Handler/Metrics.hs index d5af2a26d..fc4a2bdc5 100644 --- a/src/Handler/Metrics.hs +++ b/src/Handler/Metrics.hs @@ -2,7 +2,7 @@ module Handler.Metrics ( getMetricsR ) where -import Import hiding (Info) +import Import hiding (Info, samples, singleSample) import Prometheus import qualified Network.Wai.Middleware.Prometheus as Prometheus diff --git a/src/Handler/News.hs b/src/Handler/News.hs index c696006f9..30afe042f 100644 --- a/src/Handler/News.hs +++ b/src/Handler/News.hs @@ -73,15 +73,17 @@ newsSystemMessages = do return $ guardOn (not hidden || showHidden) (smId, sm, trans, hidden) - (messages', Any anyHidden) <- liftHandler . runDB . runConduit . C.runWriterLC $ - transPipe lift (selectKeys [] []) - .| C.filterM (lift . hasReadAccessTo . MessageR <=< encrypt) - .| transPipe lift (C.mapMaybeM $ \smId -> fmap (\args@(sm, _) -> (smId, sm, systemMessageToTranslation smId args)) <$> getSystemMessage smId) - .| C.filter (\(_, SystemMessage{..}, _) -> NTop systemMessageFrom <= NTop (Just now) && NTop (Just now) < NTop systemMessageTo) - .| C.mapMaybeM checkHidden - .| C.iterM (\(smId, _, _, _) -> tellShown smId) - .| C.mapM (\(smId, sm@SystemMessage{..}, trans, hidden) -> (sm, trans, hidden,,) <$> formatTime SelFormatDateTime (maybe id max systemMessageFrom systemMessageLastChanged) <*> mkHideForm smId sm) - .| C.consume + (messages', Any anyHidden) <- liftHandler . runDB $ do + volatileClusterConfig <- selectList [] [] + runConduit . C.runWriterLC $ + transPipe lift (selectKeys [] []) + .| C.filterM (lift . hasReadAccessTo . MessageR <=< encrypt) + .| transPipe lift (C.mapMaybeM $ \smId -> fmap (\args@(sm, _) -> (smId, sm, systemMessageToTranslation smId args)) <$> getSystemMessage smId) + .| C.filter (\(_, SystemMessage{..}, _) -> NTop systemMessageFrom <= NTop (Just now) && NTop (Just now) < NTop systemMessageTo && all (\(k,v) -> (k,v) `elem` ((\VolatileClusterConfig{..} -> (volatileClusterConfigSetting, volatileClusterConfigValue)) . entityVal <$> volatileClusterConfig)) (Set.toList systemMessageOnVolatileClusterSettings)) + .| C.mapMaybeM checkHidden + .| C.iterM (\(smId, _, _, _) -> tellShown smId) + .| C.mapM (\(smId, sm@SystemMessage{..}, trans, hidden) -> (sm, trans, hidden,,) <$> formatTime SelFormatDateTime (maybe id max systemMessageFrom systemMessageLastChanged) <*> mkHideForm smId sm) + .| C.consume let messages = sortOn (\(SystemMessage{..}, _, _, _, _) -> (Down systemMessageManualPriority, Down $ maybe id max systemMessageFrom systemMessageLastChanged, systemMessageSeverity)) messages' hiddenUrl <- toTextUrl (NewsR, [(toPathPiece GetHidden, "")]) diff --git a/src/Handler/Profile.hs b/src/Handler/Profile.hs index f8d8389f1..3e2852395 100644 --- a/src/Handler/Profile.hs +++ b/src/Handler/Profile.hs @@ -31,6 +31,20 @@ import Jobs import Foundation.Yesod.Auth (updateUserLanguage) +data ExamOfficeSettings + = ExamOfficeSettings + { eosettingsGetSynced :: Bool + , eosettingsGetLabels :: Bool + , eosettingsLabels :: EOLabels + } + +type EOLabelData + = ( ExamOfficeLabelName + , MessageStatus -- status + , Int -- priority; also used for label ordering + ) +type EOLabels = Map (Either ExamOfficeLabelName ExamOfficeLabelId) EOLabelData + data SettingsForm = SettingsForm { stgDisplayName :: UserDisplayName , stgDisplayEmail :: UserEmail @@ -43,6 +57,7 @@ data SettingsForm = SettingsForm , stgDownloadFiles :: Bool , stgWarningDays :: NominalDiffTime , stgShowSex :: Bool + , stgExamOfficeSettings :: ExamOfficeSettings , stgSchools :: Set SchoolId , stgNotificationSettings :: NotificationSettings , stgAllocationNotificationSettings :: Map AllocationId (Maybe Bool) @@ -115,6 +130,7 @@ makeSettingForm template html = do & setTooltip MsgWarningDaysTip ) (stgWarningDays <$> template) <*> apopt checkBoxField (fslI MsgShowSex & setTooltip MsgShowSexTip) (stgShowSex <$> template) + <*> examOfficeForm (stgExamOfficeSettings <$> template) <* aformSection MsgFormNotifications <*> schoolsForm (stgSchools <$> template) <*> notificationForm (stgNotificationSettings <$> template) @@ -312,6 +328,101 @@ allocationNotificationForm = maybe (pure mempty) allocationNotificationForm' . ( where funcForm' forms = funcForm forms (fslI MsgFormAllocationNotifications & setTooltip MsgFormAllocationNotificationsTip) False +examOfficeForm :: Maybe ExamOfficeSettings -> AForm Handler ExamOfficeSettings +examOfficeForm template = wFormToAForm $ do + (_uid, User{userExamOfficeGetSynced,userExamOfficeGetLabels}) <- requireAuthPair + currentRoute <- fromMaybe (error "examOfficeForm called from 404-handler") <$> liftHandler getCurrentRoute + mr <- getMessageRender + + let + userExamOfficeLabels :: EOLabels + userExamOfficeLabels = maybe mempty eosettingsLabels template + + eoLabelsForm :: AForm Handler EOLabels + eoLabelsForm = wFormToAForm $ do + let + miAdd :: ListPosition + -> Natural + -> ListLength + -> (Text -> Text) + -> FieldView UniWorX + -> Maybe + (Form (Map ListPosition (Either ExamOfficeLabelName ExamOfficeLabelId) + -> FormResult (Map ListPosition (Either ExamOfficeLabelName ExamOfficeLabelId))) + ) + miAdd _ _ _ nudge submitView = Just $ \csrf -> do + (addRes, addView) <- mpreq textField (fslI MsgExamOfficeLabelName & addName (nudge "name")) Nothing + let + addRes' = addRes <&> \nLabel oldData@(maybe 0 (succ . fst) . Map.lookupMax -> kStart) -> if + | Set.member (Left nLabel) . Set.fromList $ Map.elems oldData + -> FormFailure [mr MsgExamOfficeLabelAlreadyExists] + | otherwise + -> FormSuccess $ Map.singleton kStart (Left nLabel) + return (addRes', $(widgetFile "profile/exam-office-labels/add")) + + miCell :: ListPosition + -> Either ExamOfficeLabelName ExamOfficeLabelId + -> Maybe EOLabelData + -> (Text -> Text) + -> Form EOLabelData + miCell _ eoLabel initRes nudge csrf = do + labelIdent <- case eoLabel of + Left lblName -> return lblName + Right lblId -> do + ExamOfficeLabel{examOfficeLabelName} <- liftHandler . runDB $ getJust lblId + return examOfficeLabelName + (statusRes, statusView) <- mreq (selectField optionsFinite) (fslI MsgExamOfficeLabelStatus & addName (nudge "status")) ((\(_,x,_) -> x) <$> initRes) + (priorityRes, priorityView) <- mreq intField (fslI MsgExamOfficeLabelPriority & addName (nudge "priority")) (((\(_,_,x) -> x) <$> initRes) <|> Just 0) + let + res :: FormResult EOLabelData + res = (,,) <$> FormSuccess labelIdent <*> statusRes <*> priorityRes + return (res, $(widgetFile "profile/exam-office-labels/cell")) + + miDelete :: Map ListPosition (Either ExamOfficeLabelName ExamOfficeLabelId) + -> ListPosition + -> MaybeT (MForm Handler) (Map ListPosition ListPosition) + miDelete = miDeleteList + + miAddEmpty :: ListPosition + -> Natural + -> ListLength + -> Set ListPosition + miAddEmpty _ _ _ = Set.empty + + miButtonAction :: forall p. + PathPiece p + => p + -> Maybe (SomeRoute UniWorX) + miButtonAction frag = Just . SomeRoute $ currentRoute :#: frag + + miLayout :: ListLength + -> Map ListPosition (Either ExamOfficeLabelName ExamOfficeLabelId, FormResult EOLabelData) + -> Map ListPosition Widget + -> Map ListPosition (FieldView UniWorX) + -> Map (Natural, ListPosition) Widget + -> Widget + miLayout lLength _ cellWdgts delButtons addWdgets = $(widgetFile "profile/exam-office-labels/layout") + + miIdent :: Text + miIdent = "exam-office-labels" + + filledData :: Maybe (Map ListPosition (Either ExamOfficeLabelName ExamOfficeLabelId, EOLabelData)) + filledData = Just . Map.fromList . zip [0..] $ Map.toList userExamOfficeLabels + + fmap (Map.fromList . Map.elems) <$> massInputW MassInput{..} (fslI MsgExamOfficeLabels & setTooltip MsgExamOfficeLabelsTip) False filledData + + userIsExamOffice <- liftHandler . hasReadAccessTo $ ExamOfficeR EOExamsR + if userIsExamOffice + then + aFormToWForm $ ExamOfficeSettings + <$ aformSection MsgFormExamOffice + <*> apopt checkBoxField (fslI MsgExamOfficeGetSynced & setTooltip MsgExamOfficeGetSyncedTip) (eosettingsGetSynced <$> template) + <*> apopt checkBoxField (fslI MsgExamOfficeGetLabels & setTooltip MsgExamOfficeGetLabelsTip) (eosettingsGetLabels <$> template) + <*> eoLabelsForm + else + return . pure . fromMaybe (ExamOfficeSettings userExamOfficeGetSynced userExamOfficeGetLabels userExamOfficeLabels) $ template + + validateSettings :: User -> FormValidator SettingsForm Handler () validateSettings User{..} = do userDisplayName' <- use _stgDisplayName @@ -343,12 +454,15 @@ getProfileR, postProfileR :: Handler Html getProfileR = postProfileR postProfileR = do (uid, user@User{..}) <- requireAuthPair - userSchools <- fmap (setOf $ folded . _Value) . runDB . E.select . E.from $ \school -> do - E.where_ . E.exists . E.from $ \userSchool -> - E.where_ $ E.not_ (userSchool E.^. UserSchoolIsOptOut) - E.&&. userSchool E.^. UserSchoolUser E.==. E.val uid - E.&&. userSchool E.^. UserSchoolSchool E.==. school E.^. SchoolId - return $ school E.^. SchoolId + (userSchools, userExamOfficeLabels) <- runDB $ do + userSchools <- fmap (setOf $ folded . _Value) . E.select . E.from $ \school -> do + E.where_ . E.exists . E.from $ \userSchool -> + E.where_ $ E.not_ (userSchool E.^. UserSchoolIsOptOut) + E.&&. userSchool E.^. UserSchoolUser E.==. E.val uid + E.&&. userSchool E.^. UserSchoolSchool E.==. school E.^. SchoolId + return $ school E.^. SchoolId + userExamOfficeLabels <- selectList [ ExamOfficeLabelUser ==. uid ] [] + return (userSchools, userExamOfficeLabels) allocs <- runDB $ getAllocationNotifications uid let settingsTemplate = Just SettingsForm { stgDisplayName = userDisplayName @@ -364,6 +478,11 @@ postProfileR = do , stgNotificationSettings = userNotificationSettings , stgWarningDays = userWarningDays , stgShowSex = userShowSex + , stgExamOfficeSettings = ExamOfficeSettings + { eosettingsGetSynced = userExamOfficeGetSynced + , eosettingsGetLabels = userExamOfficeGetLabels + , eosettingsLabels = flip foldMap userExamOfficeLabels $ \(Entity eolid ExamOfficeLabel{..}) -> Map.singleton (Right eolid) (examOfficeLabelName,examOfficeLabelStatus,examOfficeLabelPriority) + } , stgAllocationNotificationSettings = allocs } ((res,formWidget), formEnctype) <- runFormPost . validateForm (validateSettings user) . identifyForm ProfileSettings $ makeSettingForm settingsTemplate @@ -382,6 +501,8 @@ postProfileR = do , UserWarningDays =. stgWarningDays , UserNotificationSettings =. stgNotificationSettings , UserShowSex =. stgShowSex + , UserExamOfficeGetSynced =. (stgExamOfficeSettings & eosettingsGetSynced) + , UserExamOfficeGetLabels =. (stgExamOfficeSettings & eosettingsGetLabels) ] ++ [ UserDisplayEmail =. stgDisplayEmail | userDisplayEmail == stgDisplayEmail ] setAllocationNotifications uid stgAllocationNotificationSettings updateFavourites Nothing @@ -407,6 +528,26 @@ postProfileR = do } [ UserSchoolIsOptOut =. True ] + let + oldExamLabels = userExamOfficeLabels + newExamLabels = stgExamOfficeSettings & eosettingsLabels + forM_ oldExamLabels $ \(Entity eolid ExamOfficeLabel{..}) -> unless (Right eolid `Map.member` newExamLabels || Left examOfficeLabelName `Map.member` newExamLabels) $ do + E.delete . E.from $ \examOfficeExternalExamLabel -> E.where_ $ examOfficeExternalExamLabel E.^. ExamOfficeExternalExamLabelLabel E.==. E.val eolid + E.delete . E.from $ \examOfficeExamLabel -> E.where_ $ examOfficeExamLabel E.^. ExamOfficeExamLabelLabel E.==. E.val eolid + when (csvExportLabel userCsvOptions == Just examOfficeLabelName) $ + update uid [ UserCsvOptions =. userCsvOptions { csvExportLabel = Nothing } ] + delete eolid + forM_ (Map.toList newExamLabels) $ \(eoLabelIdent, (examOfficeLabelName, examOfficeLabelStatus, examOfficeLabelPriority)) -> case eoLabelIdent of + Left _ -> void $ upsert ExamOfficeLabel{ examOfficeLabelUser=uid, .. } + [ ExamOfficeLabelName =. examOfficeLabelName + , ExamOfficeLabelStatus =. examOfficeLabelStatus + , ExamOfficeLabelPriority =. examOfficeLabelPriority + ] + Right lblId -> update lblId + [ ExamOfficeLabelName =. examOfficeLabelName + , ExamOfficeLabelStatus =. examOfficeLabelStatus + , ExamOfficeLabelPriority =. examOfficeLabelPriority + ] addMessageI Success MsgSettingsUpdate redirect $ ProfileR :#: ProfileSettings @@ -455,7 +596,6 @@ getProfileDataR = do makeProfileData :: Entity User -> DB Widget makeProfileData (Entity uid User{..}) = do - -- MsgRenderer mr <- getMsgRenderer functions <- Map.fromListWith Set.union . map (\(Entity _ UserFunction{..}) -> (userFunctionFunction, Set.singleton userFunctionSchool)) <$> selectList [UserFunctionUser ==. uid] [] lecture_corrector <- E.select $ E.distinct $ E.from $ \(sheet `E.InnerJoin` corrector `E.InnerJoin` course) -> do E.on $ sheet E.^. SheetCourse E.==. course E.^. CourseId @@ -487,8 +627,8 @@ makeProfileData (Entity uid User{..}) = do +-- | Table listing all courses that the given user is a lecturer for mkOwnedCoursesTable :: UserId -> DB (Bool, Widget) --- Table listing all courses that the given user is a lecturer for mkOwnedCoursesTable = let dbtIdent = "courseOwnership" :: Text dbtStyle = def @@ -538,9 +678,8 @@ mkOwnedCoursesTable = in \uid -> let dbtSQLQuery = dbtSQLQuery' uid in (_1 %~ getAny) <$> dbTableWidget validator DBTable{..} - +-- | Table listing all courses that the given user is enrolled in mkEnrolledCoursesTable :: UserId -> DB Widget --- Table listing all courses that the given user is enrolled in mkEnrolledCoursesTable = let withType :: ((E.SqlExpr (Entity Course) `E.InnerJoin` E.SqlExpr (Entity CourseParticipant)) -> a) -> ((E.SqlExpr (Entity Course) `E.InnerJoin` E.SqlExpr (Entity CourseParticipant)) -> a) @@ -591,9 +730,8 @@ mkEnrolledCoursesTable = } - +-- | Table listing all submissions for the given user mkSubmissionTable :: UserId -> DB Widget --- Table listing all submissions for the given user mkSubmissionTable = let dbtIdent = "submissions" :: Text dbtStyle = def @@ -677,9 +815,8 @@ mkSubmissionTable = -- return $ dbTableWidget' validator $ DBTable {..} - +-- | Table listing all submissions for the given user mkSubmissionGroupTable :: UserId -> DB Widget --- Table listing all submissions for the given user mkSubmissionGroupTable = let dbtIdent = "subGroups" :: Text dbtStyle = def @@ -734,13 +871,10 @@ mkSubmissionGroupTable = in dbTableWidget' validator DBTable{..} - mkCorrectionsTable :: UserId -> DB Widget --- Table listing sum of corrections made by the given user per sheet mkCorrectionsTable = let dbtIdent = "corrections" :: Text dbtStyle = def --- TODO Continue here withType :: ((E.SqlExpr (Entity Course) `E.InnerJoin` E.SqlExpr (Entity Sheet) `E.InnerJoin` E.SqlExpr (Entity SheetCorrector))->a) -> ((E.SqlExpr (Entity Course) `E.InnerJoin` E.SqlExpr (Entity Sheet) `E.InnerJoin` E.SqlExpr (Entity SheetCorrector))->a) withType = id @@ -930,8 +1064,14 @@ getCsvOptionsR = postCsvOptionsR postCsvOptionsR = do Entity uid User{userCsvOptions} <- requireAuth + userIsExamOffice <- hasReadAccessTo $ ExamOfficeR EOExamsR + examOfficeLabels <- if not userIsExamOffice then return mempty else runDB . E.select . E.from $ \examOfficeLabel -> do + E.where_ $ examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid + E.orderBy [ E.asc (examOfficeLabel E.^. ExamOfficeLabelName) ] + return $ examOfficeLabel E.^. ExamOfficeLabelName + ((optionsRes, optionsWgt'), optionsEnctype) <- runFormPost . renderAForm FormStandard $ - csvOptionsForm (Just userCsvOptions) + csvOptionsForm (Just userCsvOptions) (Set.fromList $ E.unValue <$> examOfficeLabels) formResultModal optionsRes CsvOptionsR $ \opts -> do lift . runDB $ update uid [ UserCsvOptions =. opts ] diff --git a/src/Handler/Sheet/PersonalisedFiles.hs b/src/Handler/Sheet/PersonalisedFiles.hs index 6c1ec3048..b56651052 100644 --- a/src/Handler/Sheet/PersonalisedFiles.hs +++ b/src/Handler/Sheet/PersonalisedFiles.hs @@ -87,6 +87,7 @@ resolvePersonalisedSheetFiles :: forall m a. ( MonadHandler m , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) , MonadCatch m, MonadRandom m ) => Lens' a FilePath @@ -133,6 +134,7 @@ resolvePersonalisedSheetFiles fpL isDir cid sid = do sinkPersonalisedSheetFiles :: forall m. ( MonadHandler m , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) , MonadCatch m, MonadRandom m ) => CourseId @@ -208,6 +210,7 @@ sinkPersonalisedSheetFiles cid sid keep sourcePersonalisedSheetFiles :: forall m. ( MonadHandler m , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) , MonadThrow m , MonadRandom m ) @@ -310,7 +313,7 @@ data PersonalisedSheetFilesKeyException newPersonalisedFilesKey :: forall m. ( MonadHandler m - , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) , MonadThrow m, MonadRandom m ) => Either CourseId SheetId -> SqlPersistT m (Maybe Word24, PersonalisedSheetFilesKeySet) @@ -318,7 +321,7 @@ newPersonalisedFilesKey (Right shId) = (Nothing, ) <$> do psfksCryptoID <- cryptoIDKey $ \cIDKey -> either (const $ throwM PersonalisedSheetFilesKeyCouldNotDecodeRandom) (views _3 return) . Binary.decodeOrFail . fromStrict . BA.convert $ Crypto.kmac @(SHAKE256 CryptoIDCipherKeySize) (encodeUtf8 . (pack :: String -> Text) $ nameBase 'newPersonalisedFilesKey) (toStrict $ Binary.encode shId) cIDKey - psfksSeed <- fmap Just . getsYesod . views _appPersonalisedSheetFilesSeedKey . flip derivePersonalisedSheetFilesSeedKey . toStrict $ Binary.encode (nameBase 'newPersonalisedFilesKey, shId) + psfksSeed <- fmap Just . getsSite . views _appPersonalisedSheetFilesSeedKey . flip derivePersonalisedSheetFilesSeedKey . toStrict $ Binary.encode (nameBase 'newPersonalisedFilesKey, shId) return PersonalisedSheetFilesKeySet{..} newPersonalisedFilesKey (Left cId) = do now <- liftIO getCurrentTime @@ -342,7 +345,7 @@ newPersonalisedFilesKey (Left cId) = do getPersonalisedFilesKey :: forall m. ( MonadHandler m - , HandlerSite m ~ UniWorX + , MonadSite UniWorX (SqlPersistT m) , MonadThrow m, MonadRandom m ) => CourseId -> Maybe SheetId -> Maybe Word24 -> SqlPersistT m PersonalisedSheetFilesKeySet diff --git a/src/Handler/Submission/Helper.hs b/src/Handler/Submission/Helper.hs index 3b6521f1b..ae8799d23 100644 --- a/src/Handler/Submission/Helper.hs +++ b/src/Handler/Submission/Helper.hs @@ -419,7 +419,6 @@ submissionHelper tid ssh csh shn mcid = do isParticipant = E.exists . E.from $ \courseParticipant -> do E.where_ $ user E.^. UserId E.==. courseParticipant E.^. CourseParticipantUser E.&&. courseParticipant E.^. CourseParticipantCourse E.==. E.val sheetCourse - E.&&. courseParticipant E.^. CourseParticipantState E.==. E.val CourseParticipantActive hasSubmitted = E.exists . E.from $ \(submissionUser `E.InnerJoin` submission) -> do E.on $ submissionUser E.^. SubmissionUserSubmission E.==. submission E.^. SubmissionId E.where_ $ submissionUser E.^. SubmissionUserUser E.==. user E.^. UserId diff --git a/src/Handler/Submission/List.hs b/src/Handler/Submission/List.hs index d9976e95c..d03e66786 100644 --- a/src/Handler/Submission/List.hs +++ b/src/Handler/Submission/List.hs @@ -45,6 +45,7 @@ import Data.List (genericLength) import qualified Data.Csv as Csv + data CorrectionTableFilterProj = CorrectionTableFilterProj { corrProjFilterSubmission :: Maybe (Set [CI Char]) , corrProjFilterPseudonym :: Maybe (Set [CI Char]) @@ -781,6 +782,7 @@ makeCorrectionsTable whereClause dbtColonnade dbtFilterUI' mCSVSettings psValida data ActionCorrections = CorrDownload | CorrSetCorrector | CorrAutoSetCorrector + | CorrSetCorrectionsDone | CorrDelete deriving (Eq, Ord, Read, Show, Enum, Bounded) @@ -793,6 +795,7 @@ embedRenderMessage ''UniWorX ''ActionCorrections id data ActionCorrectionsData = CorrDownloadData SubmissionDownloadAnonymous SubmissionFileType | CorrSetCorrectorData (Maybe UserId) | CorrAutoSetCorrectorData SheetId + | CorrSetCorrectionsDoneData Bool | CorrDeleteData correctionsR :: CorrectionTableWhere -> _ -> _ -> Maybe CorrectionTableCsvSettings -> _ -> Map ActionCorrections (AForm (HandlerFor UniWorX) ActionCorrectionsData) -> Handler TypedContent @@ -927,6 +930,15 @@ correctionsR' whereClause displayColumns dbtFilterUI csvSettings psValidator act unassigned' <- forM (Set.toList stillUnassigned) $ \sid -> encrypt sid :: DB CryptoFileNameSubmission addMessage Warning =<< withUrlRenderer ($(ihamletFile "templates/messages/submissionsNotAssignedAuto.hamlet") mr) redirect currentRoute + (CorrSetCorrectionsDoneData isDone, subs') -> do + now <- liftIO getCurrentTime + subs <- mapM decrypt $ Set.toList subs' + runDB $ do + _ <- updateWhere [SubmissionId <-. subs] + [SubmissionRatingTime =. bool Nothing (Just now) isDone] + addMessageI Success $ MsgSetCorrectionsDone isDone + auditAllSubEdit subs + redirect currentRoute (CorrDeleteData, subs) -> do subs' <- Set.fromList <$> forM (Set.toList subs) decrypt -- Set is not traversable getDeleteR (submissionDeleteRoute subs') @@ -997,6 +1009,12 @@ assignAction selId = ( CorrSetCorrector fmap CorrSetCorrectorData <$> (traverse.traverse) decrypt cId ) +setCorrectionsDoneAction :: ActionCorrections' +setCorrectionsDoneAction = ( CorrSetCorrectionsDone + , CorrSetCorrectionsDoneData + <$> apopt checkBoxField (fslI MsgCorrSetCorrectionsDone) (Just True) + ) + autoAssignAction :: SheetId -> ActionCorrections' autoAssignAction shid = ( CorrAutoSetCorrector , pure $ CorrAutoSetCorrectorData shid @@ -1023,7 +1041,7 @@ postCorrectionsR = do , colAssigned , colRating , colRated - ] -- Continue here + ] filterUI = Just $ mconcat [ filterUIPseudonym , filterUICourse courseOptions @@ -1046,7 +1064,7 @@ postCorrectionsR = do psValidator = def & restrictCorrector & restrictAnonymous - & defaultSorting [SortDescBy "ratingtime", SortAscBy "assignedtime" ] + & defaultSorting [SortAscBy "assignedtime", SortDescBy "ratingtime"] & defaultFilter (singletonMap "israted" [toPathPiece False]) csvSettings = Just CorrectionTableCsvSettings @@ -1109,6 +1127,7 @@ postCCorrectionsR tid ssh csh = do correctionsR whereClause colonnade filterUI csvSettings psValidator $ Map.fromList [ downloadAction , assignAction (Left cid) + , setCorrectionsDoneAction , deleteAction ] @@ -1157,5 +1176,6 @@ postSSubsR tid ssh csh shn = do [ downloadAction , assignAction (Right shid) , autoAssignAction shid + , setCorrectionsDoneAction , deleteAction ] diff --git a/src/Handler/Swagger.hs b/src/Handler/Swagger.hs new file mode 100644 index 000000000..665d7cb69 --- /dev/null +++ b/src/Handler/Swagger.hs @@ -0,0 +1,78 @@ +module Handler.Swagger + ( getSwaggerR, getSwaggerJsonR + ) where + +import Import hiding (host, Response, Scheme(..)) +import ServantApi + +import Data.Swagger +import Data.Swagger.Declare (Declare) +import Servant.Swagger + +import Development.GitRev + +import Network.URI + +import Text.Read (readMaybe) + + +genSwagger :: Handler Swagger +genSwagger = do + app <- getYesod + let + docMR :: RenderMessage UniWorX msg => msg -> Text + docMR = renderMessage app . otoList $ selectLanguages appLanguages ["en"] + root <- getApprootText approot app <$> waiRequest + let applyApproot = do + URI{..} <- fmap rectify . parseURIReference $ unpack root + let mbScheme = do + str <- assertM (not . null) $ stripSuffix ":" uriScheme + case str of + "https" -> return Https + "http" -> return Http + _other -> mzero + applyAuthority = do + URIAuth{..} <- uriAuthority + let mbPort = readMaybe . fromMaybe "" $ stripPrefix ":" uriPort + return $ + host ?~ Host uriRegName mbPort + return $ \x -> x + & fromMaybe id applyAuthority + & schemes .~ fmap pure mbScheme + & basePath ?~ bool id (ensurePrefix "/") (is _Just mbScheme || is _Just uriAuthority) uriPath + errorResponses :: Map HttpStatusCode (Declare (Definitions Schema) Response) + errorResponses = mconcat + [ singletonMap 500 $ return mempty + , singletonMap 400 $ return mempty + , singletonMap 401 $ return mempty + , singletonMap 403 $ return mempty + , singletonMap 405 $ return mempty + ] + + tos <- toTextUrl $ LegalR :#: ("terms-of-use" :: Text) + c <- toTextUrl HelpR + + let supportContact = mempty + & name .~ addressName supportAddress + & email ?~ addressEmail supportAddress + & url ?~ URL c + where + supportAddress = appMailSupport $ appSettings' app + + return $ toSwagger uniworxApi + & info.title .~ docMR MsgLogo + & info.description ?~ docMR MsgInvitationUniWorXTip + & info.termsOfService ?~ tos + & info.contact ?~ supportContact + & info.version .~ $gitDescribe + & fromMaybe id applyApproot + & appEndo (ifoldMap ((Endo .) . setResponseWith const) errorResponses) + + +getSwaggerR :: Handler TypedContent +getSwaggerR = selectRep $ do + provideRep $ toPrettyJSON <$> genSwagger + provideRep $ toYAML <$> genSwagger + +getSwaggerJsonR :: Handler Void +getSwaggerJsonR = redirect SwaggerR diff --git a/src/Handler/SystemMessage.hs b/src/Handler/SystemMessage.hs index 521634de4..4e24d8afc 100644 --- a/src/Handler/SystemMessage.hs +++ b/src/Handler/SystemMessage.hs @@ -7,19 +7,48 @@ module Handler.SystemMessage import Import -import qualified Data.Map.Lazy as Map - -import qualified Data.Set as Set -import qualified Data.HashMap.Strict as HashMap - -import qualified Data.List.NonEmpty as NonEmpty - import Handler.Utils import Handler.Utils.News +import qualified Data.HashMap.Strict as HashMap +import Data.Map ((!)) +import qualified Data.Map.Lazy as Map +import qualified Data.List.NonEmpty as NonEmpty +import qualified Data.Set as Set +import qualified Data.Text as Text (intercalate) + import qualified Database.Esqueleto.Legacy as E --- htmlField' moved to Handler.Utils.Form/Fields +invalidateVisibleSystemMessages :: (MonadHandler m, HandlerSite m ~ UniWorX) => m () +invalidateVisibleSystemMessages = memcachedByInvalidate AuthCacheVisibleSystemMessages $ Proxy @(Map SystemMessageId (Maybe UTCTime, Maybe UTCTime)) + + +systemMessageVolatileClusterSettingsForm :: Maybe SystemMessageVolatileClusterSettings -> AForm Handler SystemMessageVolatileClusterSettings +systemMessageVolatileClusterSettingsForm (fmap Set.toList -> mPrev) = wFormToAForm $ do + currentRoute <- fromMaybe (error "systemMessageVolatileClusterSettingsForm called from 404-handler") <$> getCurrentRoute + let + volatileClusterSettingForm :: (Text -> Text) -> Maybe (VolatileClusterSettingsKey, Value) -> Form (VolatileClusterSettingsKey, Value) + volatileClusterSettingForm nudge mTemplate csrf = do + (keyRes, keyView) <- mpreq (selectField optionsFinite) ("" & addName (nudge "key" )) (view _1 <$> mTemplate) + (valRes, valView) <- mpreq (jsonField JsonFieldNormal) ("" & addName (nudge "value")) (view _2 <$> mTemplate) + return ((,) <$> keyRes <*> valRes, $(widgetFile "widgets/massinput/systemMessage/volatileClusterSettings/form")) + + miAdd nudge submitView csrf = do + (formRes, formView) <- volatileClusterSettingForm nudge Nothing csrf + MsgRenderer mr <- getMsgRenderer + let res = formRes <&> \newDat@(newKey, _) oldDat -> if + | any (\(oldKey, _) -> newKey == oldKey) oldDat -> FormFailure [mr MsgSystemMessageOnVolatileClusterSettingKeyExists] + | otherwise -> FormSuccess $ pure newDat + return (res, $(widgetFile "widgets/massinput/systemMessage/volatileClusterSettings/add")) + miEdit nudge = volatileClusterSettingForm nudge . Just + + miButtonAction :: forall p. PathPiece p => p -> Maybe (SomeRoute UniWorX) + miButtonAction frag = Just . SomeRoute $ currentRoute :#: frag + + miLayout :: MassInputLayout ListLength (VolatileClusterSettingsKey, Value) (VolatileClusterSettingsKey, Value) + miLayout lLength _ cellWdgts delButtons addWdgts = $(widgetFile "widgets/massinput/systemMessage/volatileClusterSettings/layout") + fmap Set.fromList <$> massInputAccumEditW miAdd miEdit miButtonAction miLayout ("system-message-volatile-cluster-settings" :: Text) (fslI MsgSystemMessageOnVolatileClusterSettings) False mPrev + invalidateVisibleSystemMessages :: (MonadHandler m, HandlerSite m ~ UniWorX) => m () @@ -44,6 +73,7 @@ postMessageR cID = do $ SystemMessage <$> aopt utcTimeField (fslI MsgSystemMessageFrom) (Just systemMessageFrom) <*> aopt utcTimeField (fslI MsgSystemMessageTo) (Just systemMessageTo) + <*> systemMessageVolatileClusterSettingsForm (Just systemMessageOnVolatileClusterSettings) <*> apopt checkBoxField (fslI MsgSystemMessageNewsOnly) (Just systemMessageNewsOnly) <*> apopt checkBoxField (fslI MsgSystemMessageAuthenticatedOnly) (Just systemMessageAuthenticatedOnly) <*> areq (selectField optionsFinite) (fslI MsgSystemMessageSeverity) (Just systemMessageSeverity) @@ -178,6 +208,7 @@ postMessageListR = do , sortable Nothing (i18nCell MsgSystemMessageId) $ \DBRow{ dbrOutput = (Entity smId _, _) } -> anchorCellM' (encrypt smId) MessageR ciphertext , sortable (Just "from") (i18nCell MsgSystemMessageFrom) $ \DBRow{ dbrOutput = (Entity _ SystemMessage{..}, _) } -> cell $ maybe mempty (formatTimeW SelFormatDateTime) systemMessageFrom , sortable (Just "to") (i18nCell MsgSystemMessageTo) $ \DBRow{ dbrOutput = (Entity _ SystemMessage{..}, _) } -> cell $ maybe mempty (formatTimeW SelFormatDateTime) systemMessageTo + , sortable (Just "on-volatile-cluster-settings") (i18nCell MsgSystemMessageOnVolatileClusterSettings) $ \DBRow{ dbrOutput = (Entity _ SystemMessage{..}, _) } -> cell . toWidget . unlines . fmap (\(k,v) -> Text.intercalate " = " [tshow k, tshow v]) $ Set.toList systemMessageOnVolatileClusterSettings , sortable (Just "news-only") (i18nCell MsgSystemMessageNewsOnly) $ \DBRow { dbrOutput = (Entity _ SystemMessage{..}, _) } -> tickmarkCell systemMessageNewsOnly , sortable (Just "authenticated") (i18nCell MsgSystemMessageAuthenticatedOnly) $ \DBRow{ dbrOutput = (Entity _ SystemMessage{..}, _) } -> tickmarkCell systemMessageAuthenticatedOnly , sortable (Just "severity") (i18nCell MsgSystemMessageSeverity) $ \DBRow{ dbrOutput = (Entity _ SystemMessage{..}, _) } -> i18nCell systemMessageSeverity @@ -206,6 +237,9 @@ postMessageListR = do , ( "to" , SortColumn $ \systemMessage -> systemMessage E.^. SystemMessageTo ) + , ( "on-volatile-cluster-settings" + , SortColumn $ \systemMessage -> systemMessage E.^. SystemMessageOnVolatileClusterSettings + ) , ( "news-only" , SortColumn $ \systemMessage -> systemMessage E.^. SystemMessageNewsOnly ) @@ -290,6 +324,7 @@ postMessageListR = do ((addRes, addView), addEncoding) <- runFormPost . identifyForm FIDSystemMessageAdd . renderAForm FormStandard $ SystemMessage <$> aopt utcTimeField (fslI MsgSystemMessageFrom) (Just Nothing) <*> aopt utcTimeField (fslI MsgSystemMessageTo) (Just Nothing) + <*> systemMessageVolatileClusterSettingsForm Nothing <*> apopt checkBoxField (fslI MsgSystemMessageNewsOnly) (Just False) <*> apopt checkBoxField (fslI MsgSystemMessageAuthenticatedOnly) (Just False) <*> areq (selectField optionsFinite) (fslI MsgSystemMessageSeverity) (Just Info) diff --git a/src/Handler/Tutorial/Communication.hs b/src/Handler/Tutorial/Communication.hs index c01464eec..84670801e 100644 --- a/src/Handler/Tutorial/Communication.hs +++ b/src/Handler/Tutorial/Communication.hs @@ -10,8 +10,6 @@ import Handler.Utils.Communication import qualified Database.Esqueleto.Legacy as E import qualified Database.Esqueleto.Utils as E -import qualified Data.Map as Map - getTCommR, postTCommR :: TermId -> SchoolId -> CourseShorthand -> TutorialName -> Handler Html getTCommR = postTCommR @@ -36,21 +34,13 @@ postTCommR tid ssh csh tutn = do , crUltDest = SomeRoute $ CTutorialR tid ssh csh tutn TCommR , crJobs = crJobsCourseCommunication cid , crTestJobs = crTestJobsCourseCommunication cid - , crRecipients = Map.fromList $ + , crRecipients = [ ( RGCourseLecturers , E.from $ \(user `E.InnerJoin` lecturer) -> do E.on $ user E.^. UserId E.==. lecturer E.^. LecturerUser E.where_ $ lecturer E.^. LecturerCourse E.==. E.val cid return user ) - , ( RGCourseCorrectors - , E.from $ \user -> do - E.where_ $ E.exists $ E.from $ \(sheet `E.InnerJoin` corrector) -> do - E.on $ sheet E.^. SheetId E.==. corrector E.^. SheetCorrectorSheet - E.where_ $ sheet E.^. SheetCourse E.==. E.val cid - E.&&. corrector E.^. SheetCorrectorUser E.==. user E.^. UserId - return user - ) , ( RGCourseTutors , E.from $ \user -> do E.where_ $ E.exists $ E.from $ \(tutorial `E.InnerJoin` tutor) -> do @@ -59,6 +49,14 @@ postTCommR tid ssh csh tutn = do E.&&. tutor E.^. TutorUser E.==. user E.^. UserId return user ) + , ( RGCourseCorrectors + , E.from $ \user -> do + E.where_ $ E.exists $ E.from $ \(sheet `E.InnerJoin` corrector) -> do + E.on $ sheet E.^. SheetId E.==. corrector E.^. SheetCorrectorSheet + E.where_ $ sheet E.^. SheetCourse E.==. E.val cid + E.&&. corrector E.^. SheetCorrectorUser E.==. user E.^. UserId + return user + ) ] ++ usertuts , crRecipientAuth = Just $ \uid -> do isTutorialUser <- E.selectExists . E.from $ \tutorialUser -> diff --git a/src/Handler/Tutorial/Users.hs b/src/Handler/Tutorial/Users.hs index f8215a0d9..eb15e4e84 100644 --- a/src/Handler/Tutorial/Users.hs +++ b/src/Handler/Tutorial/Users.hs @@ -67,6 +67,12 @@ postTUsersR tid ssh csh tutn = do ] addMessageI Success $ MsgTutorialUsersDeregistered nrDel redirect $ CTutorialR tid ssh csh tutn TUsersR + + tutors <- runDB $ + E.select $ E.from $ \(tutor `E.InnerJoin` user) -> do + E.on $ tutor E.^. TutorUser E.==. user E.^. UserId + E.where_ $ tutor E.^. TutorTutorial E.==. E.val tutid + return user let heading = prependCourseTitle tid ssh csh $ CI.original tutorialName siteLayoutMsg heading $ do diff --git a/src/Handler/Users.hs b/src/Handler/Users.hs index 29963c64e..0e66a50fe 100644 --- a/src/Handler/Users.hs +++ b/src/Handler/Users.hs @@ -167,6 +167,15 @@ postUsersR = do -- Set.foldr (\needle acc -> acc E.||. (user E.^. UserDisplayName) `E.hasInfix` needle) eFalse (criterion :: Set.Set Text) E.any (\c -> user E.^. UserDisplayName `E.hasInfix` E.val c) criteria ) + , ( "user-ident", FilterColumn $ \user criterion -> case getLast (criterion :: Last Text) of + Nothing -> E.val True :: E.SqlExpr (E.Value Bool) + Just needle -> E.castString (user E.^. UserIdent) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%) + ) + , ( "user-email", FilterColumn $ \user criterion -> case getLast (criterion :: Last Text) of + Nothing -> E.val True :: E.SqlExpr (E.Value Bool) + Just needle -> (E.castString (user E.^. UserEmail) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%)) + E.||. (E.castString (user E.^. UserDisplayEmail) `E.ilike` (E.%) E.++. E.val needle E.++. (E.%)) +) , ( "matriculation", FilterColumn $ \user (criteria :: Set.Set Text) -> if | Set.null criteria -> E.true -- TODO: why can this be eFalse and work still? | otherwise -> E.any (\c -> user E.^. UserMatrikelnummer `E.hasInfix` E.val c) criteria @@ -192,6 +201,8 @@ postUsersR = do ] , dbtFilterUI = \mPrev -> mconcat [ prismAForm (singletonFilter "user-search") mPrev $ aopt textField (fslI MsgName) + , prismAForm (singletonFilter "user-ident") mPrev $ aopt textField (fslI MsgAdminUserIdent) + , prismAForm (singletonFilter "user-email") mPrev $ aopt textField (fslI MsgAdminUserEmail) -- , prismAForm (singletonFilter "matriculation" ) mPrev $ aopt textField (fslI MsgTableMatrikelNr) , prismAForm (singletonFilter "matriculation") mPrev $ aopt matriculationField (fslI MsgTableMatrikelNr) , prismAForm (singletonFilter "auth-ldap" . maybePrism _PathPiece) mPrev $ aopt (lift `hoistField` selectFieldList [(MsgAuthPWHash "", False), (MsgAuthLDAP, True)]) (fslI MsgAuthMode) @@ -555,14 +566,14 @@ postUserPasswordR cID = do , requireCurrent -> wreq (checkMap (bool (Left MsgCurrentPasswordInvalid) (Right ()) . flip (PWStore.verifyPasswordWith pwHashAlgorithm (2^)) pwHash . encodeUtf8) (const "") passwordField) - (fslI MsgCurrentPassword) + (fslI MsgCurrentPassword & addAttr "autocomplete" "current-password") Nothing | otherwise -> return $ FormSuccess () newResult <- do - resA <- wreq passwordField (fslI MsgNewPassword) Nothing - wreq (checkBool ((== resA) . FormSuccess) MsgPasswordRepeatInvalid passwordField) (fslI MsgNewPasswordRepeat) Nothing + resA <- wreq passwordField (fslI MsgNewPassword & addAttr "autocomplete" "new-password") Nothing + wreq (checkBool ((== resA) . FormSuccess) MsgPasswordRepeatInvalid passwordField) (fslI MsgNewPasswordRepeat & addAttr "autocomplete" "new-password") Nothing return . fmap encodeUtf8 $ currentResult *> newResult diff --git a/src/Handler/Users/Add.hs b/src/Handler/Users/Add.hs index 3ef62f811..554f823b0 100644 --- a/src/Handler/Users/Add.hs +++ b/src/Handler/Users/Add.hs @@ -83,6 +83,8 @@ postAdminUserAddR = do , userDownloadFiles = userDefaultDownloadFiles , userWarningDays = userDefaultWarningDays , userShowSex = userDefaultShowSex + , userExamOfficeGetSynced = userDefaultExamOfficeGetSynced + , userExamOfficeGetLabels = userDefaultExamOfficeGetLabels , userNotificationSettings = def , userLanguages = Nothing , userCsvOptions = def diff --git a/src/Handler/Utils/Communication.hs b/src/Handler/Utils/Communication.hs index ca32a1b71..81b266fa6 100644 --- a/src/Handler/Utils/Communication.hs +++ b/src/Handler/Utils/Communication.hs @@ -22,7 +22,7 @@ import qualified Data.Set as Set import qualified Data.Conduit.Combinators as C -data RecipientGroup = RGCourseParticipants | RGCourseLecturers | RGCourseCorrectors | RGCourseTutors | RGCourseUnacceptedApplicants +data RecipientGroup = RGCourseParticipants | RGCourseLecturers | RGCourseCorrectors | RGCourseTutors | RGCourseParticipantsInTutorial | RGCourseUnacceptedApplicants | RGTutorialParticipants CryptoUUIDTutorial | RGExamRegistered CryptoUUIDExam | RGSheetSubmittor CryptoUUIDSheet @@ -69,7 +69,7 @@ instance Button UniWorX CommunicationButton where data CommunicationRoute = CommunicationRoute - { crRecipients :: Map RecipientGroup (E.SqlQuery (E.SqlExpr (Entity User))) + { crRecipients :: [(RecipientGroup, E.SqlQuery (E.SqlExpr (Entity User)))] , crRecipientAuth :: Maybe (UserId -> DB AuthResult) -- ^ Only resolve userids given as GET-Parameter if they fulfil this criterion , crJobs, crTestJobs :: Communication -> ConduitT () Job (YesodDB UniWorX) () , crHeading :: SomeMessage UniWorX @@ -78,16 +78,16 @@ data CommunicationRoute = CommunicationRoute data Communication = Communication { cRecipients :: Set (Either UserEmail UserId) - , cSubject :: Maybe Text - , cBody :: Html + , cContent :: CommunicationContent } +makeLenses_ ''Communication + crJobsCourseCommunication, crTestJobsCourseCommunication :: CourseId -> Communication -> ConduitT () Job (YesodDB UniWorX) () crJobsCourseCommunication jCourse Communication{..} = do jSender <- requireAuthId - let jSubject = cSubject - jMailContent = cBody + let jMailContent = cContent allRecipients = Set.toList $ Set.insert (Right jSender) cRecipients jMailObjectUUID <- liftIO getRandom jAllRecipientAddresses <- lift . fmap Set.fromList . forM allRecipients $ \case @@ -99,7 +99,7 @@ crTestJobsCourseCommunication jCourse comm = do jSender <- requireAuthId MsgRenderer mr <- getMsgRenderer - let comm' = comm { cSubject = Just . mr . MsgCommCourseTestSubject . fromMaybe (mr MsgUtilCommCourseSubject) $ cSubject comm } + let comm' = comm & _cContent . _ccSubject %~ Just . mr . MsgCommCourseTestSubject . fromMaybe (mr MsgUtilCommCourseSubject) crJobsCourseCommunication jCourse comm' .| C.filter ((== Right jSender) . jRecipientEmail) @@ -111,7 +111,8 @@ commR CommunicationRoute{..} = do mbCurrentRoute <- getCurrentRoute (suggestedRecipients, chosenRecipients) <- runDB $ do - suggested <- for crRecipients $ \user -> E.select user + suggestedUsers <- for crRecipients $ \(_,user) -> E.select user + let suggested = zip (view _1 <$> crRecipients) suggestedUsers let decrypt' :: CryptoUUIDUser -> DB (Maybe (Entity User)) @@ -127,21 +128,21 @@ commR CommunicationRoute{..} = do let lookupUser :: UserId -> User lookupUser lId - = entityVal . unsafeHead . filter ((== lId) . entityKey) $ concat (Map.elems suggestedRecipients) ++ chosenRecipients + = entityVal . unsafeHead . filter ((== lId) . entityKey) $ concat (view _2 <$> suggestedRecipients) ++ chosenRecipients let chosenRecipients' = Map.fromList $ [ ( (BoundedPosition $ RecipientGroup g, pos) , (Right recp, recp `elem` map entityKey chosenRecipients) ) - | (g, recps) <- Map.toList suggestedRecipients + | (g, recps) <- suggestedRecipients , (pos, recp) <- zip [0..] $ map entityKey recps ] ++ [ ( (BoundedPosition RecipientCustom, pos) , (Right recp, True) ) - | (pos, recp) <- zip [0..] . Set.toList $ Set.fromList (map entityKey chosenRecipients) \\ Set.fromList (concatMap (map entityKey) $ Map.elems suggestedRecipients) + | (pos, recp) <- zip [0..] . Set.toList $ Set.fromList (map entityKey chosenRecipients) \\ Set.fromList (concatMap (map entityKey) $ view _2 <$> suggestedRecipients) ] - activeCategories = map RecipientGroup (Map.keys suggestedRecipients) `snoc` RecipientCustom + activeCategories = map RecipientGroup (view _1 <$> suggestedRecipients) `snoc` RecipientCustom let recipientAForm :: AForm Handler (Set (Either UserEmail UserId)) recipientAForm = postProcess <$> massInputA MassInput{..} (fslI MsgCommRecipients & setTooltip MsgCommRecipientsTip) True (Just chosenRecipients') @@ -206,11 +207,24 @@ commR CommunicationRoute{..} = do recipientsListMsg <- messageI Info MsgCommRecipientsList + attachmentsMaxSize <- getsYesod $ view _appCommunicationAttachmentsMaxSize + let attachmentField = genericFileField $ return FileField + { fieldIdent = Nothing + , fieldUnpackZips = FileFieldUserOption True False + , fieldMultiple = True + , fieldRestrictExtensions = Nothing + , fieldAdditionalFiles = _FileReferenceFileReferenceTitleMap # Map.empty + , fieldMaxFileSize = Nothing, fieldMaxCumulativeSize = attachmentsMaxSize + , fieldAllEmptyOk = True + } ((commRes,commWdgt),commEncoding) <- runFormPost . identifyForm FIDCommunication . withButtonForm' universeF . renderAForm FormStandard $ Communication <$> recipientAForm <* aformMessage recipientsListMsg - <*> aopt textField (fslI MsgCommSubject & addAttr "uw-enter-as-tab" "") Nothing - <*> (markupOutput <$> areq htmlField (fslI MsgCommBody) Nothing) + <*> ( CommunicationContent + <$> aopt textField (fslI MsgCommSubject & addAttr "uw-enter-as-tab" "") Nothing + <*> (markupOutput <$> areq htmlField (fslI MsgCommBody) Nothing) + <*> fmap fold (aopt (convertFieldM (runConduit . (.| C.foldMap Set.singleton)) yieldMany attachmentField) (fslI MsgCommAttachments & setTooltip MsgCommAttachmentsTip) Nothing) + ) formResult commRes $ \case (comm, BtnCommunicationSend) -> do runDBJobs . runConduit $ transPipe (mapReaderT lift) (crJobs comm) .| sinkDBJobs diff --git a/src/Handler/Utils/Download.hs b/src/Handler/Utils/Download.hs index 5de16efe5..ccac6f3b8 100644 --- a/src/Handler/Utils/Download.hs +++ b/src/Handler/Utils/Download.hs @@ -37,6 +37,7 @@ deriveJSON defaultOptions withFileDownloadTokenMaybe' :: forall url m. ( HasRoute UniWorX url , MonadHandler m, HandlerSite m ~ UniWorX + , MonadSite UniWorX m , MonadCrypto m , MonadCryptoKey m ~ CryptoIDKey , YesodAuthPersist UniWorX, AuthEntity UniWorX ~ User, AuthId UniWorX ~ UserId @@ -116,6 +117,7 @@ withFileDownloadTokenMaybe' mSource route = maybeT (return $ SomeRoute route) $ ensureApprootUserGeneratedMaybe' :: forall m. ( MonadHandler m, HandlerSite m ~ UniWorX + , MonadSite UniWorX m , MonadCrypto m , MonadCryptoKey m ~ CryptoIDKey , YesodAuthPersist UniWorX, AuthEntity UniWorX ~ User, AuthId UniWorX ~ UserId diff --git a/src/Handler/Utils/ExternalExam/Users.hs b/src/Handler/Utils/ExternalExam/Users.hs index 70a20fec6..9823e1905 100644 --- a/src/Handler/Utils/ExternalExam/Users.hs +++ b/src/Handler/Utils/ExternalExam/Users.hs @@ -135,8 +135,9 @@ data ExternalExamUserActionData | ExternalExamUserEditResultData ExamResultPassedGrade | ExternalExamUserDeleteData -newtype ExternalExamUserCsvExportDataGrades = ExternalExamUserCsvExportDataGrades +data ExternalExamUserCsvExportDataGrades = ExternalExamUserCsvExportDataGrades { csvEEUserMarkSynchronised :: Bool + , csvEEUserSetLabel :: Bool } deriving (Eq, Ord, Read, Show, Generic, Typeable) @@ -192,12 +193,19 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do coursen = externalExamCourseName examn = externalExamExamName - uid <- requireAuthId + Entity uid currentUser <- requireAuth isLecturer <- hasReadAccessTo $ EExamR tid ssh coursen examn EEUsersR + isExamOffice <- hasReadAccessTo $ ExamOfficeR EOExamsR currentRoute <- fromMaybe (error "makeExternalExamUsersTable called from 404-handler") <$> getCurrentRoute MsgRenderer mr <- getMsgRenderer exampleTime <- over _utctDayTime (fromInteger . round . toRational) <$> liftIO getCurrentTime + userCsvExportLabel' <- E.select . E.from $ \examOfficeLabel -> do + E.where_ $ maybe E.false (\expLbl -> examOfficeLabel E.^. ExamOfficeLabelName E.==. E.val expLbl) (csvExportLabel $ userCsvOptions currentUser) + E.&&. examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid + return examOfficeLabel + let userCsvExportLabel = listToMaybe userCsvExportLabel' + let dbtSQLQuery = runReaderT $ do result <- view queryResult @@ -245,7 +253,7 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExternalExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised lastChange <- view $ resultResult . _entityVal . _externalExamResultLastChanged - user <- view $ resultUser . _entityVal + User{..} <- view $ resultUser . _entityVal isSynced <- view resultIsSynced let hasSyncs = has folded syncs @@ -363,8 +371,17 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do EEUMGrades -> Just DBTCsvEncode { dbtCsvExportForm = ExternalExamUserCsvExportDataGrades <$> apopt checkBoxField (fslI MsgExternalExamUserMarkSynchronisedCsv & setTooltip MsgExternalExamUserMarkSynchronisedCsvTip) (Just False) + <*> bool + ( pure False ) + ( maybe + (aforced checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip MsgExamOfficeLabelSetLabelOnExportForcedTip) False) + (\expLbl -> apopt checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip (MsgExamOfficeLabelSetLabelOnExportTip expLbl)) (Just True)) + (examOfficeLabelName . entityVal <$> userCsvExportLabel) + ) + isExamOffice , dbtCsvDoEncode = \ExternalExamUserCsvExportDataGrades{..} -> C.mapM $ \(E.Value k, row) -> do when csvEEUserMarkSynchronised $ externalExamResultMarkSynchronised k + when csvEEUserSetLabel $ maybe (return ()) (\lbl -> void $ upsert (ExamOfficeExternalExamLabel eeId lbl) [ExamOfficeExternalExamLabelLabel =. lbl]) (entityKey <$> userCsvExportLabel) return $ encodeCsv' row , dbtCsvName, dbtCsvSheetName , dbtCsvNoExportData = Nothing diff --git a/src/Handler/Utils/Files.hs b/src/Handler/Utils/Files.hs index 83b5f7552..98b1e602e 100644 --- a/src/Handler/Utils/Files.hs +++ b/src/Handler/Utils/Files.hs @@ -1,3 +1,5 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + module Handler.Utils.Files ( sourceFile, sourceFile' , sourceFiles, sourceFiles' @@ -9,6 +11,7 @@ module Handler.Utils.Files import Import.NoFoundation hiding (First(..)) import Foundation.Type +import Foundation.DB import Utils.Metrics import Data.Monoid (First(..)) @@ -181,6 +184,11 @@ sourceFiles' = C.map sourceFile' sourceFile' :: forall file. (HasFileReference file, YesodPersistBackend UniWorX ~ SqlBackend) => file -> DBFile sourceFile' = sourceFile . view (_FileReference . _1) + +instance (YesodMail UniWorX, YesodPersistBackend UniWorX ~ SqlBackend) => ToMailPart UniWorX FileReference where + toMailPart = toMailPart <=< liftHandler . runDBRead . withReaderT projectBackend . toPureFile . sourceFile' + + respondFileConditional :: (MonadThrow m, MonadHandler m, HandlerSite m ~ UniWorX, YesodPersistBackend UniWorX ~ SqlBackend, YesodPersistRunner UniWorX) => Maybe UTCTime -> MimeType -> FileReference diff --git a/src/Handler/Utils/Form.hs b/src/Handler/Utils/Form.hs index 5929ad04f..bb5903487 100644 --- a/src/Handler/Utils/Form.hs +++ b/src/Handler/Utils/Form.hs @@ -916,7 +916,7 @@ genericFileField mkOpts = Field{..} | otherwise = True - getIdent :: forall m'. (MonadHandler m', RenderRoute (HandlerSite m')) => FileField FileReference -> m' (Maybe Text) + getIdent :: forall m'. (MonadHandler m', Hashable (Route (HandlerSite m'))) => FileField FileReference -> m' (Maybe Text) getIdent FileField{..} = do ident <- case fieldIdent of Just ident -> return $ Just ident @@ -997,15 +997,20 @@ genericFileField mkOpts = Field{..} = not (permittedExtension opts fName) && (not doUnpack || ((/=) `on` simpleContentType) (mimeLookup fName) typeZip) - whenIsJust fieldMaxFileSize $ \maxSize -> forM_ files $ \fInfo -> do - fLength <- runConduit $ fileSource fInfo .| C.takeE (fromIntegral $ succ maxSize) .| C.lengthE - when (fLength > maxSize) $ do - when (is _Just mIdent) $ - liftHandler . runDB . runConduit $ - mapM_ (transPipe lift . handleFile) files - .| handleUpload opts mIdent - .| C.sinkNull - throwE . SomeMessage . MsgGenericFileFieldFileTooLarge . unpack $ fileName fInfo + whenIsJust (ignoreNothing min fieldMaxFileSize fieldMaxCumulativeSize) $ \takeSize -> + flip evalAccumT mempty . forM_ files $ \fInfo -> do + fLength <- lift . runConduit $ fileSource fInfo .| C.takeE (fromIntegral $ succ takeSize) .| C.lengthE + add $ Sum fLength + Sum cummSize <- look + when (NTop (Just cummSize) > NTop fieldMaxCumulativeSize || NTop (Just fLength) > NTop fieldMaxFileSize) $ do + when (is _Just mIdent) $ + lift . liftHandler . runDB . runConduit $ + mapM_ (transPipe lift . handleFile) files + .| handleUpload opts mIdent + .| C.sinkNull + when (NTop (Just fLength) > NTop fieldMaxFileSize) $ do + lift . throwE . SomeMessage . MsgGenericFileFieldFileTooLarge . unpack $ fileName fInfo + lift . throwE $ SomeMessage MsgGenericFileFieldCumulativeTooLarge if | invExt : _ <- filter invalidUploadExtension uploadedFilenames -> do @@ -1124,7 +1129,7 @@ fileFieldMultiple = genericFileField $ return FileField , fieldMultiple = True , fieldRestrictExtensions = Nothing , fieldAdditionalFiles = _FileReferenceFileReferenceTitleMap # Map.empty - , fieldMaxFileSize = Nothing + , fieldMaxFileSize = Nothing, fieldMaxCumulativeSize = Nothing , fieldAllEmptyOk = True } @@ -1144,7 +1149,7 @@ singleFileField prev = genericFileField $ do [ (fileReferenceTitle, (fileReferenceContent, fileReferenceModified, FileFieldUserOption False True)) | FileReference{..} <- Set.toList permitted ] - , fieldMaxFileSize = Nothing + , fieldMaxFileSize = Nothing, fieldMaxCumulativeSize = Nothing , fieldAllEmptyOk = True } @@ -1160,7 +1165,7 @@ specificFileField UploadSpecificFile{..} mPrev = convertField (.| fixupFileTitle [ (fileReferenceTitle, (fileReferenceContent, fileReferenceModified, FileFieldUserOption False True)) | FileReference{..} <- Set.toList previous ] - , fieldMaxFileSize = specificFileMaxSize + , fieldMaxFileSize = specificFileMaxSize, fieldMaxCumulativeSize = Nothing , fieldAllEmptyOk = specificFileEmptyOk } where @@ -1188,7 +1193,7 @@ zipFileField' doUnpack permittedExtensions emptyOk mPrev = genericFileField $ do [ (fileReferenceTitle, (fileReferenceContent, fileReferenceModified, FileFieldUserOption False True)) | FileReference{..} <- Set.toList previous ] - , fieldMaxFileSize = Nothing + , fieldMaxFileSize = Nothing, fieldMaxCumulativeSize = Nothing , fieldAllEmptyOk = emptyOk } @@ -1231,7 +1236,7 @@ multiFileField mkPermitted = genericFileField $ mkField <$> mkPermitted [ (fileReferenceTitle, (fileReferenceContent, fileReferenceModified, FileFieldUserOption False True)) | FileReference{..} <- Set.toList permitted ] - , fieldMaxFileSize = Nothing + , fieldMaxFileSize = Nothing, fieldMaxCumulativeSize = Nothing , fieldAllEmptyOk = True } @@ -2119,10 +2124,18 @@ csvOptionsForm :: forall m. , HandlerSite m ~ UniWorX ) => Maybe CsvOptions + -> Set ExamOfficeLabelName -> AForm m CsvOptions -csvOptionsForm mPrev = hoistAForm liftHandler $ CsvOptions +csvOptionsForm mPrev (Set.toList -> exportLabels) = hoistAForm liftHandler $ CsvOptions <$> csvFormatOptionsForm (fslI MsgCsvFormatOptions & setTooltip MsgCsvOptionsTip) (csvFormat <$> mPrev) <*> apopt checkBoxField (fslI MsgCsvTimestamp & setTooltip MsgCsvTimestampTip) (csvTimestamp <$> mPrev) + <*> bool (aopt (selectField $ return exportLabelOptions) (fslI MsgCsvExportLabel & setTooltip MsgCsvExportLabelTip) (csvExportLabel <$> mPrev)) (pure Nothing) (null exportLabels) + where + exportLabelOptions = mkOptionList $ exportLabels <&> \exportLabel -> Option + { optionDisplay = exportLabel + , optionInternalValue = exportLabel + , optionExternalValue = exportLabel + } courseSelectForm :: forall ident handler. diff --git a/src/Handler/Utils/Form/MassInput.hs b/src/Handler/Utils/Form/MassInput.hs index 9a41b3b30..f7261f0cf 100644 --- a/src/Handler/Utils/Form/MassInput.hs +++ b/src/Handler/Utils/Form/MassInput.hs @@ -303,7 +303,7 @@ massInput MassInput{ miIdent = toPathPiece -> miIdent, ..} FieldSettings{..} fvR shapeName :: MassInputFieldName (BoxCoord liveliness) shapeName = MassInputShape{..} shapeField :: Field handler (Map (BoxCoord liveliness) cellData) - shapeField = secretJsonField + shapeField = hoistField liftHandler secretJsonField sentShape <- runMaybeT $ do ts <- fromMaybe [] . Map.lookup (toPathPiece shapeName) <$> MaybeT askParams fs <- fromMaybe [] . Map.lookup (toPathPiece shapeName) <$> MaybeT askFiles diff --git a/src/Handler/Utils/Random.hs b/src/Handler/Utils/Random.hs new file mode 100644 index 000000000..6821be9c7 --- /dev/null +++ b/src/Handler/Utils/Random.hs @@ -0,0 +1,66 @@ +module Handler.Utils.Random + ( secretBoxCSPRNGT, secretBoxCSPRNGPure + , secretBoxCSPRNG' + ) where + +import Import.NoModel + +import qualified Crypto.MAC.KMAC as Crypto +import qualified Crypto.Saltine.Class as Saltine +import Crypto.Hash.Algorithms (SHAKE256) +import Data.ByteArray (ByteArrayAccess) +import qualified Data.ByteArray as BA + +import qualified Crypto.Random as Crypto +import Crypto.Error (onCryptoFailure) + +import Control.Monad.Random.Lazy (RandT, Rand, evalRandT) + + +secretBoxCSPRNG' :: forall m m' string ba chunk a. + ( MonadSecretBox m + , MonadThrow m + , Monad m' + , ByteArrayAccess string + , ByteArrayAccess chunk + , LazySequence ba chunk + ) + => (forall b. m' b -> m b) + -> string -- ^ Customization string + -> ba -- ^ Seed + -> RandT ChaChaDRG m' a + -> m a +secretBoxCSPRNG' nat str seed act = do + sBoxKey <- secretBoxKey + let seed' = toDigest $ kmaclazy str (Saltine.encode sBoxKey) seed + where toDigest :: Crypto.KMAC (SHAKE256 320) -> ByteString + toDigest = BA.convert + csprng <- fmap Crypto.drgNewSeed . onCryptoFailure throwM return $ Crypto.seedFromBinary seed' + + nat $ evalRandT act csprng + +secretBoxCSPRNGT :: forall m string ba chunk a. + ( MonadSecretBox m + , MonadThrow m + , ByteArrayAccess string + , ByteArrayAccess chunk + , LazySequence ba chunk + ) + => string -- ^ Customization string + -> ba -- ^ Seed + -> RandT ChaChaDRG m a + -> m a +secretBoxCSPRNGT = secretBoxCSPRNG' id + +secretBoxCSPRNGPure :: forall m string ba chunk a. + ( MonadSecretBox m + , MonadThrow m + , ByteArrayAccess string + , ByteArrayAccess chunk + , LazySequence ba chunk + ) + => string -- ^ Customization string + -> ba -- ^ Seed + -> Rand ChaChaDRG a + -> m a +secretBoxCSPRNGPure = secretBoxCSPRNG' generalize diff --git a/src/Handler/Utils/Table/Columns.hs b/src/Handler/Utils/Table/Columns.hs index 926c168d8..538c20e3a 100644 --- a/src/Handler/Utils/Table/Columns.hs +++ b/src/Handler/Utils/Table/Columns.hs @@ -248,6 +248,15 @@ colExamFinishedOffice resultFinished = Colonnade.singleton (fromSortable header) sortExamFinished :: OpticSortColumn (Maybe UTCTime) sortExamFinished queryFinished = singletonMap "exam-finished" . SortColumn $ view queryFinished +colExamLabel :: OpticColonnade (Maybe ExamOfficeLabelName) +colExamLabel resultLabel = Colonnade.singleton (fromSortable header) body + where + header = Sortable (Just "exam-label") (i18nCell MsgTableExamLabel) + body = views resultLabel $ maybe mempty i18nCell + +sortExamLabel :: OpticSortColumn (Maybe ExamOfficeLabelName) +sortExamLabel queryLabel = singletonMap "exam-label" . SortColumn $ view queryLabel + --------------------- -- Exam occurences -- --------------------- diff --git a/src/Handler/Utils/Table/Pagination.hs b/src/Handler/Utils/Table/Pagination.hs index 341188d9b..9d5d8110f 100644 --- a/src/Handler/Utils/Table/Pagination.hs +++ b/src/Handler/Utils/Table/Pagination.hs @@ -987,7 +987,7 @@ addPIHiddenField DBTable{ dbtIdent } pi form fragment addPreviousHiddenField :: (ToJSON k', MonadHandler m, HandlerSite m ~ UniWorX) => DBTable m' x -> [k'] -> (Html -> MForm m a) -> (Html -> MForm m a) addPreviousHiddenField DBTable{ dbtIdent } pKeys form fragment = do - encrypted <- encodedSecretBox SecretBoxShort pKeys + encrypted <- liftHandler $ encodedSecretBox SecretBoxShort pKeys form $ fragment <> [shamlet| $newline never diff --git a/src/Handler/Utils/Users.hs b/src/Handler/Utils/Users.hs index f851d4fc9..06b3c80ac 100644 --- a/src/Handler/Utils/Users.hs +++ b/src/Handler/Utils/Users.hs @@ -45,10 +45,16 @@ computeUserAuthenticationDigest = hashlazy . JSON.encode data GuessUserInfo - = GuessUserMatrikelnummer { guessUserMatrikelnummer :: UserMatriculation } - | GuessUserDisplayName { guessUserDisplayName :: UserDisplayName } - | GuessUserSurname { guessUserSurname :: UserSurname } - | GuessUserFirstName { guessUserFirstName :: UserFirstName } + = GuessUserMatrikelnummer + { guessUserMatrikelnummer :: UserMatriculation } + | GuessUserEduPersonPrincipalName + { guessUserEduPersonPrincipalName :: UserEduPersonPrincipalName } + | GuessUserDisplayName + { guessUserDisplayName :: UserDisplayName } + | GuessUserSurname + { guessUserSurname :: UserSurname } + | GuessUserFirstName + { guessUserFirstName :: UserFirstName } deriving (Eq, Ord, Read, Show, Generic, Typeable) instance Binary GuessUserInfo @@ -93,10 +99,11 @@ guessUser (((Set.toList . toNullable) <$>) . Set.toList . dnfTerms -> criteria) containsAsSet x y = E.and . map (\y' -> x `E.hasInfix` E.val y') $ asWords y toSql user pl = bool id E.not_ (is _PLNegated pl) $ case pl ^. _plVar of - GuessUserMatrikelnummer userMatriculation' -> user E.^. UserMatrikelnummer E.==. E.val (Just userMatriculation') - GuessUserDisplayName userDisplayName' -> user E.^. UserDisplayName `containsAsSet` userDisplayName' - GuessUserSurname userSurname' -> user E.^. UserSurname `containsAsSet` userSurname' - GuessUserFirstName userFirstName' -> user E.^. UserFirstName `containsAsSet` userFirstName' + GuessUserMatrikelnummer userMatriculation' -> user E.^. UserMatrikelnummer E.==. E.val (Just userMatriculation') + GuessUserEduPersonPrincipalName userEPPN' -> user E.^. UserLdapPrimaryKey E.==. E.val (Just userEPPN') + GuessUserDisplayName userDisplayName' -> user E.^. UserDisplayName `containsAsSet` userDisplayName' + GuessUserSurname userSurname' -> user E.^. UserSurname `containsAsSet` userSurname' + GuessUserFirstName userFirstName' -> user E.^. UserFirstName `containsAsSet` userFirstName' go didLdap = do let retrieveUsers = E.select . E.from $ \user -> do diff --git a/src/Import/NoModel.hs b/src/Import/NoModel.hs index ad0ac8f97..16c566181 100644 --- a/src/Import/NoModel.hs +++ b/src/Import/NoModel.hs @@ -39,6 +39,13 @@ import Yesod.Auth as Import hiding (requireAuth, requireAuthId, requ import Yesod.Core.Types as Import (loggerSet) import Yesod.Default.Config2 as Import import Yesod.Core.Types.Instances as Import +import Yesod.Servant as Import + hiding ( MonadHandler(..), HasRoute(..), MonadRequest(..) + , runDB, defaultRunDB + ) +import Servant.Docs as Import + ( ToSample(..), samples, noSamples, singleSample + ) import Utils as Import import Utils.Frontend.I18n as Import @@ -118,6 +125,11 @@ import Control.Monad.Trans.State as Import ( State, runState, mapState, withState , StateT(..), mapStateT, withStateT ) +import Control.Monad.Trans.Accum as Import + ( Accum, runAccum, mapAccum + , AccumT, runAccumT, execAccumT, evalAccumT, mapAccumT + , look, looks, add + ) import Control.Monad.State.Class as Import (MonadState(state)) import Control.Monad.Trans.Writer.Lazy as Import ( Writer, runWriter, mapWriter, execWriter @@ -177,6 +189,7 @@ import Database.Esqueleto.Instances as Import () import Numeric.Natural.Instances as Import () import Text.Blaze.Instances as Import () import Jose.Jwt.Instances as Import () +import Jose.Jwk.Instances as Import () import Web.PathPieces.Instances as Import () import Data.Universe.Instances.Reverse.MonoTraversable () import Data.Universe.Instances.Reverse.WithIndex () @@ -194,6 +207,12 @@ import Prometheus.Instances as Import () import Yesod.Form.Fields.Instances as Import () import Yesod.Form.Types.Instances as Import () import Data.MonoTraversable.Instances as Import () +import Servant.Client.Core.BaseUrl.Instances as Import () +import Control.Monad.Trans.Except.Instances as Import () +import Servant.Server.Instances as Import () +import Servant.Docs.Internal.Pretty.Instances as Import () +import Network.URI.Instances as Import () +import Data.HashSet.Instances as Import () import Web.Cookie.Instances as Import () import Network.HTTP.Types.Method.Instances as Import () import Crypto.Random.Instances as Import () @@ -205,9 +224,10 @@ import Database.Persist.Sql.Types.Instances as Import () import Control.Monad.Catch.Instances as Import () import Text.Shakespeare.Text.Instances as Import () import Ldap.Client.Instances as Import () -import Network.URI.Instances as Import () import Data.MultiSet.Instances as Import () import Control.Arrow.Instances as Import () +import Data.SemVer.Instances as Import () +import Control.Monad.Trans.Random.Instances as Import () import Crypto.Hash as Import (Digest, SHA3_256, SHA3_512) import Crypto.Random as Import (ChaChaDRG, Seed) diff --git a/src/Import/Servant.hs b/src/Import/Servant.hs new file mode 100644 index 000000000..05160ee18 --- /dev/null +++ b/src/Import/Servant.hs @@ -0,0 +1,9 @@ +module Import.Servant + ( module Import + ) where + +import Foundation as Import + hiding ( Handler + ) +import Foundation.Servant as Import +import Import.Servant.NoFoundation as Import diff --git a/src/Import/Servant/NoFoundation.hs b/src/Import/Servant/NoFoundation.hs new file mode 100644 index 000000000..c9b4e06c6 --- /dev/null +++ b/src/Import/Servant/NoFoundation.hs @@ -0,0 +1,46 @@ +module Import.Servant.NoFoundation + ( module Import + ) where + +import Import.NoFoundation as Import hiding + ( Context + , Authorized, Unauthorized + , ServerError + , Header + , Strict + , Headers + , addHeader + , runDB, defaultRunDB + , MonadHandler(..), HasRoute(..), liftHandler + , encrypt, decrypt + , Unique, Fragment(..), respond + , getRequest + ) + +import Yesod.Servant as Import +import Foundation.Servant.Types as Import + +import Foundation.Type as Import + +import Servant.API as Import +import Servant.API.Modifiers as Import +import Servant.Server as Import +import Servant.Docs as Import + ( ToCapture(..), DocCapture(..) + , ToParam(..), DocQueryParam(..), ParamKind + ) +import Servant.Docs.Internal.Pretty as Import (PrettyJSON) +import Data.Swagger as Import (SwaggerType(..), Referenced(..)) +import Data.Swagger.Schema as Import hiding (SchemaOptions(..)) +import Data.Swagger.Internal.Schema as Import (named) +import Data.Swagger.Lens as Import hiding + ( host, port, get, put, delete, allOf + , format, minLength, maxLength + ) + +import Servant.API.Generic as Import +import Servant.Server.Generic as Import + +import Data.CryptoID.Class.ImplicitNamespace as Import (encrypt, decrypt) + +import Control.Monad.Error.Class as Import (MonadError(..)) diff --git a/src/Jobs.hs b/src/Jobs.hs index 43395c8c7..fccffc236 100644 --- a/src/Jobs.hs +++ b/src/Jobs.hs @@ -71,6 +71,7 @@ import Jobs.Handler.SynchroniseLdap import Jobs.Handler.PruneInvitations import Jobs.Handler.ChangeUserDisplayEmail import Jobs.Handler.Files +import Jobs.Handler.ExternalApis import Jobs.Handler.PersonalisedSheetFiles import Jobs.Handler.PruneOldSentMails import Jobs.Handler.StudyFeatures diff --git a/src/Jobs/Crontab.hs b/src/Jobs/Crontab.hs index cba80a825..a8c0be52a 100644 --- a/src/Jobs/Crontab.hs +++ b/src/Jobs/Crontab.hs @@ -610,6 +610,7 @@ determineCrontab = execWriterT $ do , cronNotAfter = maybe (Right CronNotScheduled) (Right . CronTimestamp . utcToLocalTimeTZ appTZ) $ nBot =<< minimumOf (folded . _entityVal . _allocationStaffAllocationTo . to NTop . filtered (> NTop (Just registerTo))) allocs } + hasRelevanceUncached <- lift $ exists [StudyFeaturesRelevanceCached ==. Nothing] when hasRelevanceUncached . tell $ HashMap.singleton (JobCtlQueue JobStudyFeaturesCacheRelevance) @@ -619,3 +620,16 @@ determineCrontab = execWriterT $ do , cronRateLimit = nominalDay , cronNotAfter = Right CronNotScheduled } + + + let externalApiJobs (Entity jExternalApi ExternalApi{..}) = + tell $ HashMap.singleton + (JobCtlQueue JobExternalApiExpire{..}) + Cron + { cronInitial = CronTimestamp . utcToLocalTimeTZ appTZ $ addUTCTime appExternalApisExpiry externalApiLastAlive + , cronRepeat = CronRepeatOnChange + , cronRateLimit = appExternalApisExpiry + , cronNotAfter = Right CronNotScheduled + } + + runConduit $ transPipe lift (selectSource [] []) .| C.mapM_ externalApiJobs diff --git a/src/Jobs/Handler/ExternalApis.hs b/src/Jobs/Handler/ExternalApis.hs new file mode 100644 index 000000000..8d5e9fa71 --- /dev/null +++ b/src/Jobs/Handler/ExternalApis.hs @@ -0,0 +1,15 @@ +module Jobs.Handler.ExternalApis + ( dispatchJobExternalApiExpire + ) where + +import Import + + +dispatchJobExternalApiExpire :: ExternalApiId -> JobHandler UniWorX +dispatchJobExternalApiExpire apiId = JobHandlerAtomic $ do + now <- liftIO getCurrentTime + expiry <- getsYesod $ view _appExternalApisExpiry + void . runMaybeT $ do + ExternalApi{..} <- MaybeT $ get apiId + guard $ externalApiLastAlive <= addUTCTime (- expiry) now + lift $ delete apiId diff --git a/src/Jobs/Handler/Files.hs b/src/Jobs/Handler/Files.hs index 2e5588a81..a870f3fa5 100644 --- a/src/Jobs/Handler/Files.hs +++ b/src/Jobs/Handler/Files.hs @@ -46,6 +46,9 @@ import qualified Data.Foldable as F import qualified Control.Monad.State.Class as State +import Jobs.Types +import Data.Aeson.Lens (_JSON) + dispatchJobPruneSessionFiles :: JobHandler UniWorX dispatchJobPruneSessionFiles = JobHandlerAtomicWithFinalizer act fin @@ -76,6 +79,8 @@ fileReferences fHash'@(E.just -> fHash) E.where_ $ fileContentChunk E.^. FileContentChunkHash E.==. chunkLock E.^. FileChunkLockHash ] +jobFileReferences :: MonadResource m => ConduitT () FileContentReference (SqlPersistT m) () +jobFileReferences = E.selectSource (E.from $ pure . (E.^. QueuedJobContent)) .| C.mapMaybe (preview _JSON . E.unValue) .| awaitForever (mapMOf_ (typesCustom @JobChildren @Job @Job @FileContentReference @FileContentReference) yield) dispatchJobDetectMissingFiles :: JobHandler UniWorX dispatchJobDetectMissingFiles = JobHandlerAtomicDeferrableWithFinalizer act fin @@ -96,6 +101,9 @@ dispatchJobDetectMissingFiles = JobHandlerAtomicDeferrableWithFinalizer act fin E.distinctOnOrderBy [E.asc ref] $ return ref transPipe lift (E.selectSource fileReferencesQuery) .| C.mapMaybe E.unValue .| C.mapM_ (insertRef refKind) + let useRefSource refKind refSource = transPipe (lift . withReaderT projectBackend) (refSource .| C.filterM (\ref -> not <$> exists [FileContentEntryHash ==. ref])) .| C.mapM_ (insertRef refKind) + useRefSource (nameToPathPiece ''Job) jobFileReferences + let allMissingDb :: Set Minio.Object allMissingDb = setOf (folded . folded . re minioFileReference) missingDb filterMissingDb :: forall m. Monad m @@ -193,6 +201,16 @@ dispatchJobPruneUnreferencedFiles numIterations epoch iteration = JobHandlerAtom E.where_ $ fileContentEntry E.^. FileContentEntryChunkHash E.==. unreferencedChunkHash return $ E.any E.exists (fileReferences $ fileContentEntry E.^. FileContentEntryHash) E.where_ $ chunkIdFilter unreferencedChunkHash + + let unmarkSourceFiles (otoList -> fRefs) = E.delete . E.from $ \fileContentChunkUnreferenced -> do + let unreferencedChunkHash = E.unKey $ fileContentChunkUnreferenced E.^. FileContentChunkUnreferencedHash + E.where_ . E.subSelectOr . E.from $ \fileContentEntry -> do + E.where_ $ fileContentEntry E.^. FileContentEntryChunkHash E.==. unreferencedChunkHash + return $ fileContentEntry E.^. FileContentEntryHash `E.in_` E.valList fRefs + E.where_ $ chunkIdFilter unreferencedChunkHash + unmarkRefSource refSource = runConduit $ refSource .| C.map Seq.singleton .| C.chunksOfE chunkSize .| C.mapM_ unmarkSourceFiles + chunkSize = 100 + unmarkRefSource jobFileReferences let getEntryCandidates = E.selectSource . E.from $ \fileContentEntry -> do diff --git a/src/Jobs/Handler/SendCourseCommunication.hs b/src/Jobs/Handler/SendCourseCommunication.hs index 712fd4beb..7a3433645 100644 --- a/src/Jobs/Handler/SendCourseCommunication.hs +++ b/src/Jobs/Handler/SendCourseCommunication.hs @@ -20,10 +20,9 @@ dispatchJobSendCourseCommunication :: Either UserEmail UserId -> CourseId -> UserId -> UUID - -> Maybe Text - -> Html + -> CommunicationContent -> JobHandler UniWorX -dispatchJobSendCourseCommunication jRecipientEmail jAllRecipientAddresses jCourse jSender jMailObjectUUID jSubject jMailContent = JobHandlerException $ do +dispatchJobSendCourseCommunication jRecipientEmail jAllRecipientAddresses jCourse jSender jMailObjectUUID CommunicationContent{..} = JobHandlerException $ do (sender, Course{..}) <- runDB $ (,) <$> getJust jSender <*> getJust jCourse @@ -34,8 +33,9 @@ dispatchJobSendCourseCommunication jRecipientEmail jAllRecipientAddresses jCours _mailFrom .= userAddressFrom sender addMailHeader "Cc" [st|#{mr MsgCommUndisclosedRecipients}:;|] addMailHeader "Auto-Submitted" "no" - setSubjectI . prependCourseTitle courseTerm courseSchool courseShorthand $ maybe (SomeMessage MsgCommCourseSubject) SomeMessage jSubject + setSubjectI . prependCourseTitle courseTerm courseSchool courseShorthand $ maybe (SomeMessage MsgCommCourseSubject) SomeMessage ccSubject addHtmlMarkdownAlternatives ($(ihamletFile "templates/mail/courseCommunication.hamlet") :: HtmlUrlI18n UniWorXMessage (Route UniWorX)) + forM_ ccAttachments $ addPart' . toMailPart when (jRecipientEmail == Right jSender) $ addPart' $ do partIsAttachmentCsv MsgCommAllRecipients diff --git a/src/Jobs/Types.hs b/src/Jobs/Types.hs index a28f342f2..f62bbd73f 100644 --- a/src/Jobs/Types.hs +++ b/src/Jobs/Types.hs @@ -44,7 +44,7 @@ import Cron (CronNextMatch(..), _MatchAsap, _MatchAt, _MatchNone) import System.Clock (getTime, Clock(Monotonic), TimeSpec) import GHC.Conc (unsafeIOToSTM) -import Data.Generics.Product.Types (Children, ChGeneric) +import Data.Generics.Product.Types (Children, ChGeneric, HasTypesCustom(..)) {-# ANN module ("HLint: ignore Use newtype instead of data" :: String) #-} @@ -67,8 +67,7 @@ data Job , jCourse :: CourseId , jSender :: UserId , jMailObjectUUID :: UUID - , jSubject :: Maybe Text - , jMailContent :: Html + , jMailContent :: CommunicationContent } | JobInvitation { jInviter :: Maybe UserId , jInvitee :: UserEmail @@ -95,6 +94,8 @@ data Job , jEpoch , jIteration :: Natural } + | JobExternalApiExpire { jExternalApi :: ExternalApiId + } | JobInjectFiles | JobPruneFallbackPersonalisedSheetFilesKeys | JobRechunkFiles @@ -178,10 +179,14 @@ type family ChildrenJobChildren a where ChildrenJobChildren UUID = '[] ChildrenJobChildren (Key a) = '[] ChildrenJobChildren (CI a) = '[] - ChildrenJobChildren (Set a) = '[] + ChildrenJobChildren (Set v) = '[v] ChildrenJobChildren MailContext = '[] + ChildrenJobChildren (Digest a) = '[] ChildrenJobChildren a = Children ChGeneric a + +instance (Ord b', HasTypesCustom JobChildren a' b' a b) => HasTypesCustom JobChildren (Set a') (Set b') a b where + typesCustom = iso Set.toList Set.fromList . traverse . typesCustom @JobChildren classifyJob :: Job -> String diff --git a/src/Jose/Jwk/Instances.hs b/src/Jose/Jwk/Instances.hs new file mode 100644 index 000000000..e3782d506 --- /dev/null +++ b/src/Jose/Jwk/Instances.hs @@ -0,0 +1,73 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Jose.Jwk.Instances + () where + +import ClassyPrelude + +import Model.Types.TH.JSON + +import Jose.Jwk +import Jose.Jwt +import Jose.Jwa +import Crypto.PubKey.ECC.Types +import Crypto.PubKey.ECC.ECDSA + +import Data.Swagger.Schema (ToSchema(..)) +import Data.Swagger.Internal.Schema (named) + +import Servant.Docs (ToSample(..)) + +import Crypto.Random + + +deriving instance Generic EcCurve +deriving anyclass instance NFData EcCurve +deriving instance Generic CurveCommon +deriving anyclass instance NFData CurveCommon +deriving instance Generic CurvePrime +deriving anyclass instance NFData CurvePrime +deriving instance Generic Curve +deriving anyclass instance NFData Curve +deriving instance Generic PublicKey +deriving anyclass instance NFData PublicKey +deriving instance Generic JweAlg +deriving anyclass instance NFData JweAlg +deriving instance Generic JwsAlg +deriving anyclass instance NFData JwsAlg +deriving instance Generic Alg +deriving anyclass instance NFData Alg +deriving instance Generic KeyUse +deriving anyclass instance NFData KeyUse +deriving instance Generic KeyId +deriving anyclass instance NFData KeyId +deriving instance Generic KeyPair +deriving anyclass instance NFData KeyPair +deriving instance Generic Jwk +deriving anyclass instance NFData Jwk + + +derivePersistFieldJSON ''JwkSet + +deriving anyclass instance NFData JwkSet + +instance ToSchema Jwk where + declareNamedSchema _ = pure $ named "Jwk" mempty + +instance ToSchema JwkSet + + +sampleNotRandom :: MonadPseudoRandom ChaChaDRG a -> a +sampleNotRandom = fst . withDRG (drgNewSeed $ seedFromInteger 0) + +instance ToSample JwkSet where + toSamples _ = [ ("Symmetric key", JwkSet [symmKey]) + , ("Asymmetric keyset", JwkSet [rsaPub, rsaPriv]) + , ("Symmetric & asymmetric keysets", JwkSet [symmKey, rsaPub, rsaPriv]) + ] + where + symmKey = sampleNotRandom $ + generateSymmetricKey 8 (KeyId "sample") Enc Nothing + + (rsaPub, rsaPriv) = sampleNotRandom $ + generateRsaKeyPair 128 (KeyId "sample RSA") Enc Nothing diff --git a/src/Jose/Jwt/Instances.hs b/src/Jose/Jwt/Instances.hs index 0c0c093ef..5b8818238 100644 --- a/src/Jose/Jwt/Instances.hs +++ b/src/Jose/Jwt/Instances.hs @@ -5,6 +5,7 @@ module Jose.Jwt.Instances ) where import ClassyPrelude.Yesod +import Model.Types.TH.PathPiece import Jose.Jwt @@ -13,6 +14,7 @@ deriving instance Ord Jwt deriving instance Read Jwt deriving instance Generic Jwt deriving instance Typeable Jwt +deriving anyclass instance NFData Jwt instance PathPiece Jwt where toPathPiece (Jwt bytes) = decodeUtf8 bytes @@ -20,6 +22,8 @@ instance PathPiece Jwt where instance Hashable Jwt +derivePersistFieldPathPiece ''Jwt + deriving instance Generic JwtError deriving instance Typeable JwtError diff --git a/src/Mail.hs b/src/Mail.hs index f32a66a1f..b6df33b05 100644 --- a/src/Mail.hs +++ b/src/Mail.hs @@ -42,6 +42,7 @@ import Data.Kind (Type) import Model.Types.Languages import Model.Types.Csv +import Model.Types.File import Network.Mail.Mime hiding (addPart, addAttachment) import qualified Network.Mail.Mime as Mime (addPart) @@ -90,7 +91,7 @@ import qualified Data.Binary as Binary import "network-bsd" Network.BSD (getHostName) import Data.Time.Zones (utcTZ, utcToLocalTimeTZ, timeZoneForUTCTime) -import Data.Time.LocalTime (ZonedTime(..), TimeZone(..)) +import Data.Time.LocalTime (ZonedTime(..), TimeZone(..), utcToZonedTime, utc) import Data.Time.Format (rfc822DateFormat) import Network.HaskellNet.SMTP (SMTPConnection) @@ -124,6 +125,12 @@ import Language.Haskell.TH (nameBase) import Network.Mail.Mime.Instances() +import Data.Char (isLatin1) +import Data.Text.Lazy.Encoding (decodeUtf8') +import System.FilePath (takeFileName) +import Network.HTTP.Types.Header (hETag) +import Web.HttpApiData (ToHttpApiData(toHeader)) + makeLenses_ ''Address makeLenses_ ''Mail @@ -379,6 +386,20 @@ instance YesodMail site => ToMailPart site Html where _partEncoding .= QuotedPrintableText _partContent .= PartContent (renderMarkup html) +instance YesodMail site => ToMailPart site PureFile where + toMailPart file@File{fileTitle, fileModified} = do + _partDisposition .= AttachmentDisposition (pack $ takeFileName fileTitle) + _partType .= decodeUtf8 (mimeLookup $ pack fileTitle) + let + content :: LBS.ByteString + content = file ^. _pureFileContent . _Just + isLatin = either (const False) (all isLatin1) $ decodeUtf8' content + _partEncoding .= bool Base64 QuotedPrintableText isLatin + _partContent .= PartContent content + forM_ (file ^. _FileReference . _1 . _fileReferenceContent) $ \fRefContent -> + replaceMailHeader (CI.original hETag) . Just . decodeUtf8 . toHeader $ etagFileReference # fRefContent + replaceMailHeader (CI.original hLastModified) . Just . pack . formatTime defaultTimeLocale rfc822DateFormat $ utcToZonedTime utc fileModified + instance (ToMailPart site a, RenderMessage site msg) => ToMailPart site (Hamlet.Translate msg -> a) where type MailPartReturn site (Hamlet.Translate msg -> a) = MailPartReturn site a toMailPart act = do diff --git a/src/Model.hs b/src/Model.hs index 17d96d08c..f94678455 100644 --- a/src/Model.hs +++ b/src/Model.hs @@ -49,6 +49,9 @@ deriving newtype instance FromJSONKey UserId deriving newtype instance ToJSONKey ExamOccurrenceId deriving newtype instance FromJSONKey ExamOccurrenceId +deriving newtype instance ToSample UserId +deriving newtype instance ToSample ExternalApiId + -- required Show instances for use of getByJust deriving instance Show (Unique ExamPart) deriving instance Show (Unique QualificationUser) diff --git a/src/Model/Tokens/Bearer.hs b/src/Model/Tokens/Bearer.hs index 09849ecb6..f5c4f4913 100644 --- a/src/Model/Tokens/Bearer.hs +++ b/src/Model/Tokens/Bearer.hs @@ -10,7 +10,8 @@ module Model.Tokens.Bearer import ClassyPrelude.Yesod import Yesod.Core.Instances () - +import Yesod.Servant (MonadSite(..)) + import Model import Model.Tokens.Lens import Utils (assertM', foldMapM) @@ -117,17 +118,16 @@ bearerRestrict :: (ToJSON a, Hashable (Route site), Eq (Route site)) => Route si bearerRestrict route (toJSON -> resVal) = over _bearerRestrictions $ HashMap.insert route resVal - -bearerToJSON :: forall m. - ( MonadHandler m - , HasCryptoUUID (AuthId (HandlerSite m)) m - , RenderRoute (HandlerSite m) - ) => BearerToken (HandlerSite m) -> m Value +bearerToJSON :: forall site m. + ( MonadSite site m + , HasCryptoUUID (AuthId site) m + , RenderRoute site + ) => BearerToken site -> m Value -- ^ Encode a `BearerToken` analogously to `toJSON` -- -- Monadic context is needed because `AuthId`s are encrypted during encoding bearerToJSON BearerToken{..} = do - cID <- foldMapM (fmap HashSet.singleton . either (return . Left) (fmap Right . I.encrypt)) bearerAuthority :: m (HashSet (Either Value (CryptoUUID (AuthId (HandlerSite m))))) + cID <- foldMapM (fmap HashSet.singleton . either (return . Left) (fmap Right . I.encrypt)) bearerAuthority :: m (HashSet (Either Value (CryptoUUID (AuthId site)))) let stdPayload = Jose.JwtClaims { jwtIss = Just $ toPathPiece bearerIssuedBy , jwtSub = Nothing @@ -140,7 +140,7 @@ bearerToJSON BearerToken{..} = do authorityToJSON auths | [auth] <- otoList auths = either toJSON toJSON auth | otherwise = toJSON $ HashSet.map (either toJSON toJSON) auths - iCID <- traverse I.encrypt bearerImpersonate :: m (Maybe (CryptoUUID (AuthId (HandlerSite m)))) + iCID <- traverse I.encrypt bearerImpersonate :: m (Maybe (CryptoUUID (AuthId site))) return . JSON.object $ catMaybes [ Just $ "authority" .= authorityToJSON cID diff --git a/src/Model/Types.hs b/src/Model/Types.hs index ca97381a2..3dfb4bb7d 100644 --- a/src/Model/Types.hs +++ b/src/Model/Types.hs @@ -6,6 +6,7 @@ import Model.Types.Common as Types import Model.Types.Course as Types import Model.Types.DateTime as Types import Model.Types.Exam as Types +import Model.Types.ExamOffice as Types import Model.Types.Health as Types import Model.Types.Mail as Types import Model.Types.Security as Types @@ -15,6 +16,7 @@ import Model.Types.Misc as Types import Model.Types.School as Types import Model.Types.Allocation as Types import Model.Types.Languages as Types +import Model.Types.Apis as Types import Model.Types.File as Types import Model.Types.User as Types import Model.Types.Changelog as Types @@ -23,3 +25,5 @@ import Model.Types.Room as Types import Model.Types.Csv as Types import Model.Types.Upload as Types import Model.Types.Lms as Types +import Model.Types.Communication as Types +import Model.Types.SystemMessage as Types diff --git a/src/Model/Types/Apis.hs b/src/Model/Types/Apis.hs new file mode 100644 index 000000000..4409b1af4 --- /dev/null +++ b/src/Model/Types/Apis.hs @@ -0,0 +1,61 @@ +module Model.Types.Apis + ( ExternalApiKind(..) + , ExternalApiConfig(..) + , GradelistFormatIdent + , classifyExternalApiConfig + , module Servant.Client.Core.BaseUrl + ) where + +import Import.NoModel + +import Servant.Client.Core.BaseUrl (BaseUrl(..), Scheme(..)) + +import Data.Aeson (genericToJSON, genericParseJSON) +import Data.Swagger (SwaggerType(..), ToParamSchema(..), enum_, type_, paramSchemaToSchema, ToSchema(..), fromAesonOptions, genericDeclareNamedSchema) +import Data.Swagger.Internal.Schema (named) + +import qualified Data.HashSet as HashSet + +{-# ANN module ("HLint: ignore Use newtype instead of data" :: String) #-} + + +data ExternalApiKind = EApiKindGradelistFormat + deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable) + deriving anyclass (Universe, Finite, Hashable) +nullaryPathPiece ''ExternalApiKind $ camelToPathPiece' 3 +pathPieceJSON ''ExternalApiKind +instance ToParamSchema ExternalApiKind where + toParamSchema _ = mempty + & type_ ?~ SwaggerString + & enum_ ?~ map toJSON (universeF @ExternalApiKind) +instance ToSchema ExternalApiKind where + declareNamedSchema = pure . named "ExternalApiKind" . paramSchemaToSchema +instance ToSample ExternalApiKind where + toSamples _ = samples universeF + +type GradelistFormatIdent = CI Text + +data ExternalApiConfig + = EApiGradelistFormat + { eapiGradelistFormats :: NonNull (HashSet GradelistFormatIdent) + } + deriving (Eq, Ord, Read, Show, Generic, Typeable) + deriving anyclass (NFData) +instance ToJSON ExternalApiConfig where + toJSON = genericToJSON externalApiConfigAesonOptions +instance FromJSON ExternalApiConfig where + parseJSON = genericParseJSON externalApiConfigAesonOptions +instance ToSchema ExternalApiConfig where + declareNamedSchema = genericDeclareNamedSchema $ fromAesonOptions externalApiConfigAesonOptions + +derivePersistFieldJSON ''ExternalApiConfig + +instance ToSample ExternalApiConfig where + toSamples _ = gradelistFormatters + where gradelistFormatters = samples + [ EApiGradelistFormat . impureNonNull $ HashSet.singleton "Format 1" + , EApiGradelistFormat . impureNonNull $ HashSet.fromList ["Format 1", "Format 2"] + ] + +classifyExternalApiConfig :: ExternalApiConfig -> ExternalApiKind +classifyExternalApiConfig EApiGradelistFormat{} = EApiKindGradelistFormat diff --git a/src/Model/Types/Common.hs b/src/Model/Types/Common.hs index a0b83aba5..e8c1a13b1 100644 --- a/src/Model/Types/Common.hs +++ b/src/Model/Types/Common.hs @@ -13,49 +13,53 @@ import Import.NoModel import qualified Yesod.Auth.Util.PasswordStore as PWStore -type Count = Sum Integer -type Points = Centi +type Count = Sum Integer +type Points = Centi -type Email = Text +type Email = Text -type UserTitle = Text -type UserFirstName = Text -type UserSurname = Text -type UserDisplayName = Text -type UserMatriculation = Text +type UserTitle = Text +type UserFirstName = Text +type UserSurname = Text +type UserDisplayName = Text +type UserIdent = CI Text +type UserMatriculation = Text +type UserEmail = CI Email -type StudyDegreeName = Text -type StudyDegreeShorthand = Text -type StudyDegreeKey = Int -type StudyTermsName = Text -type StudyTermsShorthand = Text -type StudyTermsKey = Int -type StudySubTermsKey = Int +type StudyDegreeName = Text +type StudyDegreeShorthand = Text +type StudyDegreeKey = Int +type StudyTermsName = Text +type StudyTermsShorthand = Text +type StudyTermsKey = Int +type StudySubTermsKey = Int -type SchoolName = CI Text -type SchoolShorthand = CI Text -type CourseName = CI Text -type CourseShorthand = CI Text -type SheetName = CI Text -type MaterialName = CI Text -type UserEmail = CI Email -type UserIdent = CI Text -type TutorialName = CI Text -type ExamName = CI Text -type ExamPartName = CI Text -type ExamOccurrenceName = CI Text -type AllocationName = CI Text -type AllocationShorthand = CI Text +type SchoolName = CI Text +type SchoolShorthand = CI Text -type SubmissionGroupName = CI Text +type CourseName = CI Text +type CourseShorthand = CI Text +type MaterialName = CI Text +type TutorialName = CI Text +type SheetName = CI Text +type SubmissionGroupName = CI Text -type PWHashAlgorithm = ByteString -> PWStore.Salt -> Int -> ByteString -type InstanceId = UUID -type ClusterId = UUID -type TokenId = UUID -type TermCandidateIncidence = UUID +type ExamName = CI Text +type ExamPartName = CI Text +type ExamOccurrenceName = CI Text -type SessionFileReference = Digest SHA3_256 +type AllocationName = CI Text +type AllocationShorthand = CI Text + +type PWHashAlgorithm = ByteString -> PWStore.Salt -> Int -> ByteString + +type InstanceId = UUID +type ClusterId = UUID +type TokenId = UUID + +type TermCandidateIncidence = UUID + +type SessionFileReference = Digest SHA3_256 type QualificationName = CI Text type QualificationShorthand = CI Text \ No newline at end of file diff --git a/src/Model/Types/Communication.hs b/src/Model/Types/Communication.hs new file mode 100644 index 000000000..b21f3e101 --- /dev/null +++ b/src/Model/Types/Communication.hs @@ -0,0 +1,21 @@ +module Model.Types.Communication + ( CommunicationContent(..), _ccSubject, _ccBody, _ccAttachments + ) where + +import Import.NoModel +import Model.Types.File + +import Utils.Lens.TH + + +data CommunicationContent = CommunicationContent + { ccSubject :: Maybe Text + , ccBody :: Html + , ccAttachments :: Set FileReference + } deriving stock (Eq, Ord, Show, Read, Generic, Typeable) + deriving anyclass (Hashable, NFData) + +deriveJSON defaultOptions + { constructorTagModifier = camelToPathPiece' 1 + } ''CommunicationContent +makeLenses_ ''CommunicationContent diff --git a/src/Model/Types/Csv.hs b/src/Model/Types/Csv.hs index 88f183de9..ca7ec802b 100644 --- a/src/Model/Types/Csv.hs +++ b/src/Model/Types/Csv.hs @@ -51,8 +51,9 @@ nullaryPathPiece ''Quoting $ \q -> if data CsvOptions = CsvOptions - { csvFormat :: CsvFormatOptions - , csvTimestamp :: Bool + { csvFormat :: CsvFormatOptions + , csvTimestamp :: Bool + , csvExportLabel :: Maybe Text } deriving (Eq, Ord, Read, Show, Generic, Typeable) deriving anyclass (Hashable, NFData) @@ -73,8 +74,9 @@ makeLenses_ ''CsvFormatOptions instance Default CsvOptions where def = CsvOptions - { csvFormat = def - , csvTimestamp = False + { csvFormat = def + , csvTimestamp = False + , csvExportLabel = Nothing } instance Default CsvFormatOptions where @@ -128,14 +130,16 @@ _CsvEncodeOptions = prism' fromEncode toEncode instance ToJSON CsvOptions where toJSON CsvOptions{..} = JSON.object - [ "format" JSON..= csvFormat - , "timestamp" JSON..= csvTimestamp + [ "format" JSON..= csvFormat + , "timestamp" JSON..= csvTimestamp + , "export-label" JSON..= csvExportLabel ] instance FromJSON CsvOptions where parseJSON = JSON.withObject "CsvOptions" $ \o -> do - csvFormat <- o JSON..:? "format" JSON..!= csvFormat def - csvTimestamp <- o JSON..:? "timestamp" JSON..!= csvTimestamp def + csvFormat <- o JSON..:? "format" JSON..!= csvFormat def + csvTimestamp <- o JSON..:? "timestamp" JSON..!= csvTimestamp def + csvExportLabel <- o JSON..:? "export-label" JSON..!= csvExportLabel def return CsvOptions{..} data CsvFormat = FormatCsv | FormatXlsx diff --git a/src/Model/Types/ExamOffice.hs b/src/Model/Types/ExamOffice.hs new file mode 100644 index 000000000..60dc51bbf --- /dev/null +++ b/src/Model/Types/ExamOffice.hs @@ -0,0 +1,8 @@ +module Model.Types.ExamOffice + ( ExamOfficeLabelName + ) where + +import Import.NoModel + + +type ExamOfficeLabelName = Text diff --git a/src/Model/Types/File.hs b/src/Model/Types/File.hs index 0a3819c28..2d26ae6ce 100644 --- a/src/Model/Types/File.hs +++ b/src/Model/Types/File.hs @@ -18,7 +18,24 @@ module Model.Types.File , _fieldIdent, _fieldUnpackZips, _fieldMultiple, _fieldRestrictExtensions, _fieldAdditionalFiles, _fieldMaxFileSize ) where -import Import.NoModel +import ClassyPrelude.Yesod hiding (snoc, (.=), getMessageRender, derivePersistFieldJSON, Proxy(..)) +import Crypto.Hash (Digest, SHA3_512) +import Language.Haskell.TH.Syntax (Lift) +import Data.Binary (Binary) +import Crypto.Hash.Instances () +import Data.Proxy (Proxy(..)) +import Control.Lens +import Utils.HttpConditional +import Data.Binary.Instances.Time () +import Data.Time.Clock.Instances () +import Data.Aeson.TH +import Utils +import Data.Kind (Type) +import Data.Universe +import Numeric.Natural +import Network.Mime +import Control.Monad.Morph +import Data.NonNull.Instances () import Database.Persist.Sql (PersistFieldSql(..)) import Web.HttpApiData (ToHttpApiData, FromHttpApiData) @@ -204,7 +221,6 @@ instance HasFileReference FileReference where instance HasFileReference PureFile where newtype FileReferenceResidual PureFile = PureFileResidual { unPureFileResidual :: Maybe ByteString } deriving (Eq, Ord, Read, Show, Generic, Typeable) - deriving newtype (ToJSON, FromJSON) deriving anyclass (NFData) _FileReference = iso toFileReference fromFileReference @@ -293,7 +309,7 @@ data FileField fileid = FileField , fieldUnpackZips :: FileFieldUserOption Bool , fieldMultiple :: Bool , fieldRestrictExtensions :: Maybe (NonNull (Set Extension)) - , fieldMaxFileSize :: Maybe Natural + , fieldMaxFileSize, fieldMaxCumulativeSize :: Maybe Natural , fieldAdditionalFiles :: FileReferenceTitleMap fileid (FileFieldUserOption Bool) , fieldAllEmptyOk :: Bool } @@ -311,6 +327,7 @@ instance ToJSON (FileField FileReference) where , pure $ "multiple" JSON..= fieldMultiple , pure $ "restrict-extensions" JSON..= fieldRestrictExtensions , pure $ "max-file-size" JSON..= fieldMaxFileSize + , pure $ "max-cumulative-size" JSON..= fieldMaxCumulativeSize , pure $ "additional-files" JSON..= addFiles' , pure $ "all-empty-ok" JSON..= fieldAllEmptyOk ] @@ -326,6 +343,7 @@ instance FromJSON (FileField FileReference) where fieldMultiple <- o JSON..: "multiple" fieldRestrictExtensions <- o JSON..:? "restrict-extensions" fieldMaxFileSize <- o JSON..:? "max-file-size" + fieldMaxCumulativeSize <- o JSON..:? "max-cumulative-size" fieldAllEmptyOk <- o JSON..:? "all-empty-ok" JSON..!= True addFiles' <- o JSON..:? "additional-files" JSON..!= mempty fieldAdditionalFiles <- fmap FileReferenceFileReferenceTitleMap . for addFiles' $ JSON.withObject "FileReferenceFileReferenceTitleMapElem" $ \o' -> do diff --git a/src/Model/Types/Security.hs b/src/Model/Types/Security.hs index da0758f10..5e2661150 100644 --- a/src/Model/Types/Security.hs +++ b/src/Model/Types/Security.hs @@ -9,23 +9,45 @@ module Model.Types.Security ( module Model.Types.Security ) where -import Import.NoModel +import ClassyPrelude.Yesod hiding (derivePersistFieldJSON, Proxy(..)) + +import Utils + +import Data.Aeson +import Data.Aeson.TH +import Model.Types.TH.JSON +import Data.Universe +import Data.Universe.Instances.Reverse () +import Data.Proxy +import Data.Data (Data) + +import Control.Lens + +import qualified Data.Set as Set import qualified Data.Text as Text -import qualified Data.Set as Set import qualified Data.HashMap.Strict as HashMap import qualified Data.Aeson.Types as Aeson +import Data.CaseInsensitive (CI) import qualified Data.CaseInsensitive as CI +import Data.CaseInsensitive.Instances () + +import Data.Set.Instances () +import Data.NonNull.Instances () +import Data.Universe.Instances.Reverse.MonoTraversable () import Model.Types.TH.PathPiece import Database.Persist.Sql +import Servant.Docs (ToSample(..), samples) import Utils.Lens.TH +import Data.Binary (Binary) import qualified Data.Binary as Binary +import Data.Binary.Instances.UnorderedContainers () data AuthenticationMode = AuthLDAP @@ -182,6 +204,21 @@ newtype PredDNF a = PredDNF { dnfTerms :: Set (NonNull (Set (PredLiteral a))) } makeLenses_ ''PredDNF +parsePredDNF :: forall a. (Ord a, PathPiece a) => PredDNF a -> [Text] -> Either Text (PredDNF a) +parsePredDNF start = fmap (PredDNF . Set.mapMonotonic impureNonNull) . ofoldM partition' (Set.mapMonotonic toNullable $ dnfTerms start) + where + partition' :: Set (Set (PredLiteral a)) -> Text -> Either Text (Set (Set (PredLiteral a))) + partition' prev t + | Just (Set.fromList . toNullable -> authTags) <- fromNullable =<< mapM fromPathPiece (Text.splitOn "AND" t) + = if + | oany (authTags `Set.isSubsetOf`) prev + -> Right prev + | otherwise + -> Right . Set.insert authTags $ Set.filter (not . (`Set.isSubsetOf` authTags)) prev + | otherwise + = Left t + + $(return []) instance ToJSON a => ToJSON (PredDNF a) where @@ -197,6 +234,9 @@ type AuthLiteral = PredLiteral AuthTag type AuthDNF = PredDNF AuthTag +defaultAuthDNF :: AuthDNF +defaultAuthDNF = predDNFVar AuthAdmin `predDNFOr` predDNFVar AuthToken + dnfAssumeValue :: forall a. Ord a => a -> Bool -> PredDNF a -> Maybe (PredDNF a) -- ^ `Nothing` corresponds to @⊤@ @@ -247,19 +287,23 @@ predDNFEntail = over _dnfTerms $ ofoldl' entail Set.empty data UserGroupName - = UserGroupMetrics | UserGroupCrontab + = UserGroupMetrics + | UserGroupExternalApis + | UserGroupCrontab | UserGroupCustom { userGroupCustomName :: CI Text } deriving (Eq, Ord, Read, Show, Generic, Typeable) deriving anyclass (Hashable, NFData) instance PathPiece UserGroupName where toPathPiece UserGroupMetrics = "metrics" + toPathPiece UserGroupExternalApis = "external-apis" toPathPiece UserGroupCrontab = "crontab" toPathPiece (UserGroupCustom t) = CI.original t fromPathPiece t = Just $ if - | "metrics" `ciEq` t -> UserGroupMetrics - | "crontab" `ciEq` t -> UserGroupCrontab - | otherwise -> UserGroupCustom $ CI.mk t + | "external-apis" `ciEq` t -> UserGroupExternalApis + | "metrics" `ciEq` t -> UserGroupMetrics + | "crontab" `ciEq` t -> UserGroupCrontab + | otherwise -> UserGroupCustom $ CI.mk t where ciEq :: Text -> Text -> Bool ciEq = (==) `on` CI.mk @@ -267,3 +311,11 @@ instance PathPiece UserGroupName where pathPieceJSON ''UserGroupName derivePersistFieldPathPiece' (sqlType (Proxy @(CI Text))) ''UserGroupName makeLenses_ ''UserGroupName + +instance ToSample UserGroupName where + toSamples _ = builtins ++ samples custom + where builtins = ("Built in group", ) <$> + [ UserGroupMetrics + , UserGroupExternalApis + ] + custom = UserGroupCustom . CI.mk . ("Group " <>) . tshow <$> [1..] diff --git a/src/Model/Types/Submission.hs b/src/Model/Types/Submission.hs index 3855ef5a9..00e9c413d 100644 --- a/src/Model/Types/Submission.hs +++ b/src/Model/Types/Submission.hs @@ -31,7 +31,7 @@ import Data.Text.Metrics (damerauLevenshtein) data SubmissionFileType = SubmissionOriginal | SubmissionCorrected deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic) - deriving anyclass (Universe, Finite) + deriving anyclass (Universe, Finite, Hashable) nullaryPathPiece ''SubmissionFileType $ camelToPathPiece' 1 diff --git a/src/Model/Types/SystemMessage.hs b/src/Model/Types/SystemMessage.hs new file mode 100644 index 000000000..3205ebd8d --- /dev/null +++ b/src/Model/Types/SystemMessage.hs @@ -0,0 +1,6 @@ +module Model.Types.SystemMessage where + +import Import.NoModel + + +type SystemMessageVolatileClusterSettings = Set (VolatileClusterSettingsKey, Value) diff --git a/src/Model/Types/TH/JSON.hs b/src/Model/Types/TH/JSON.hs index d545df3eb..3db76bcad 100644 --- a/src/Model/Types/TH/JSON.hs +++ b/src/Model/Types/TH/JSON.hs @@ -72,6 +72,37 @@ predNFAesonOptions = defaultOptions } +externalApiConfigAesonOptions :: Options +externalApiConfigAesonOptions = defaultOptions + { tagSingleConstructors = True + , unwrapUnaryRecords = False + , sumEncoding = TaggedObject "type" "config" + , allNullaryToStringTag = False + , constructorTagModifier = camelToPathPiece' 2 + , fieldLabelModifier = camelToPathPiece' 2 + } + + +externalApiCreationRequestAesonOptions, externalApiCreationResponseAesonOptions, externalApiCreationRestrictionsAesonOptions, externalApiPongResponseAesonOptions :: Options +externalApiCreationRequestAesonOptions = defaultOptions + { tagSingleConstructors = False + , fieldLabelModifier = camelToPathPiece' 1 + } +externalApiCreationResponseAesonOptions = defaultOptions + { tagSingleConstructors = False + , fieldLabelModifier = camelToPathPiece' 1 + } +externalApiCreationRestrictionsAesonOptions = defaultOptions + { tagSingleConstructors = False + , unwrapUnaryRecords = False + , fieldLabelModifier = camelToPathPiece' 1 + } +externalApiPongResponseAesonOptions = defaultOptions + { tagSingleConstructors = False + , unwrapUnaryRecords = False + , fieldLabelModifier = camelToPathPiece' 1 + } + workflowGraphEdgeAesonOptions, workflowActionAesonOptions, workflowPayloadViewAesonOptions, workflowNodeViewAesonOptions, workflowNodeMessageAesonOptions, workflowEdgeMessageAesonOptions :: Options workflowGraphEdgeAesonOptions = defaultOptions { constructorTagModifier = camelToPathPiece' 3 diff --git a/src/Model/Types/User.hs b/src/Model/Types/User.hs index 6e1b966a4..1d32d639a 100644 --- a/src/Model/Types/User.hs +++ b/src/Model/Types/User.hs @@ -4,6 +4,9 @@ import Import.NoModel import Model.Types.TH.PathPiece +type UserEduPersonPrincipalName = Text + + data SystemFunction = SystemExamOffice | SystemFaculty diff --git a/src/Network/URI/Instances.hs b/src/Network/URI/Instances.hs index 9bd4edbe5..4b3ef50d3 100644 --- a/src/Network/URI/Instances.hs +++ b/src/Network/URI/Instances.hs @@ -5,7 +5,18 @@ module Network.URI.Instances ) where import ClassyPrelude + import Network.URI +import Network.URI.Static +import Web.HttpApiData + +import Data.Swagger +import Data.Swagger.Internal.Schema + +import Data.Proxy + +import Servant.Docs + import qualified Data.Aeson as Aeson import Control.Monad.Fail (MonadFail(..)) @@ -14,6 +25,25 @@ import Database.Persist import Database.Persist.Sql +instance ToHttpApiData URI where + toQueryParam = pack . ($ mempty) . uriToString id + +instance FromHttpApiData URI where + parseQueryParam = maybe (Left "Could not parse URIReference") Right . parseURIReference . unpack + +instance ToParamSchema URI where + toParamSchema _ = toParamSchema $ Proxy @String + +instance ToSchema URI where + declareNamedSchema = pure . named "URI" . paramSchemaToSchema + +instance ToSample URI where + toSamples _ = samples + [ [uri|https://example.invalid/path/to/resource?key1=val1&key1=val2&key2=val3#fragment|] + , [relativeReference|unAnchored/path/to/resource|] + , [relativeReference|/anchored/path/to/resource|] + ] + instance Aeson.ToJSON URI where toJSON = Aeson.String . pack . ($ mempty) . uriToString id instance Aeson.FromJSON URI where diff --git a/src/Servant/Client/Core/BaseUrl/Instances.hs b/src/Servant/Client/Core/BaseUrl/Instances.hs new file mode 100644 index 000000000..5d180736f --- /dev/null +++ b/src/Servant/Client/Core/BaseUrl/Instances.hs @@ -0,0 +1,49 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Servant.Client.Core.BaseUrl.Instances + () where + +import ClassyPrelude + +import Database.Persist +import Database.Persist.Sql + +import Servant.Client.Core.BaseUrl + +import qualified Data.Text.Encoding as Text + +import Control.Arrow (left) + +import Data.Swagger hiding (Scheme(..)) +import Data.Swagger.Internal.Schema (named) + +import Control.Lens + +import Servant.Docs (ToSample(..)) + + +parseBaseUrl' :: Text -> Either Text BaseUrl +parseBaseUrl' = left tshow . parseBaseUrl . unpack + +instance PersistField BaseUrl where + toPersistValue = PersistText . pack . showBaseUrl + fromPersistValue (PersistText t) = parseBaseUrl' t + fromPersistValue (PersistByteString bs) = parseBaseUrl' <=< left tshow $ Text.decodeUtf8' bs + fromPersistValue _ = Left "Unexpected type when converting to BaseUrl" + +instance PersistFieldSql BaseUrl where + sqlType _ = SqlString + +instance ToParamSchema BaseUrl where + toParamSchema _ = mempty + & type_ ?~ SwaggerString + +instance ToSchema BaseUrl where + declareNamedSchema = pure . named "BaseUrl" . paramSchemaToSchema + +instance ToSample BaseUrl where + toSamples _ + = [ ("Without path" , BaseUrl Https "example.invalid" 443 "") + , ("With path" , BaseUrl Https "example.invalid" 443 "/api") + , ("With custom port", BaseUrl Https "example.invalid" 8443 "") + ] diff --git a/src/Servant/Docs/Internal/Pretty/Instances.hs b/src/Servant/Docs/Internal/Pretty/Instances.hs new file mode 100644 index 000000000..24b761d96 --- /dev/null +++ b/src/Servant/Docs/Internal/Pretty/Instances.hs @@ -0,0 +1,14 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Servant.Docs.Internal.Pretty.Instances () where + +import ClassyPrelude + +import Servant.Docs.Internal.Pretty +import Servant.API.ContentTypes + +import Data.Proxy + + +instance MimeUnrender JSON a => MimeUnrender PrettyJSON a where + mimeUnrender _ = mimeUnrender $ Proxy @JSON diff --git a/src/Servant/Server/Instances.hs b/src/Servant/Server/Instances.hs new file mode 100644 index 000000000..f990bcf35 --- /dev/null +++ b/src/Servant/Server/Instances.hs @@ -0,0 +1,13 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Servant.Server.Instances + () where + +import ClassyPrelude hiding (Handler(..)) +import Servant.Server + +import Control.Monad.Trans.Except.Instances () + + +instance MonadUnliftIO Handler where + withRunInIO cont = Handler (withRunInIO $ \runInner -> cont (runInner . runHandler')) diff --git a/src/ServantApi.hs b/src/ServantApi.hs new file mode 100644 index 000000000..e4a66c1bd --- /dev/null +++ b/src/ServantApi.hs @@ -0,0 +1,14 @@ +module ServantApi + ( module ServantApi + ) where + +import Import.Servant + + +import ServantApi.ExternalApis as ServantApi + + +mkYesodApi ''UniWorX uniworxRoutes + +uniworxApi :: Proxy UniWorXApi +uniworxApi = Proxy diff --git a/src/ServantApi/ExternalApis.hs b/src/ServantApi/ExternalApis.hs new file mode 100644 index 000000000..96647dbed --- /dev/null +++ b/src/ServantApi/ExternalApis.hs @@ -0,0 +1,109 @@ +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module ServantApi.ExternalApis + ( module ServantApi.ExternalApis.Type + ) where + +import Import.Servant + +import ServantApi.ExternalApis.Type + +import qualified Data.HashSet as HashSet + + +instance ServantApiDispatchUniWorX ExternalApis where + servantServer' _ = genericServerT ExternalApis + { externalApisListR = externalApisList + , externalApisCreateR = externalApiCreate + , externalApisInfoR = externalApiInfo + , externalApisPongR = externalApiPong + , externalApisDeleteR = externalApiDelete + } + +externalApisList :: ServantHandler ExternalApisList +externalApisList = runDB $ fmap ExternalApisList . lift . toResponse =<< selectList [] [Desc ExternalApiLastAlive] + where + toResponse :: [Entity ExternalApi] -> ServantHandler (HashMap CryptoUUIDExternalApi ExternalApiInfo) + toResponse = foldMapM $ fmap (uncurry singletonMap) . toResponse' + + toResponse' :: Entity ExternalApi -> ServantHandler (CryptoUUIDExternalApi, ExternalApiInfo) + toResponse' (Entity eApiId eApi) = (,) <$> encrypt eApiId <*> dbToInfo eApi + +externalApiCreate :: Maybe ExternalApiCreationRestrictions + -> BearerToken UniWorX + -> ExternalApiCreationRequest + -> ServantHandler (Headers '[Header "Location" URI] ExternalApiCreationResponse) +externalApiCreate mRestr bearer ExternalApiCreationRequest{..} = do + now <- liftIO getCurrentTime + + unless (maybe True matchesRequest mRestr) $ + throwError err403{ errBody = "Bearer restrictions do not permit request" } + + jwt <- encodeBearer bearer + + Entity apiId api <- runDB $ upsert ExternalApi + { externalApiIdent = mRestr >>= eacrIdent + , externalApiAuthority = jwt + , externalApiKeys = eacrPublicKeys & _keys %~ filter (not . isPrivateJwk) + , externalApiBaseUrl = eacrBaseUrl + , externalApiConfig = eacrConfig + , externalApiLastAlive = now + } + [ ExternalApiAuthority =. jwt + , ExternalApiKeys =. (eacrPublicKeys & _keys %~ filter (not . isPrivateJwk)) + , ExternalApiBaseUrl =. eacrBaseUrl + , ExternalApiConfig =. eacrConfig + , ExternalApiLastAlive =. now + ] + eacrId <- encrypt apiId + + location <- renderRouteAbsolute . ExternalApisR $ servantApiLink (Proxy @ExternalApis) (Proxy @ExternalApisInfoR) eacrId + + eacrInfo <- set _eaiPublicKeys (eacrPublicKeys & _keys %~ filter (not . isPrivateJwk)) <$> dbToInfo api + + return $ addHeader location ExternalApiCreationResponse + { eacrId + , eacrInfo + } + + where + matchesRequest ExternalApiCreationRestrictions{..} = and + [ classifyExternalApiConfig eacrConfig `elem` eacrApiKinds + ] + +externalApiInfo :: ExternalApiId -> ServantHandler ExternalApiInfo +externalApiInfo apiId = + dbToInfo <=< runDB $ get apiId >>= maybe (throwError err404) return + +externalApiPong :: ExternalApiId -> ServantHandler ExternalApiPongResponse +externalApiPong apiId = do + now <- liftIO getCurrentTime + ExternalApi{..} <- runDB $ do + unlessM (existsKey apiId) $ throwError err404 + updateGet apiId [ ExternalApiLastAlive =. now ] + + return $ ExternalApiPongResponse externalApiLastAlive + +externalApiDelete :: ExternalApiId -> ServantHandler NoContent +externalApiDelete apiId = NoContent <$ runDB (delete apiId) + + +dbToInfo :: ExternalApi -> ServantHandler ExternalApiInfo +dbToInfo ExternalApi{..} = do + BearerToken{..} <- decodeBearer externalApiAuthority + eaiTokenAuthority <- foldMapM (fmap HashSet.singleton . either (return . Left) (fmap Right . encrypt)) bearerAuthority + let eaiTokenIssued = bearerIssuedAt + eaiTokenExpiresAt = bearerExpiresAt + eaiTokenStartsAt = bearerStartsAt + + eaiPublicKeys = externalApiKeys & _keys %~ filter isPublicJwk + + eaiBaseUrl = externalApiBaseUrl + + eaiLastAlive = externalApiLastAlive + + eaiConfig = externalApiConfig + + eaiIdent = externalApiIdent + + return ExternalApiInfo{..} diff --git a/src/ServantApi/ExternalApis/Type.hs b/src/ServantApi/ExternalApis/Type.hs new file mode 100644 index 000000000..4a1b6be51 --- /dev/null +++ b/src/ServantApi/ExternalApis/Type.hs @@ -0,0 +1,222 @@ +{-# LANGUAGE UndecidableInstances #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module ServantApi.ExternalApis.Type where + +import Import.Servant.NoFoundation hiding ((.=), keys) + +import Data.Aeson + +import qualified Data.HashSet as HashSet +import qualified Data.HashMap.Strict.InsOrd as HashMap.InsOrd + +import Jose.Jwk (JwkSet(..)) + +{-# ANN module ("HLint: ignore Use newtype instead of data" :: String) #-} + + +type ExternalApisListR = ApiVersion 1 0 0 + :> Get '[PrettyJSON] ExternalApisList +type ExternalApisCreateR = ApiVersion 1 0 0 + :> CaptureBearerRestriction' '[Optional] ExternalApiCreationRestrictions + :> CaptureBearerToken + :> ReqBody '[JSON] ExternalApiCreationRequest + :> PostCreated '[PrettyJSON] (Headers '[Header "Location" URI] ExternalApiCreationResponse) +type ExternalApisPongR = ApiVersion 1 0 0 + :> CaptureCryptoUUID "external-api" ExternalApiId + :> "pong" + :> Post '[PrettyJSON] ExternalApiPongResponse +type ExternalApisInfoR = ApiVersion 1 0 0 + :> CaptureCryptoUUID "external-api" ExternalApiId + :> Get '[PrettyJSON] ExternalApiInfo +type ExternalApisDeleteR = ApiVersion 1 0 0 + :> CaptureCryptoUUID "external-api" ExternalApiId + :> DeleteNoContent + +data ExternalApis mode = ExternalApis + { externalApisListR :: mode :- ExternalApisListR + , externalApisCreateR :: mode :- ExternalApisCreateR + , externalApisInfoR :: mode :- ExternalApisInfoR + , externalApisPongR :: mode :- ExternalApisPongR + , externalApisDeleteR :: mode :- ExternalApisDeleteR + } deriving (Generic) + +type ServantApiExternalApis = ServantApi ExternalApis +type instance ServantApiUnproxy ExternalApis = ToServantApi ExternalApis + + +instance ToCapture (Capture "external-api" UUID) where + toCapture _ = DocCapture "external-api" "Internal id of the registered external api" + + +data ExternalApiCreationRequest = ExternalApiCreationRequest + { eacrPublicKeys :: JwkSet + , eacrBaseUrl :: BaseUrl + , eacrConfig :: ExternalApiConfig + } deriving (Eq, Show, Generic, Typeable) + +instance ToJSON ExternalApiCreationRequest where + toJSON = genericToJSON externalApiCreationRequestAesonOptions +instance FromJSON ExternalApiCreationRequest where + parseJSON = genericParseJSON externalApiCreationRequestAesonOptions +instance ToSchema ExternalApiCreationRequest where + declareNamedSchema = genericDeclareNamedSchema $ fromAesonOptions externalApiCreationRequestAesonOptions +instance ToSample ExternalApiCreationRequest + +data ExternalApiCreationResponse = ExternalApiCreationResponse + { eacrId :: CryptoUUIDExternalApi + , eacrInfo :: ExternalApiInfo + } deriving (Eq, Show, Generic, Typeable) + +instance ToJSON ExternalApiCreationResponse where + toJSON = genericToJSON externalApiCreationResponseAesonOptions +instance FromJSON ExternalApiCreationResponse where + parseJSON = genericParseJSON externalApiCreationResponseAesonOptions +instance ToSchema ExternalApiCreationResponse where + declareNamedSchema = genericDeclareNamedSchema $ fromAesonOptions externalApiCreationResponseAesonOptions +instance ToSample ExternalApiCreationResponse where + toSamples _ = samples $ ExternalApiCreationResponse + <$> fmap (unTagged . snd) (toSamples $ Proxy @(Tagged ExternalApiId CryptoUUIDExternalApi)) + <*> fmap snd (toSamples $ Proxy @ExternalApiInfo) + +data ExternalApiCreationRestrictions = ExternalApiCreationRestrictions + { eacrIdent :: Maybe UUID + , eacrApiKinds :: NonNull (HashSet ExternalApiKind) + } deriving (Eq, Show, Generic, Typeable) +instance ToJSON ExternalApiCreationRestrictions where + toJSON = genericToJSON externalApiCreationRestrictionsAesonOptions +instance FromJSON ExternalApiCreationRestrictions where + parseJSON = genericParseJSON externalApiCreationRestrictionsAesonOptions +instance ToSchema ExternalApiCreationRestrictions where + declareNamedSchema = genericDeclareNamedSchema $ fromAesonOptions externalApiCreationRestrictionsAesonOptions +instance ToSample ExternalApiCreationRestrictions + + +data ExternalApiPongResponse = ExternalApiPongResponse + { eaprLastAlive :: UTCTime + } deriving (Eq, Show, Generic, Typeable) +instance ToJSON ExternalApiPongResponse where + toJSON = genericToJSON externalApiPongResponseAesonOptions +instance FromJSON ExternalApiPongResponse where + parseJSON = genericParseJSON externalApiPongResponseAesonOptions +instance ToSchema ExternalApiPongResponse where + declareNamedSchema = genericDeclareNamedSchema $ fromAesonOptions externalApiPongResponseAesonOptions +instance ToSample ExternalApiPongResponse + + +newtype ExternalApisList = ExternalApisList (HashMap CryptoUUIDExternalApi ExternalApiInfo) + deriving (Eq, Show, Generic, Typeable) + deriving newtype (ToJSON, FromJSON, ToSchema) + +instance ToSample ExternalApisList where + toSamples _ = samples $ map (\n -> ExternalApisList . fold $ take n singletons) [0..] + where + singletons = zipWith (\(_, Tagged s) (_, s') -> singletonMap s s') (toSamples $ Proxy @(Tagged ExternalApiId CryptoUUIDExternalApi)) (toSamples $ Proxy @ExternalApiInfo) + + +data ExternalApiInfo = ExternalApiInfo + { eaiIdent :: Maybe UUID + , eaiTokenAuthority :: HashSet (Either Value CryptoUUIDUser) + , eaiTokenIssued :: UTCTime + , eaiTokenExpiresAt, eaiTokenStartsAt :: Maybe UTCTime + , eaiPublicKeys :: JwkSet + , eaiBaseUrl :: BaseUrl + , eaiLastAlive :: UTCTime + , eaiConfig :: ExternalApiConfig + } deriving (Eq, Show, Generic, Typeable) + +instance ToJSON ExternalApiInfo where + toJSON ExternalApiInfo{..} = object $ maybe id ((:) . ("ident" .=)) eaiIdent + [ "token-authority" .= case HashSet.toList eaiTokenAuthority of + [x] -> either id toJSON x + _ -> toJSON $ foldMap (HashSet.singleton . either id toJSON) eaiTokenAuthority + , "token-issued" .= eaiTokenIssued + , "token-expires-at" .= eaiTokenExpiresAt + , "token-starts-at" .= eaiTokenStartsAt + , "public-keys" .= keys eaiPublicKeys + , "base-url" .= eaiBaseUrl + , "last-alive" .= eaiLastAlive + , "config" .= eaiConfig + ] + +instance FromJSON ExternalApiInfo where + parseJSON = withObject "ExternalApiInfo" $ \o -> do + eaiIdent <- o .:? "ident" + eaiTokenAuthority <- asum + [ HashSet.singleton . Right <$> o .: "token-authority" + , (o .: "token-authority" :: _ (HashSet Value)) >>= foldMapM (\v' -> fmap HashSet.singleton $ (Right <$> parseJSON v') <|> return (Left v')) + , HashSet.singleton . Left <$> o .: "token-authority" + ] + eaiTokenIssued <- o .: "token-issued" + eaiTokenExpiresAt <- o .: "token-expires-at" + eaiTokenStartsAt <- o .: "token-starts-at" + eaiPublicKeys <- JwkSet <$> o .: "public-keys" + eaiBaseUrl <- o .: "base-url" + eaiLastAlive <- o .: "last-alive" + eaiConfig <- o .: "config" + return ExternalApiInfo{..} + +instance ToSchema ExternalApiInfo where + declareNamedSchema _ = do + utcTimeSchema <- declareSchemaRef $ Proxy @UTCTime + jwkSetSchema <- declareSchemaRef $ Proxy @[Jwk] + baseUrlSchema <- declareSchemaRef $ Proxy @BaseUrl + externalApiConfigSchema <- declareSchemaRef $ Proxy @ExternalApiConfig + uuidSchema <- declareSchemaRef $ Proxy @UUID + + pure . named "ExternalApiInfo" $ mempty + & type_ ?~ SwaggerObject + & properties .~ mconcat + [ HashMap.InsOrd.singleton "ident" uuidSchema + , HashMap.InsOrd.singleton "token-authority" $ Inline mempty + , HashMap.InsOrd.singleton "token-issued" utcTimeSchema + , HashMap.InsOrd.singleton "token-expires-at" utcTimeSchema + , HashMap.InsOrd.singleton "token-starts-at" utcTimeSchema + , HashMap.InsOrd.singleton "public-keys" jwkSetSchema + , HashMap.InsOrd.singleton "base-url" baseUrlSchema + , HashMap.InsOrd.singleton "last-alive" utcTimeSchema + , HashMap.InsOrd.singleton "config" externalApiConfigSchema + ] + & required .~ ["token-authority", "token-issued", "token-expires-at", "token-starts-at", "public-keys", "base-url", "last-alive", "config"] + +instance ToSample ExternalApiInfo where + toSamples _ = samples $ do + (_, eaiIdent) <- toSamples Proxy + + let eaiTokenAuthority' = do + specificUser <- [False, True] + if | specificUser -> Right <$> map (unTagged . snd) (toSamples $ Proxy @(Tagged UserId CryptoUUIDUser)) + | otherwise -> Left <$> map (toJSON . snd) (toSamples $ Proxy @UserGroupName) + eaiTokenAuthority <- fmap HashSet.fromList $ flip replicateM eaiTokenAuthority' =<< [0..] + + (_, eaiTokenIssued) <- toSamples Proxy + (_, eaiTokenExpiresAt) <- toSamples Proxy + (_, eaiTokenStartsAt) <- toSamples Proxy + (_, eaiLastAlive) <- toSamples Proxy + + -- If times didn't match up this instance could not have registered + guard $ NTop (Just eaiTokenIssued) <= NTop eaiTokenExpiresAt + guard $ NTop (Just <$> eaiTokenExpiresAt) >= NTop (Just eaiTokenStartsAt) + guard $ eaiLastAlive >= eaiTokenIssued + && Just eaiLastAlive >= eaiTokenStartsAt + && NTop (Just eaiLastAlive) <= NTop eaiTokenExpiresAt + + (_, eaiBaseUrl) <- toSamples Proxy + (_, eaiConfig) <- toSamples Proxy + + (_, eaiPublicKeys) <- toSamples Proxy + & traverse . _2 . _keys %~ filter isPublicJwk + + return ExternalApiInfo{..} + + +isPublicJwk, isPrivateJwk :: Jwk -> Bool +isPublicJwk RsaPublicJwk{} = True +isPublicJwk EcPublicJwk{} = True +isPublicJwk _ = False +isPrivateJwk RsaPrivateJwk{} = True +isPrivateJwk EcPrivateJwk{} = True +isPrivateJwk _ = False + + +makeLenses_ ''ExternalApiInfo diff --git a/src/Settings.hs b/src/Settings.hs index 847361b6d..fa3d8fc1a 100644 --- a/src/Settings.hs +++ b/src/Settings.hs @@ -185,6 +185,10 @@ data AppSettings = AppSettings , appUserDefaults :: UserDefaultConf , appAuthPWHash :: PWHashConf + , appExternalApisPingInterval + , appExternalApisPongTimeout + , appExternalApisExpiry :: NominalDiffTime + , appCookieSettings :: RegisteredCookie -> CookieSettings , appMemcachedConf :: Maybe MemcachedConf @@ -229,6 +233,8 @@ data AppSettings = AppSettings , appVolatileClusterSettingsCacheTime :: DiffTime , appJobMaxFlush :: Maybe Natural + + , appCommunicationAttachmentsMaxSize :: Maybe Natural } deriving Show data JobMode = JobsLocal { jobsAcceptOffload :: Bool } @@ -258,6 +264,8 @@ data UserDefaultConf = UserDefaultConf , userDefaultDownloadFiles :: Bool , userDefaultWarningDays :: NominalDiffTime , userDefaultShowSex :: Bool + , userDefaultExamOfficeGetSynced :: Bool + , userDefaultExamOfficeGetLabels :: Bool } deriving (Show) data PWHashConf = PWHashConf @@ -366,6 +374,7 @@ data PrewarmCacheConf = PrewarmCacheConf data SettingBotMitigation = SettingBotMitigationOnlyLoggedInTableSorting + | SettingBotMitigationUnauthorizedFormHoneypots deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable) deriving anyclass (Universe, Finite) @@ -657,6 +666,9 @@ instance FromJSON AppSettings where appSessionTokenExpiration <- o .:? "session-token-expiration" appSessionTokenEncoding <- o .: "session-token-encoding" + appExternalApisPingInterval <- o .: "external-apis-ping-interval" + appExternalApisPongTimeout <- o .: "external-apis-pong-timeout" + appExternalApisExpiry <- o .: "external-apis-expiry" appSessionTokenClockLeniencyStart <- o .:? "session-token-clock-leniency-start" appSessionTokenClockLeniencyEnd <- o .:? "session-token-clock-leniency-end" @@ -702,6 +714,8 @@ instance FromJSON AppSettings where appJobMaxFlush <- o .:? "job-max-flush" + appCommunicationAttachmentsMaxSize <- o .:? "communication-attachments-max-size" + return AppSettings{..} where isValidARCConf ARCConf{..} = arccMaximumWeight > 0 diff --git a/src/Settings/Cluster/Volatile.hs b/src/Settings/Cluster/Volatile.hs index 8e357031d..e1d55e965 100644 --- a/src/Settings/Cluster/Volatile.hs +++ b/src/Settings/Cluster/Volatile.hs @@ -1,6 +1,6 @@ module Settings.Cluster.Volatile ( VolatileClusterSettingsKey(..) - , clusterVolatileWorkflowsEnabled, clusterVolatileQuickActionsEnabled + , clusterVolatileQuickActionsEnabled , VolatileClusterSetting(..) , VolatileClusterSettingsCache , mkVolatileClusterSettingsCache @@ -29,8 +29,7 @@ import Data.Proxy data VolatileClusterSettingsKey - = ClusterVolatileWorkflowsEnabled - | ClusterVolatileQuickActionsEnabled + = ClusterVolatileQuickActionsEnabled deriving (Eq, Ord, Enum, Bounded, Show, Read, Generic, Typeable) deriving anyclass (Hashable, Universe, Finite, NFData) @@ -40,9 +39,6 @@ pathPieceJSONKey ''VolatileClusterSettingsKey pathPieceHttpApiData ''VolatileClusterSettingsKey derivePersistFieldPathPiece ''VolatileClusterSettingsKey -clusterVolatileWorkflowsEnabled :: Proxy 'ClusterVolatileWorkflowsEnabled -clusterVolatileWorkflowsEnabled = Proxy - clusterVolatileQuickActionsEnabled :: Proxy 'ClusterVolatileQuickActionsEnabled clusterVolatileQuickActionsEnabled = Proxy @@ -56,11 +52,6 @@ class ( ToJSON (VolatileClusterSettingValue key) initVolatileClusterSetting :: forall m p. MonadIO m => p key -> m (VolatileClusterSettingValue key) knownVolatileClusterSetting :: forall p. p key -> VolatileClusterSettingsKey -instance VolatileClusterSetting 'ClusterVolatileWorkflowsEnabled where - type VolatileClusterSettingValue 'ClusterVolatileWorkflowsEnabled = Bool - initVolatileClusterSetting _ = return True - knownVolatileClusterSetting _ = ClusterVolatileWorkflowsEnabled - instance VolatileClusterSetting 'ClusterVolatileQuickActionsEnabled where type VolatileClusterSettingValue 'ClusterVolatileQuickActionsEnabled = Bool initVolatileClusterSetting _ = return True diff --git a/src/Utils.hs b/src/Utils.hs index 275e68602..9408b2d94 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -113,7 +113,9 @@ import Data.Binary (Binary) import qualified Data.Binary as Binary import Network.Wai (requestMethod) -import Network.HTTP.Types.Header +import Network.HTTP.Types.Header as Wai + +import Web.HttpApiData import Data.Time.Clock @@ -226,7 +228,6 @@ instance ToMarkup YamlValue where toYAML :: ToJSON a => a -> YamlValue toYAML = YamlValue . toJSON - delimitInternalState :: forall site a. HandlerFor site a -> HandlerFor site a -- | Switches the `InternalState` contained within the environment of `HandlerFor` to new one created with `bracket` -- @@ -663,6 +664,9 @@ partitionKeysEither = over _2 (Map.mapKeysMonotonic . view $ singular _Right) . mapFromSetM :: Applicative m => (k -> m v) -> Set k -> m (Map k v) mapFromSetM = (sequenceA .) . Map.fromSet +mapFM :: (Applicative m, Ord k, Finite k) => (k -> m v) -> m (Map k v) +mapFM = sequenceA . mapF + mapFilterM :: (Monad m, Ord k) => (v -> m Bool) -> Map k v -> m (Map k v) mapFilterM f m = ($ m) . runKleisli $ foldMap (Kleisli . Map.alterF (runMaybeT . assertMM (lift . f) . hoistMaybe)) (Map.keys m) @@ -856,6 +860,9 @@ throwLeft = either throwM return maybeExceptT :: Monad m => e -> m (Maybe b) -> ExceptT e m b maybeExceptT err act = lift act >>= maybe (throwE err) return + +maybeExceptT' :: Monad m => e -> Maybe b -> ExceptT e m b +maybeExceptT' err = maybe (throwE err) return maybeMExceptT :: Monad m => m e -> m (Maybe b) -> ExceptT e m b maybeMExceptT err act = lift act >>= maybe (lift err >>= throwE) return @@ -1232,6 +1239,9 @@ addCustomHeader, replaceOrAddCustomHeader :: (MonadHandler m, PathPiece payload) addCustomHeader ident payload = addHeader (toPathPiece ident) (toPathPiece payload) replaceOrAddCustomHeader ident payload = replaceOrAddHeader (toPathPiece ident) (toPathPiece payload) +waiCustomHeader :: ToHttpApiData payload => CustomHeader -> payload -> Wai.Header +waiCustomHeader ident payload = (CI.mk . encodeUtf8 $ toPathPiece ident, toHeader payload) + ------------------ -- HTTP Headers -- ------------------ @@ -1542,8 +1552,10 @@ unstableSort :: (MonadRandom m, Ord a) => [a] -> m [a] unstableSort = unstableSortBy compare uniforms :: (RandomGen g, MonadSplit g m, Foldable t) => t a -> m [a] -uniforms xs = LazyRand.evalRand go <$> getSplit - where go = (:) <$> interleave (uniform xs) <*> go +uniforms xs = LazyRand.evalRand (randomInfiniteList $ uniform xs) <$> getSplit + +randomInfiniteList :: MonadInterleave m => m a -> m [a] +randomInfiniteList gen = interleave $ (:) <$> gen <*> randomInfiniteList gen randUUIDC :: MonadIO m => (forall m'. Monad m' => m' UUID -> (forall a. m a -> m' a) -> ConduitT i o m' r) diff --git a/src/Utils/Form.hs b/src/Utils/Form.hs index e1083bcc0..d1ce12832 100644 --- a/src/Utils/Form.hs +++ b/src/Utils/Form.hs @@ -5,7 +5,9 @@ module Utils.Form where import ClassyPrelude.Yesod hiding (addMessage, addMessageI, cons, Proxy(..), identifyForm, addClass, mreq, areq, wreq, urlField) -import Data.Kind (Type) +import Yesod.Auth (YesodAuth(maybeAuthId)) + +import Data.Kind (Type, Constraint) import qualified Yesod.Form as Yesod import Yesod.Core.Instances () import Settings @@ -28,18 +30,23 @@ import qualified Data.Set as Set import Control.Monad.Reader.Class (MonadReader(..)) import Control.Monad.Writer.Class (MonadWriter(..), censor) import Control.Monad.State.Class (MonadState(..)) +import qualified Control.Monad.State.Class as State import Control.Monad.Trans.RWS (RWST, execRWST, mapRWST) +import Control.Monad.Trans.State (runStateT, evalStateT) import Control.Monad.Trans.Except (ExceptT, runExceptT) +import qualified Control.Monad.Trans.Writer.Lazy as Lazy (WriterT) import Control.Monad.Fix (MonadFix) import Control.Monad.Morph (MFunctor(..)) import Control.Monad.Base import Control.Monad.Catch (MonadCatch) -import Data.List ((!!)) +import Control.Monad.Random.Class (uniform, uniformMay, getRandom, getRandomR, getRandomRs, weighted) + +import Data.List (nub, (!!)) import Web.PathPieces -import Data.UUID +import Data.UUID hiding (toText) import Data.Ratio ((%)) import Data.Fixed @@ -54,7 +61,7 @@ import Utils.Frontend.Notification import Data.Proxy -import Data.Monoid (Endo(..)) +import Data.Monoid (Endo(..), Sum(..)) import Network.URI (URI, parseURI, uriToString) @@ -62,6 +69,31 @@ import Data.Either (fromRight) import qualified Database.Esqueleto.Legacy as E +import Handler.Utils.Random + +import qualified Data.Binary as Binary + +import qualified Data.ByteString.Base64.URL as Base64 (encodeUnpadded) +import qualified Data.ByteString as BS + +------------ +-- Fields -- +------------ + +_olOptions :: Traversal' (OptionList a) (Option a) +_olOptions f = \case + x@OptionList{} -> (\olOptions -> x{olOptions}) <$> traverse f (olOptions x) + x@OptionListGrouped{} -> (\olOptionsGrouped -> x{olOptionsGrouped}) <$> traverseOf (traverse . _2 . traverse) f (olOptionsGrouped x) + +_olOptionsGrouped :: Traversal' (OptionList a) (Text, [Option a]) +_olOptionsGrouped f = \case + x@OptionList{} -> pure x + x@OptionListGrouped{} -> (\olOptionsGrouped -> x{olOptionsGrouped}) <$> traverse f (olOptionsGrouped x) + +_olReadExternal :: Lens' (OptionList a) (Text -> Maybe a) +_olReadExternal f = \case + x@OptionList{} -> (\olReadExternal -> x{olReadExternal}) <$> f (olReadExternal x) + x@OptionListGrouped{} -> (\olReadExternalGrouped -> x{olReadExternalGrouped}) <$> f (olReadExternalGrouped x) ------------ -- Fields -- @@ -910,12 +942,28 @@ data UrlFieldMessage = UrlFieldCouldNotParseAbsolute deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable) deriving anyclass (Universe, Finite) +urlField' :: ( Monad m + , RenderMessage (HandlerSite m) UrlFieldMessage + , RenderMessage (HandlerSite m) FormMessage + ) + => (URI -> a) -> (a -> Text) + -> Field m a +urlField' fromURI toText = checkMap (maybe (Left UrlFieldCouldNotParseAbsolute) (Right . fromURI) . parseURI . unpack) toText Yesod.urlField + urlField :: ( Monad m , RenderMessage (HandlerSite m) UrlFieldMessage , RenderMessage (HandlerSite m) FormMessage ) => Field m URI -urlField = checkMap (maybe (Left UrlFieldCouldNotParseAbsolute) Right . parseURI . unpack) (pack . ($ mempty) . uriToString id) Yesod.urlField +urlField = urlField' id $ pack . ($ mempty) . uriToString id + +urlFieldText :: ( Monad m + , RenderMessage (HandlerSite m) UrlFieldMessage + , RenderMessage (HandlerSite m) FormMessage + ) + => Field m Text +urlFieldText = urlField' (pack . ($ mempty) . uriToString id) id + ----------- -- Forms -- @@ -961,7 +1009,7 @@ wrapForm' btn formWidget FormSettings{..} = do ------------------- -- | Use this type to pass information to the form template -data FormLayout = FormStandard +data FormLayout = FormStandard | FormLogin -- ^ Like `FormStandard` but without honeypots | FormDBTableFilter | FormDBTablePagesize | FormDBTableCsvImport | FormDBTableCsvExport | FormWorkflowDataset | FormVertical @@ -970,24 +1018,51 @@ data FormLayout = FormStandard data AFormMessage = MsgAFormFieldRequiredTip | MsgAFormFieldWorkflowDatasetTip + | MsgAFormHoneypotWebsite | MsgAFormHoneypotWebsiteTip | MsgAFormHoneypotWebsitePlaceholder + | MsgAFormHoneypotEmail | MsgAFormHoneypotEmailTip | MsgAFormHoneypotEmailPlaceholder + | MsgAFormHoneypotName | MsgAFormHoneypotNameTip | MsgAFormHoneypotNamePlaceholder + | MsgAFormHoneypotComment | MsgAFormHoneypotCommentPlaceholder + | MsgAFormHoneypotFilled deriving (Eq, Ord, Read, Show, Generic, Typeable) -renderAForm :: (RenderMessage (HandlerSite m) AFormMessage, Monad m) => FormLayout -> FormRender m a -renderAForm formLayout aform fragment = do - (res, ($ []) -> fieldViews) <- aFormToForm aform - let formHasRequiredFields = any fvRequired fieldViews +_HoneypotFieldId :: Prism' Text () +_HoneypotFieldId = only $ tshow '_HoneypotFieldId + +type RenderAFormSite :: Type -> Constraint +type RenderAFormSite site = ( RenderMessage site AFormMessage + , RenderMessage site UrlFieldMessage + , MonadSecretBox (HandlerFor site) + , MonadSecretBox (MaybeT (RWST (Maybe (Env, FileEnv), site, [Lang]) Enctype Ints (Lazy.WriterT [FieldView site] (HandlerFor site)))) + , YesodAuth site, HasAppSettings site + ) + +renderAForm :: (MonadHandler m, RenderAFormSite (HandlerSite m)) => FormLayout -> FormRender m a +renderAForm formLayout aform' fragment = do + (res, ($ []) -> fieldViews') <- aFormToForm aform + doHoneypots <- doFormHoneypots + honeypotSecrets' <- liftHandler honeypotSecrets + fieldViews <- liftHandler . secretBoxCSPRNGT (encodeUtf8 $ tshow ('renderAForm, "fieldViews")) (Binary.encode $ fieldViews' ^.. folded . _fvId) . forM fieldViews' . runStateT $ do + isHoneypot <- and2M (pure doHoneypots) $ is _Just <$> preuse (_fvId . _HoneypotFieldId) + when isHoneypot $ + _fvId <~ lift (lift newIdent) + honeypotHiddenSecret <- uniform . toNullable $ honeypotSecrets' Map.! isHoneypot + lift . lift $ (honeypotHiddenSecret, ) <$> newIdent + let formHasRequiredFields = any fvRequired fieldViews' widget = $(widgetFile "widgets/aform/aform") return (res, widget) - where isFormVertical = formLayout == FormVertical - isFormWorkflowDataset = formLayout == FormWorkflowDataset + where + isFormVertical = formLayout == FormVertical + isFormWorkflowDataset = formLayout == FormWorkflowDataset -renderWForm :: (RenderMessage (HandlerSite m) AFormMessage, MonadHandler m) => FormLayout -> WForm m (FormResult a) -> -- Form a -- (Synonym unavailable here) + aform = case formLayout of + FormLogin -> aform' + _other -> aformHoneypot aform' + +renderWForm :: (MonadHandler m, RenderAFormSite (HandlerSite m)) => FormLayout -> WForm m (FormResult a) -> -- Form a -- (Synonym unavailable here) (Markup -> MForm m (FormResult a, WidgetT (HandlerSite m) IO ())) renderWForm formLayout = renderAForm formLayout . wFormToAForm -renderFieldViews :: ( RenderMessage site AFormMessage - , RenderMessage site FormMessage - ) +renderFieldViews :: RenderAFormSite site => FormLayout -> [FieldView site] -> WidgetT site IO () renderFieldViews layout = view _1 <=< generateFormPost @@ -1038,6 +1113,120 @@ formSection formSectionTitle = do fvWidget :: FieldView site -> WidgetFor site () fvWidget FieldView{..} = $(widgetFile "widgets/field-view/field-view") + +doFormHoneypots :: ( MonadHandler m + , HasAppSettings (HandlerSite m) + , YesodAuth (HandlerSite m) + ) + => m Bool +doFormHoneypots = and2M + (getsYesod . views _appBotMitigations $ Set.member SettingBotMitigationUnauthorizedFormHoneypots) + (is _Nothing <$> maybeAuthId) + +honeypotSecrets :: ( MonadSecretBox m + , MonadThrow m + ) + => m (Map Bool (NonNull (Set Text))) +honeypotSecrets = secretBoxCSPRNGPure (encodeUtf8 $ tshow 'honeypotSecrets) (Binary.encode secretsNum) $ do + idents <- take (2 * secretsNum) . nub <$> randomInfiniteList randomIdent + let (hpIdents, noHPIdents) = splitAt secretsNum idents + return . mapF $ impureNonNull . Set.fromList . bool noHPIdents hpIdents + where + secretsNum = 10 + + randomIdent = decodeUtf8 . Base64.encodeUnpadded . BS.pack <$> replicateM 18 getRandom + + +aformHoneypot :: forall m a. + ( RenderAFormSite (HandlerSite m) + , MonadHandler m + ) => AForm m a -> AForm m a +aformHoneypot (aFormToWForm -> wform) = wFormToAForm . maybeT wform $ do + guardM doFormHoneypots + + (res, fields) <- lift $ wFormFields wform + + guard $ hasn't (folded . _fvId . _HoneypotFieldId) fields + + MsgRenderer mr <- getMsgRenderer + hoist (hoist $ hoist liftHandler) . secretBoxCSPRNGT (encodeUtf8 $ tshow 'aformHoneypot) (Binary.encode $ map (fvId &&& fvRequired) fields) $ do + k <- getRandomR @_ @Double (0, 1) + poss <- getRandomRs (0, length fields) + let honeypotCount = 2 + round (realToFrac (fromIntegral (length fields) * honeypotProportion) * k) + honeypotPoss = fmap getSum . Map.fromListWith (<>) . map (, Sum 1) . take honeypotCount $ 0 : length fields : poss + + hpFailure <- lift $ formFailure [MsgAFormHoneypotFilled] + let + toHpRes :: forall a'. FormResult (Maybe a') -> FormResult () + toHpRes hpRes = bool hpFailure (FormSuccess ()) (has (_FormSuccess . _Nothing) hpRes) + + fmap ((res <*) . fold) . flip evalStateT Set.empty . forM (zip [0..] $ map Just fields ++ [Nothing]) $ \(i, formField) -> do + hpRes <- fmap (fold @[FormResult ()]) . replicateM (Map.findWithDefault 0 i honeypotPoss) . hoist (hoist $ hoist censorHoneypot) $ do + let + chooseName :: Set Text -> _ (Maybe Text) + chooseName options = do + chosenNames <- State.get + name <- uniformMay $ options `Set.difference` chosenNames + for_ name $ State.modify' . Set.insert + return name + join $ weighted + [ ( do + name <- chooseName $ Set.fromList ["website", "url"] + fmap toHpRes . lift . lift . lift $ wopt urlField + ( fslI MsgAFormHoneypotWebsite + & setTooltip (mr MsgAFormHoneypotWebsiteTip) + & addPlaceholder (mr MsgAFormHoneypotWebsitePlaceholder) + & honeypotAttrs + & maybe id addName name + ) Nothing + , 5 + ) + , ( do + name <- chooseName $ Set.fromList ["email", "e-mail"] + fmap toHpRes . lift . lift . lift $ wopt emailField + ( fslI MsgAFormHoneypotEmail + & setTooltip (mr MsgAFormHoneypotEmailTip) + & addPlaceholder (mr MsgAFormHoneypotEmailPlaceholder) + & honeypotAttrs + & maybe id addName name + ) Nothing + , 2 + ) + , ( do + name <- chooseName $ Set.singleton "name" + fmap toHpRes . lift . lift . lift $ wopt textField + ( fslI MsgAFormHoneypotName + & setTooltip (mr MsgAFormHoneypotNameTip) + & addPlaceholder (mr MsgAFormHoneypotNamePlaceholder) + & honeypotAttrs + & maybe id addName name + ) Nothing + , 1 + ) + , ( do + name <- chooseName $ Set.singleton "comment" + fmap toHpRes . lift . lift . lift $ wopt textareaField + ( fslI MsgAFormHoneypotComment + & addPlaceholder (mr MsgAFormHoneypotCommentPlaceholder) + & honeypotAttrs + & maybe id addName name + ) Nothing + , 1 + ) + ] + for_ formField $ lift . lift . lift . lift . tell . pure + + return hpRes + where + honeypotProportion :: Rational + honeypotProportion = 1 % 3 + + censorHoneypot :: forall a'. WForm (HandlerFor (HandlerSite m)) a' -> WForm (HandlerFor (HandlerSite m)) a' + censorHoneypot = hoist $ censor (set (mapped . _fvId) $ _HoneypotFieldId # () :: [FieldView (HandlerSite m)] -> [FieldView (HandlerSite m)]) + + honeypotAttrs = addAttr "tabindex" "-1" . noAutocomplete + + ------------------- -- Special Forms -- ------------------- diff --git a/src/Utils/Frontend/Notification.hs b/src/Utils/Frontend/Notification.hs index d4ec0758a..395bbf144 100644 --- a/src/Utils/Frontend/Notification.hs +++ b/src/Utils/Frontend/Notification.hs @@ -30,10 +30,11 @@ notification nType Message{ messageIcon = messageIcon', .. } where messageIcon = fromMaybe defaultIcon messageIcon' defaultIcon = case messageStatus of - Success -> IconNotificationSuccess - Info -> IconNotificationInfo - Warning -> IconNotificationWarning - Error -> IconNotificationError + Success -> IconNotificationSuccess + Info -> IconNotificationInfo + Warning -> IconNotificationWarning + Error -> IconNotificationError + Nonactive -> IconNotificationNonactive notificationWidget :: Yesod site => NotificationType diff --git a/src/Utils/Icon.hs b/src/Utils/Icon.hs index f4923612d..b3853b520 100644 --- a/src/Utils/Icon.hs +++ b/src/Utils/Icon.hs @@ -72,6 +72,7 @@ data Icon | IconNotificationInfo | IconNotificationWarning | IconNotificationError + | IconNotificationNonactive | IconFavourite | IconLanguage | IconNavContainerClose | IconPageActionChildrenClose @@ -155,6 +156,7 @@ iconText = \case IconNotificationInfo -> "info-circle" IconNotificationWarning -> "exclamation-circle" IconNotificationError -> "exclamation-triangle" + IconNotificationNonactive -> "info" IconFavourite -> "star" IconLanguage -> "flag-alt" IconNavContainerClose -> "chevron-up" diff --git a/src/Utils/Lens.hs b/src/Utils/Lens.hs index d8d137ccb..397fc4378 100644 --- a/src/Utils/Lens.hs +++ b/src/Utils/Lens.hs @@ -224,6 +224,8 @@ makeLenses_ ''UTCTime makeLenses_ ''Exam makeLenses_ ''ExamOccurrence +makeLenses_ ''ExamOfficeLabel + makePrisms ''AuthenticationMode makeLenses_ ''CourseUserNote @@ -257,6 +259,8 @@ makeLenses_ ''ExternalExamOfficeSchool makeLenses_ ''ExternalExamStaff makeLenses_ ''ExternalExamResult +makeLenses_ ''JwkSet + makeLenses_ ''Rating makeLenses_ ''Rating' diff --git a/src/Utils/Message.hs b/src/Utils/Message.hs index 27ccafe41..61bce17c7 100644 --- a/src/Utils/Message.hs +++ b/src/Utils/Message.hs @@ -29,7 +29,7 @@ import Text.Blaze.Html.Renderer.Text (renderHtml) import Text.HTML.SanitizeXSS (sanitizeBalance) -data MessageStatus = Error | Warning | Info | Success +data MessageStatus = Error | Warning | Info | Success | Nonactive deriving (Eq, Ord, Enum, Bounded, Show, Read, Lift, Generic, Typeable) deriving anyclass (Universe, Finite, NFData) @@ -219,7 +219,7 @@ messageTooltip Message{..} = let urgency = statusToUrgencyClass messageStatus Utils.Message.Error -> IconProblem Utils.Message.Warning -> IconWarning Utils.Message.Success -> IconOK - Utils.Message.Info -> IconTooltipDefault) + _ -> IconTooltipDefault) messageIcon tooltip = toWidget messageContent :: WidgetFor site () isInlineTooltip = False diff --git a/src/Utils/Tokens.hs b/src/Utils/Tokens.hs index e072148d2..c6f0229eb 100644 --- a/src/Utils/Tokens.hs +++ b/src/Utils/Tokens.hs @@ -32,44 +32,45 @@ import CryptoID import Text.Blaze (Markup) -bearerParseJSON' :: forall m. - ( Hashable (AuthId (HandlerSite m)), Eq (AuthId (HandlerSite m)) - , HasCryptoUUID (AuthId (HandlerSite m)) (ReaderT CryptoIDKey Parser) - , ParseRoute (HandlerSite m) - , Hashable (Route (HandlerSite m)) - , MonadHandler m +bearerParseJSON' :: forall site m. + ( Hashable (AuthId site), Eq (AuthId site) + , HasCryptoUUID (AuthId site) (ReaderT CryptoIDKey Parser) + , ParseRoute site + , Hashable (Route site) + , MonadSite site m , MonadCrypto m , MonadCryptoKey m ~ CryptoIDKey ) - => m (Value -> Parser (BearerToken (HandlerSite m))) + => m (Value -> Parser (BearerToken site)) -- ^ Read `CryptoIDKey` from monadic context and construct a `Parser` for `BearerToken`s bearerParseJSON' = do cidKey <- cryptoIDKey return return $ flip runReaderT cidKey . bearerParseJSON -bearerToken :: forall m. - ( MonadHandler m - , HasInstanceID (HandlerSite m) InstanceId - , HasClusterID (HandlerSite m) ClusterId - , HasAppSettings (HandlerSite m) +bearerToken :: forall site m. + ( MonadSite site m + , MonadIO m + , HasInstanceID site InstanceId + , HasClusterID site ClusterId + , HasAppSettings site ) - => HashSet (Either Value (AuthId (HandlerSite m))) -- ^ Authority - -> Maybe (AuthId (HandlerSite m)) -- ^ Impersonate - -> HashMap BearerTokenRouteMode (HashSet (Route (HandlerSite m))) + => HashSet (Either Value (AuthId site)) -- ^ Authority + -> Maybe (AuthId site) -- ^ Impersonate + -> HashMap BearerTokenRouteMode (HashSet (Route site)) -> Maybe AuthDNF -- ^ Additional auth -> Maybe (Maybe UTCTime) -- ^ Expiration; @Nothing@ determines default expiry time automatically -> Maybe UTCTime -- ^ Start of Validity; @Nothing@ means token starts to be valid immediately - -> m (BearerToken (HandlerSite m)) + -> m (BearerToken site) -- ^ Smart constructor for `BearerToken`, does not set route restrictions (due to polymorphism), use `tokenRestrict` bearerToken bearerAuthority bearerImpersonate bearerRoutes bearerAddAuth mBearerExpiresAt bearerStartsAt = do bearerIdentifier <- liftIO getRandom bearerIssuedAt <- liftIO getCurrentTime - bearerIssuedBy <- getsYesod $ view instanceID - bearerIssuedFor <- getsYesod $ view clusterID - - defaultExpiration <- getsYesod $ view _appBearerExpiration + bearerIssuedBy <- getsSite $ view instanceID + bearerIssuedFor <- getsSite $ view clusterID + defaultExpiration <- getsSite $ view _appBearerExpiration + let bearerExpiresAt | Just t <- mBearerExpiresAt = t @@ -82,19 +83,20 @@ bearerToken bearerAuthority bearerImpersonate bearerRoutes bearerAddAuth mBearer return BearerToken{..} -encodeBearer :: forall m. - ( MonadHandler m - , HasJSONWebKeySet (HandlerSite m) JwkSet - , HasAppSettings (HandlerSite m) - , HasCryptoUUID (AuthId (HandlerSite m)) m - , RenderRoute (HandlerSite m) +encodeBearer :: forall site m. + ( MonadSite site m + , MonadIO m + , HasJSONWebKeySet site JwkSet + , HasAppSettings site + , HasCryptoUUID (AuthId site) m + , RenderRoute site ) - => BearerToken (HandlerSite m) -> m Jwt + => BearerToken site -> m Jwt -- ^ Call `bearerToJSON` and encode the result as a `Jwt` according to `appJwtEncoding` encodeBearer token = do payload <- Jose.Claims . toStrict . JSON.encode <$> bearerToJSON token - JwkSet jwks <- getsYesod $ view jsonWebKeySet - jwtEncoding <- getsYesod $ view _appBearerEncoding + JwkSet jwks <- getsSite $ view jsonWebKeySet + jwtEncoding <- getsSite $ view _appBearerEncoding throwLeft =<< liftIO (Jose.encode jwks jwtEncoding payload) @@ -106,23 +108,24 @@ data BearerTokenException deriving (Eq, Show, Generic, Typeable) deriving anyclass (Exception) -decodeBearer :: forall m. - ( MonadHandler m - , HasJSONWebKeySet (HandlerSite m) JwkSet - , Hashable (AuthId (HandlerSite m)), Eq (AuthId (HandlerSite m)) - , HasCryptoUUID (AuthId (HandlerSite m)) (ReaderT CryptoIDKey Parser) +decodeBearer :: forall site m. + ( MonadSite site m + , MonadIO m + , HasJSONWebKeySet site JwkSet + , Hashable (AuthId site), Eq (AuthId site) + , HasCryptoUUID (AuthId site) (ReaderT CryptoIDKey Parser) , MonadCryptoKey m ~ CryptoIDKey , MonadCrypto m - , ParseRoute (HandlerSite m) - , Hashable (Route (HandlerSite m)) - , HasAppSettings (HandlerSite m), HasClusterID (HandlerSite m) ClusterId + , ParseRoute site + , Hashable (Route site) + , HasAppSettings site, HasClusterID site ClusterId ) - => Jwt -> m (BearerToken (HandlerSite m)) + => Jwt -> m (BearerToken site) -- ^ Decode a `Jwt` and call `bearerParseJSON` -- -- Throws `BearerTokenException`s decodeBearer (Jwt bs) = do - JwkSet jwks <- getsYesod $ view jsonWebKeySet + JwkSet jwks <- getsSite $ view jsonWebKeySet content <- either (throwM . BearerTokenJwtError) return =<< liftIO (Jose.decode jwks Nothing bs) content' <- case content of Jose.Unsecured _ -> throwM BearerTokenUnsecured @@ -130,11 +133,11 @@ decodeBearer (Jwt bs) = do Jose.Jwe (_header, payload) -> return payload parser <- bearerParseJSON' bearer@BearerToken{..} <- either (throwM . BearerTokenInvalidFormat . uncurry JSON.formatError) return $ JSON.eitherDecodeStrictWith JSON.jsonEOF' (JSON.iparse parser) content' - bearerIssuedFor' <- getsYesod $ view clusterID + bearerIssuedFor' <- getsSite $ view clusterID unless (bearerIssuedFor' == bearerIssuedFor) $ throwM BearerTokenWrongAudience now <- liftIO getCurrentTime - (clockLeniencyStart, clockLeniencyEnd) <- getsYesod $ (,) <$> view _appBearerTokenClockLeniencyStart <*> view _appBearerTokenClockLeniencyEnd + (clockLeniencyStart, clockLeniencyEnd) <- getsSite $ (,) <$> view _appBearerTokenClockLeniencyStart <*> view _appBearerTokenClockLeniencyEnd unless (NTop bearerExpiresAt > NTop (Just $ maybe id addUTCTime (negate <$> clockLeniencyEnd) now)) $ throwM BearerTokenExpired unless (bearerStartsAt <= Just (maybe id addUTCTime clockLeniencyStart now)) $ @@ -142,7 +145,7 @@ decodeBearer (Jwt bs) = do return bearer -askBearer :: forall m. ( MonadHandler m ) +askBearer :: forall m. MonadHandler m => m (Maybe Jwt) -- ^ Retrieve current `Jwt` from HTTP-Header, POST-Parameter, or GET-Parameter askBearer = runMaybeT $ asum diff --git a/src/Yesod/Core/Instances.hs b/src/Yesod/Core/Instances.hs index 76e480a8f..9ffdca574 100644 --- a/src/Yesod/Core/Instances.hs +++ b/src/Yesod/Core/Instances.hs @@ -71,9 +71,6 @@ instance (RenderRoute site, ParseRoute site) => Binary (Route site) where put = Binary.put . toPathPiece get = Binary.get >>= maybe (fail "Could not parse route") return . fromPathPiece -instance RenderRoute site => Hashable (Route site) where - hashWithSalt s = hashWithSalt s . routeToPathPiece - instance Monad FormResult where (FormSuccess a) >>= f = f a diff --git a/src/Yesod/Servant.hs b/src/Yesod/Servant.hs new file mode 100644 index 000000000..3abe2732d --- /dev/null +++ b/src/Yesod/Servant.hs @@ -0,0 +1,592 @@ +{-# OPTIONS_GHC -fno-warn-unused-foralls #-} +{-# LANGUAGE UndecidableInstances #-} + +module Yesod.Servant + ( ServantApiUnproxy, ServantApiUnproxy', ServantApiDirect + , HasRoute(..) + , ServantApi(..), getServantApi + , ServantApiDispatch(..) + , servantApiLink + , ServantHandlerFor(..) + , HasServantHandlerContext(..), getServantContext, getsServantContext, getYesodApproot, renderRouteAbsolute, servantApiBaseUrl + , MonadServantHandler(..), MonadHandler(..), MonadSite(..), MonadRequest(..) + , ServantDBFor, ServantPersist(..), defaultRunDB + , ServantLog(..), ServantLogYesod(..) + , mkYesodApi + , PathPieceHttpApiData(..) + , BearerAuth, SessionAuth + , ServantErrorResponse, getServantErrorResponse + , module Yesod.Servant.HttpApiDataInjective + ) where + +import ClassyPrelude hiding (Handler, fromList, link) +import Control.Lens hiding (Context) +import Control.Lens.Extras + +import Foundation.Servant.Types + +import Utils hiding (HasRoute) +import Model.Types.Security + +import Yesod.Core ( Yesod + , RenderRoute(..), ParseRoute(..) + , YesodSubDispatch(..) + , PathPiece(..) + ) +import Yesod.Core.Types ( YesodRunnerEnv(..) + , YesodSubRunnerEnv(..) + ) +import qualified Yesod.Core as Yesod +import qualified Yesod.Core.Types as Yesod +import qualified Yesod.Persist.Core as Yesod + +import Servant.Links +import Servant.API +import Servant.Server hiding (route) +import Servant.Server.Instances () + +import Servant.Client.Core.BaseUrl + +import Data.Proxy + +import Network.Wai (Request, Middleware) +import qualified Network.Wai as W + +import Language.Haskell.TH hiding (Type) +import qualified Language.Haskell.TH as TH (Type) +import Language.Haskell.Meta.Parse (parseType) +import Yesod.Routes.TH.Types + +import Control.Monad.Fail (MonadFail(..)) + +import Data.Data (Data) +import Data.Kind (Type) +import GHC.Exts (Constraint) + +import Data.Swagger + +import qualified Data.Set as Set + +import Network.HTTP.Types.Status +import Network.HTTP.Types.URI + +import Control.Monad.Trans.Class (MonadTrans) +import Control.Monad.Catch (MonadThrow(..), MonadCatch, MonadMask) +import Control.Monad.Base (MonadBase) +import Control.Monad.Trans.Control (MonadBaseControl) +import Control.Monad.Error.Class (MonadError) + +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text +import Data.Text.Lens (packed) + +import Data.Typeable (eqT, typeRep) + +import Network.URI +import Network.URI.Lens +import GHC.TypeLits (KnownSymbol, symbolVal, KnownNat) + +import Text.Read (Read(readPrec), readP_to_Prec, readPrec_to_P) +import Text.Show (showParen, showString) +import qualified Text.ParserCombinators.ReadP as R +import qualified Data.Char as Char + +import Yesod.Servant.HttpApiDataInjective + +import qualified Data.ByteString.Base64.URL as Base64 (encode) +import qualified Data.Binary.Builder as Builder + +import Database.Persist + +import Data.CryptoID.Class.ImplicitNamespace + +import Control.Monad.Logger + + +renderServantRoute :: Link -> ([Text], [(Text, Text)]) +renderServantRoute link + = ( linkSegments link <&> pack . unEscapeString + , linkQueryParams link <&> paramToPair + ) + where paramToPair (FlagParam str ) = (pack $ unEscapeString str, Text.empty) + paramToPair (ArrayElemParam str val) = (pack $ unEscapeString str, val ) + paramToPair (SingleParam str val) = (pack $ unEscapeString str, val ) + + +escapedSymbol :: forall sym. KnownSymbol sym => Proxy sym -> Text +escapedSymbol _ = pack . escapeURIString isUnreserved . symbolVal $ Proxy @sym + +class HasLink api => HasRoute api where + parseServantRoute :: forall proxy. ServantApiUnproxy' proxy ~ api => ([Text], [(Text, Text)]) -> Maybe (Route (ServantApi proxy)) + +instance HasRoute EmptyAPI where + parseServantRoute _ = Nothing + +instance (Typeable m, Typeable k) => HasRoute (NoContentVerb (m :: k)) where + parseServantRoute ([], _) = Just $ ServantApiRoute (Proxy @(NoContentVerb m)) id mempty mempty + parseServantRoute _ = Nothing + +instance (Typeable m, Typeable k, Typeable s, Typeable ct, Typeable a, IsSubList ct ct ~ (() :: Constraint)) => HasRoute (Verb (m :: k) s ct a) where + parseServantRoute ([], _) = Just $ ServantApiRoute (Proxy @(Verb m s ct a)) id mempty mempty + parseServantRoute _ = Nothing + +instance (Typeable m, Typeable k, Typeable status, Typeable fr, Typeable ct, Typeable a) => HasRoute (Stream (m :: k) status fr ct a) where + parseServantRoute ([], _) = Just $ ServantApiRoute (Proxy @(Stream m status fr ct a)) id mempty mempty + parseServantRoute _ = Nothing + +instance HasRoute sub => HasRoute (HttpVersion :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(HttpVersion :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance HasRoute sub => HasRoute (Vault :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(Vault :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, KnownSymbol realm, Typeable a) => HasRoute (BasicAuth realm a :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(BasicAuth realm a :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, KnownSymbol s) => HasRoute (Description s :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(Description s :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, KnownSymbol s) => HasRoute (Summary s :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(Summary s :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, Typeable tag, Typeable k) => HasRoute (AuthProtect (tag :: k) :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(AuthProtect tag :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance HasRoute sub => HasRoute (IsSecure :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(IsSecure :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance HasRoute sub => HasRoute (RemoteHost :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(RemoteHost :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, Typeable mods, Typeable restr) => HasRoute (CaptureBearerRestriction' mods restr :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(CaptureBearerRestriction' mods restr :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, Typeable mods) => HasRoute (CaptureBearerToken' mods :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(CaptureBearerToken' mods :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (KnownSymbol sym, HasRoute sub, HasLink sub) => HasRoute (sym :> sub) where + parseServantRoute (p : ps, qs) + | p == escapedSymbol (Proxy @sym) + = parseServantRoute @sub @(ServantApiDirect sub) (ps, qs) <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps' qs' -> ServantApiRoute (Proxy @(sym :> endpoint)) f (escapedSymbol (Proxy @sym) : ps') qs' + ServantApiBaseRoute -> ServantApiBaseRoute + parseServantRoute _ = Nothing + +instance (HasRoute a, HasRoute b) => HasRoute (a :<|> b) where + parseServantRoute args = asum + [ parseServantRoute @a @(ServantApiDirect a) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @endpoint) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + , parseServantRoute @b @(ServantApiDirect b) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @endpoint) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + ] + +instance (HasRoute sub, Typeable mods, Typeable ct, Typeable a) => HasRoute (ReqBody' mods ct a :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(ReqBody' mods ct a :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, Typeable mods, Typeable framing, Typeable ct, Typeable a) => HasRoute (StreamBody' mods framing ct a :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(StreamBody' mods framing ct a :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, KnownSymbol sym, Typeable mods, Typeable a) => HasRoute (Header' mods sym (a :: Type) :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(Header' mods sym a :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + +instance (HasRoute sub, Typeable mods, KnownSymbol sym, Typeable v, ToHttpApiDataInjective v, FromHttpApiData v) => HasRoute (Capture' mods sym (v :: Type) :> sub) where + parseServantRoute (p : ps, qs) + | Right v <- parseUrlPiece @v p + = parseServantRoute @sub @(ServantApiDirect sub) (ps, qs) <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps' qs' -> ServantApiRoute (Proxy @(Capture' mods sym v :> endpoint)) (f . ($ v)) (toUrlPieceInjective v : ps') qs' + ServantApiBaseRoute -> ServantApiBaseRoute + parseServantRoute _ = Nothing + +instance (HasRoute sub, Typeable mods, KnownSymbol sym, Typeable plaintext, ToHttpApiDataInjective ciphertext, FromHttpApiData ciphertext, Typeable ciphertext) => HasRoute (CaptureCryptoID' mods ciphertext sym plaintext :> sub) where + parseServantRoute (p : ps, qs) + | Right v <- parseUrlPiece @(CryptoID ciphertext plaintext) p + = parseServantRoute @sub @(ServantApiDirect sub) (ps, qs) <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps' qs' -> ServantApiRoute (Proxy @(CaptureCryptoID' mods ciphertext sym plaintext :> endpoint)) (f . ($ v)) (toUrlPieceInjective v : ps') qs' + ServantApiBaseRoute -> ServantApiBaseRoute + parseServantRoute _ = Nothing + +instance (HasRoute sub, KnownNat major, KnownNat minor, KnownNat patch) => HasRoute (ApiVersion major minor patch :> sub) where + parseServantRoute args = parseServantRoute @sub @(ServantApiDirect sub) args <&> \case + ServantApiRoute (_ :: Proxy endpoint) f ps qs -> ServantApiRoute (Proxy @(ApiVersion major minor patch :> endpoint)) f ps qs + ServantApiBaseRoute -> ServantApiBaseRoute + + +data ServantApi (proxy :: k) = ServantApi + deriving (Eq, Ord, Read, Show, Generic, Typeable) + deriving anyclass (Hashable) + +getServantApi :: forall master proxy. master -> ServantApi proxy +getServantApi _ = ServantApi + +type family ServantApiUnproxy (proxy :: k) :: Type + +type ServantApiUnproxy' :: forall k. forall (proxy :: k) -> Type +type family ServantApiUnproxy' proxy where + ServantApiUnproxy' @Type (ServantApiDirect api) = api + ServantApiUnproxy' @k' proxy = ServantApiUnproxy proxy + +data ServantApiDirect (api :: Type) +type instance ServantApiUnproxy (ServantApiDirect api) = api + +instance HasRoute (ServantApiUnproxy' proxy) => RenderRoute (ServantApi proxy) where + data Route (ServantApi proxy) + = forall endpoint. + ( IsElem endpoint (ServantApiUnproxy' proxy) ~ (() :: Constraint) + , HasRoute endpoint + , Typeable endpoint + ) + => ServantApiRoute + (Proxy endpoint) + (forall a. MkLink endpoint a -> a) + [Text] (HashMap Text [Text]) + | ServantApiBaseRoute + renderRoute (ServantApiRoute (_ :: Proxy endpoint) f _ _) = f $ safeLink' renderServantRoute (Proxy @(ServantApiUnproxy' proxy)) (Proxy @endpoint) + renderRoute ServantApiBaseRoute = mempty + +instance HasRoute (ServantApiUnproxy' proxy) => Eq (Route (ServantApi proxy)) where + (ServantApiRoute (_ :: Proxy endpoint) _ ps qs) == (ServantApiRoute (_ :: Proxy endpoint') _ ps' qs') + = case eqT @endpoint @endpoint' of + Just Refl -> ps == ps' && qs == qs' + Nothing -> False + ServantApiBaseRoute == ServantApiBaseRoute = True + _ == _ = False + +instance HasRoute (ServantApiUnproxy' proxy) => Ord (Route (ServantApi proxy)) where + compare (ServantApiRoute (_ :: Proxy endpoint) _ ps qs) (ServantApiRoute (_ :: Proxy endpoint') _ ps' qs') + = case eqT @endpoint @endpoint' of + Just Refl -> compare ps ps' <> compare qs qs' + Nothing -> typeRep (Proxy @endpoint) `compare` typeRep (Proxy @endpoint') + compare ServantApiBaseRoute ServantApiBaseRoute = EQ + compare ServantApiBaseRoute _ = LT + compare _ ServantApiBaseRoute = GT + +instance HasRoute (ServantApiUnproxy' proxy) => Hashable (Route (ServantApi proxy)) where + hashWithSalt salt (ServantApiRoute (_ :: Proxy endpoint) _ ps qs) = salt `hashWithSalt` (0 :: Int) `hashWithSalt` typeRep (Proxy @endpoint) `hashWithSalt` ps `hashWithSalt` qs + hashWithSalt salt ServantApiBaseRoute = salt `hashWithSalt` (1 :: Int) + +instance HasRoute (ServantApiUnproxy' proxy) => Read (Route (ServantApi proxy)) where + readPrec = readP_to_Prec $ \d -> asum + [ ServantApiBaseRoute <$ R.string "ServantApiBaseRoute" + , do + when (d > 10) . void $ R.char '(' + R.skipSpaces + void $ R.string "ServantApiRoute " + R.skipSpaces + void $ R.string "_ " + R.skipSpaces + asum [ do + void $ R.char '(' + R.skipMany . R.manyTill (R.satisfy $ const True) $ R.char ')' + void $ R.char ' ' + , R.skipMany . R.manyTill (R.satisfy $ not . Char.isSpace) $ R.satisfy Char.isSpace + ] + R.skipSpaces + ps <- readPrec_to_P readPrec 11 + void $ R.char ' ' + R.skipSpaces + qs <- readPrec_to_P readPrec 11 :: R.ReadP (HashMap Text [Text]) + R.skipSpaces + when (d > 10) . void $ R.char ')' + maybe (fail "Could not parse servant route") return $ parseServantRoute (ps, ifoldMap (fmap . (,)) qs) + ] +instance HasRoute (ServantApiUnproxy' proxy) => Show (Route (ServantApi proxy)) where + showsPrec d (ServantApiRoute (_ :: Proxy endpoint) _ ps qs) = showParen (d > 10) + $ showString "ServantApiRoute " + . showsPrec 11 (typeRep $ Proxy @endpoint) + . showString " _ " + . showsPrec 11 ps + . showString " " + . showsPrec 11 qs + showsPrec _ ServantApiBaseRoute = showString "ServantApiBaseRoute" + +instance HasRoute (ServantApiUnproxy' proxy) => ParseRoute (ServantApi proxy) where + parseRoute = parseServantRoute + +newtype ServantErrorResponse + = ServantErrorResponse { getServantErrorResponse :: W.Response } + +class (HasServer (ServantApiUnproxy' proxy) context, HasRoute (ServantApiUnproxy' proxy), HasContextEntry (context .++ DefaultErrorFormatters) ErrorFormatters) => ServantApiDispatch context m master proxy | master proxy -> context m where + servantContext :: ServantApi proxy -> master -> Request -> Yesod.HandlerFor master (Context context) + servantHoist :: ServantApi proxy -> master -> Request -> Context context -> (forall a. m a -> Handler a) + servantMiddleware :: ServantApi proxy -> master -> Context context -> Middleware + servantYesodMiddleware :: ServantApi proxy -> master -> Yesod.HandlerFor master Middleware + servantServer :: ServantApi proxy -> master -> ServerT (ServantApiUnproxy' proxy) m + +instance ServantApiDispatch context m master proxy => YesodSubDispatch (ServantApi proxy) master where + yesodSubDispatch YesodSubRunnerEnv{..} req + = ysreParentRunner handlerT ysreParentEnv (ysreToParentRoute <$> route) req + where + master :: master + master = yreSite ysreParentEnv + proxy :: ServantApi proxy + proxy = ysreGetSub master + + route = parseRoute ( W.pathInfo req + , over (traverse . _2) (fromMaybe Text.empty) . queryToQueryText $ W.queryString req + ) + + handlerT :: Yesod.HandlerFor master Yesod.TypedContent + handlerT = do + yesodMiddleware <- servantYesodMiddleware proxy master + ctx <- servantContext proxy master req + + let server' = hoistServerWithContext (Proxy @(ServantApiUnproxy' proxy)) (Proxy @context) (servantHoist proxy master req ctx) (servantServer proxy master) + toTypedContent = error "Servant handler did not shortcircuit" + sendResponse res = case yesodError of + Just err -> do + Yesod.cacheSet $ ServantErrorResponse res + throwM . Yesod.HCError =<< liftIO (err <$> resText) + Nothing -> do + when (is _Nothing route) $ + $(Yesod.logErrorS) "Servant" "Could not parse route even though servant responded successfully" + + Yesod.sendWaiResponse res + where + status = W.responseStatus res + resText = toText <$> getResBS + where + toText bs = case Text.decodeUtf8' bs of + Right t -> t + Left _ -> Text.decodeUtf8 $ Base64.encode bs + + (_, _, resStream) = W.responseToStream res + getResBS = resStream $ \runStream -> do + resVar <- newTVarIO Builder.empty + runStream (\chunk -> atomically $ modifyTVar' resVar (<> chunk)) (return ()) + toStrict . Builder.toLazyByteString <$> readTVarIO resVar + + yesodError :: Maybe (Text -> Yesod.ErrorResponse) + yesodError + | status == notFound404 + = Just $ const Yesod.NotFound + | status == internalServerError500 + = Just Yesod.InternalError + | status == badRequest400 + = Just $ Yesod.InvalidArgs . pure + | status == unauthorized401 + = Just $ const Yesod.NotAuthenticated + | status == forbidden403 + = Just Yesod.PermissionDenied + | status == methodNotAllowed405 + = Just . const . Yesod.BadMethod $ W.requestMethod req + | otherwise = Nothing + + fmap toTypedContent . withUnliftIO $ \UnliftIO{..} -> + (yesodMiddleware . servantMiddleware proxy master ctx $ serveWithContext (Proxy @(ServantApiUnproxy' proxy)) ctx server') req $ unliftIO . sendResponse + +servantApiLink :: forall p1 p2 proxy endpoint. + ( IsElem endpoint (ServantApiUnproxy' proxy) ~ (() :: Constraint), HasRoute (ServantApiUnproxy' proxy), HasLink endpoint, Typeable endpoint ) + => p1 proxy + -> p2 endpoint + -> MkLink endpoint (Route (ServantApi proxy)) +servantApiLink _ _ = safeLink' (fromMaybe (error "Could not parse result of safeLink'") . guardEndpoint . parseServantRoute @(ServantApiUnproxy' proxy) . renderServantRoute) (Proxy @(ServantApiUnproxy' proxy)) (Proxy @endpoint) + where + guardEndpoint :: Maybe (Route (ServantApi proxy)) -> Maybe (Route (ServantApi proxy)) + guardEndpoint x@(Just (ServantApiRoute (_ :: Proxy endpoint') _ _ _)) + | Just Refl <- eqT @endpoint @endpoint' = x + guardEndpoint _ = Nothing + + +class HasServantHandlerContext site where + data ServantHandlerContextFor site :: Type + getSCtxSite :: ServantHandlerContextFor site -> site + getSCtxRequest :: ServantHandlerContextFor site -> Request + +newtype ServantHandlerFor site a = ServantHandlerFor { unServantHandlerFor :: ServantHandlerContextFor site -> Handler a } + deriving (Generic, Typeable) + deriving (Monad, Functor, Applicative, MonadIO, MonadThrow, MonadCatch, MonadMask, MonadBase IO, MonadBaseControl IO, MonadError ServerError) via (ReaderT (ServantHandlerContextFor site) Handler) + +instance MonadUnliftIO (ServantHandlerFor site) where + withRunInIO cont + = ServantHandlerFor $ \app -> withRunInIO $ \unliftHandler -> cont (unliftHandler . flip unServantHandlerFor app) + +getServantContext :: (site ~ site', MonadServantHandler site m) => m (ServantHandlerContextFor site') +getServantContext = liftServantHandler $ ServantHandlerFor return + +getsServantContext :: (site ~ site', MonadServantHandler site m) => (ServantHandlerContextFor site' -> a) -> m a +getsServantContext = liftServantHandler . ServantHandlerFor . (return .) + +getYesodApproot :: (Yesod site, MonadSite site m, MonadRequest m) => m Text +getYesodApproot = Yesod.getApprootText Yesod.approot <$> getSite <*> getRequest + +renderRouteAbsolute :: (Yesod site, MonadSite site m, MonadRequest m) => Route site -> m URI +renderRouteAbsolute (renderRoute -> (ps, qs)) = addRoute . unpack <$> getYesodApproot + where addRoute root = case parseURI root of + Just root' -> root' & uriPathLens . packed %~ addPath + & uriQueryLens . packed %~ addQuery + Nothing -> error "Could not parse approot as URI" + addPath p = p <> "/" <> Text.intercalate "/" ps + addQuery q | null qs = q + addQuery "" = "?" <> Text.intercalate "&" (map (\(q, v) -> q <> "=" <> v) qs) + addQuery "?" = addQuery "" + addQuery q = q <> "&" <> tailEx (addQuery "") + +servantApiBaseUrl :: (Yesod site, MonadSite site m, MonadRequest m, MonadThrow m) => (Route (ServantApi proxy) -> Route site) -> m BaseUrl +servantApiBaseUrl = parseBaseUrl . ($ mempty). uriToString (const "") <=< renderRouteAbsolute . ($ ServantApiBaseRoute) + +class (MonadIO m, HasServantHandlerContext site) => MonadServantHandler site m | m -> site where + liftServantHandler :: forall a. ServantHandlerFor site a -> m a + +instance HasServantHandlerContext site => MonadServantHandler site (ServantHandlerFor site) where + liftServantHandler = id + +instance (MonadTrans t, MonadIO (t (ServantHandlerFor site)), HasServantHandlerContext site) => MonadServantHandler site (t (ServantHandlerFor site)) where + liftServantHandler = lift + +class MonadIO m => MonadHandler m where + liftHandler :: forall a. Handler a -> m a + +instance MonadHandler (ServantHandlerFor site) where + liftHandler = ServantHandlerFor . const + +instance (MonadTrans t, MonadIO (t (ServantHandlerFor site))) => MonadHandler (t (ServantHandlerFor site)) where + liftHandler = lift . ServantHandlerFor . const + +class Monad m => MonadSite site m | m -> site where + getSite :: m site + + getsSite :: (site -> a) -> m a + getsSite f = f <$> getSite + +instance HasServantHandlerContext site => MonadSite site (ServantHandlerFor site) where + getSite = liftServantHandler . ServantHandlerFor $ return . getSCtxSite + +instance MonadSite site (Reader site) where + getSite = ask + getsSite = asks + +instance {-# OVERLAPPABLE #-} (Yesod.MonadHandler m, site ~ Yesod.HandlerSite m) => MonadSite site m where + getSite = Yesod.getYesod + getsSite = Yesod.getsYesod + +instance {-# OVERLAPPING #-} (MonadTrans t, Monad (t (ServantHandlerFor site)), HasServantHandlerContext site) => MonadSite site (t (ServantHandlerFor site)) where + getSite = lift getSite + getsSite = lift . getsSite + +class Monad m => MonadRequest m where + getRequest :: m Request + +instance HasServantHandlerContext site => MonadRequest (ServantHandlerFor site) where + getRequest = liftServantHandler . ServantHandlerFor $ return . getSCtxRequest + +instance {-# OVERLAPPABLE #-} (Yesod.MonadHandler m, Monad m) => MonadRequest m where + getRequest = Yesod.waiRequest + +instance {-# OVERLAPPING #-} (MonadTrans t, Monad (t (ServantHandlerFor site)), HasServantHandlerContext site) => MonadRequest (t (ServantHandlerFor site)) where + getRequest = lift getRequest + + +type ServantDBFor site = ReaderT (Yesod.YesodPersistBackend site) (ServantHandlerFor site) + +class Yesod.YesodPersist site => ServantPersist site where + runDB :: forall a. ServantDBFor site a -> ServantHandlerFor site a + +defaultRunDB :: ( PersistConfig c + , ServantDBFor site a ~ PersistConfigBackend c (ServantHandlerFor site) a + , HasServantHandlerContext site + ) + => Getting c site c + -> Getting (PersistConfigPool c) site (PersistConfigPool c) + -> ServantDBFor site a -> ServantHandlerFor site a +defaultRunDB confL poolL f = do + app <- getSite + runPool (app ^. confL) f (app ^. poolL) + + +class ServantLog site where + servantLogLog :: (MonadIO m, ToLogStr msg) => site -> Loc -> LogSource -> LogLevel -> msg -> m () + +newtype ServantLogYesod site = ServantLogYesod { unServantLogYesod :: site } + +instance Yesod site => ServantLog (ServantLogYesod site) where + servantLogLog (ServantLogYesod app) a b c (toLogStr -> d) = liftIO $ do + logger <- Yesod.makeLogger app + Yesod.messageLoggerSource app logger a b c d + +instance (ServantLog site, HasServantHandlerContext site) => MonadLogger (ServantHandlerFor site) where + monadLoggerLog a b c d = do + app <- getSite + servantLogLog app a b c d + +instance (ServantLog site, HasServantHandlerContext site) => MonadLoggerIO (ServantHandlerFor site) where + askLoggerIO = servantLogLog <$> getSite + + +newtype PathPieceHttpApiData a = PathPieceHttpApiData { unPathPieceHttpApiData :: a } + deriving (Eq, Ord, Read, Show, Generic, Typeable, Data) + deriving newtype (PathPiece, ToParamSchema) +instance PathPiece a => FromHttpApiData (PathPieceHttpApiData a) where + parseUrlPiece = maybe (Left "Could not convert from HttpApiData via PathPiece") Right . fromPathPiece +instance PathPiece a => ToHttpApiData (PathPieceHttpApiData a) where + toUrlPiece = toPathPiece + + +mkYesodApi :: Name -> [ResourceTree String] -> DecsQ +mkYesodApi (nameBase -> masterN) ress = do + let toPiecesApi :: [Piece String] + -> ResourceTree String + -> MaybeT Q [([Piece String], TH.Type, [Text])] + toPiecesApi ps (ResourceLeaf Resource{..}) = do + Subsite{..} <- pure resourceDispatch + Just tn <- lift $ lookupTypeName subsiteType + TyConI (TySynD _ [] (ConT conN `AppT` apiT)) <- lift $ reify tn + guard $ conN == ''ServantApi + return $ pure (ps <> resourcePieces, ConT ''ServantApiUnproxy' `AppT` apiT, map pack resourceAttrs) + toPiecesApi ps (ResourceParent _ _ ps' cs) + = lift . fmap concat $ mapMaybeM (toPiecesApi (ps <> ps')) cs + apiRess <- concat <$> mapMaybeM (toPiecesApi []) ress + + let apiType + | Just apiRess' <- fromNullable $ map apiEndpoint apiRess + = ofoldr1 (\e acc -> conT ''(:<|>) `appT` e `appT` acc) apiRess' + | otherwise + = conT ''EmptyAPI + + apiEndpoint (pieces, apiT, attrs) = withAuth attrs $ + foldr (\p acc -> conT ''(:>) `appT` apiPiece p `appT` acc) (return apiT) pieces + + withAuth attrs typ = case authDNF of + Left t + -> fail $ "Invalid auth tag: " <> unpack t + Right PredDNF{..} | (impureNonNull . Set.singleton $ PLVariable AuthFree) `Set.member` dnfTerms + -> typ + Right PredDNF{..} | (impureNonNull . Set.singleton $ PLVariable AuthToken) `Set.member` dnfTerms + -> conT ''(:>) `appT` conT ''BearerAuth `appT` typ + Right _ + -> conT ''(:>) `appT` conT ''SessionAuth `appT` typ + where authDNF = parsePredDNF defaultAuthDNF attrs + + apiPiece (Static str) = litT $ strTyLit str + apiPiece (Dynamic str) = conT ''PathPieceHttpApiData `appT` either fail return (parseType str) + + sequence + [ tySynD (mkName $ masterN <> "Api") [] apiType + ] diff --git a/src/Yesod/Servant/HttpApiDataInjective.hs b/src/Yesod/Servant/HttpApiDataInjective.hs new file mode 100644 index 000000000..1cd6097c3 --- /dev/null +++ b/src/Yesod/Servant/HttpApiDataInjective.hs @@ -0,0 +1,90 @@ +{-# LANGUAGE UndecidableInstances #-} + +module Yesod.Servant.HttpApiDataInjective + ( ToHttpApiDataInjective(..) + ) where + +import ClassyPrelude hiding (Builder) +import Web.HttpApiData +import Network.HTTP.Types.URI (encodePathSegmentsRelative) + +import qualified Data.Text.Lazy as Lazy (Text) + +import Data.Binary.Builder (Builder) + +import Data.Void (Void) +import Data.Int (Int8, Int16) +import Data.Word (Word16) +import Numeric.Natural (Natural) +import Data.Fixed (Fixed) +import Data.UUID (UUID) +import Data.Time (ZonedTime, LocalTime, TimeOfDay, NominalDiffTime, DayOfWeek) +import Data.CaseInsensitive (CI) +import Data.CaseInsensitive.Instances () +import qualified Data.CaseInsensitive as CI +import Data.Version (Version) +import Data.Monoid (Any, All) + +import Data.CryptoID (CryptoID(..)) + + +class ToHttpApiData a => ToHttpApiDataInjective a where + toUrlPieceInjective :: a -> Text + toUrlPieceInjective = toUrlPiece + + toEncodedUrlPieceInjective :: a -> Builder + toEncodedUrlPieceInjective = encodePathSegmentsRelative . pure . toUrlPiece + + -- | Convert to HTTP header value. + toHeaderInjective :: a -> ByteString + toHeaderInjective = encodeUtf8 . toUrlPiece + + -- | Convert to query param value. + toQueryParamInjective :: a -> Text + toQueryParamInjective = toQueryParam + +instance ToHttpApiDataInjective () +instance ToHttpApiDataInjective Bool +instance ToHttpApiDataInjective Ordering +instance ToHttpApiDataInjective Void +instance ToHttpApiDataInjective Double +instance ToHttpApiDataInjective Float +instance ToHttpApiDataInjective Int +instance ToHttpApiDataInjective Int8 +instance ToHttpApiDataInjective Int16 +instance ToHttpApiDataInjective Int32 +instance ToHttpApiDataInjective Int64 +instance ToHttpApiDataInjective Integer +instance ToHttpApiDataInjective Natural +instance ToHttpApiDataInjective Word +instance ToHttpApiDataInjective Word8 +instance ToHttpApiDataInjective Word16 +instance ToHttpApiDataInjective Word32 +instance ToHttpApiDataInjective Word64 +instance ToHttpApiData (Fixed a) => ToHttpApiDataInjective (Fixed a) +instance ToHttpApiDataInjective Char +instance ToHttpApiDataInjective Text +instance ToHttpApiDataInjective Lazy.Text +instance ToHttpApiDataInjective String +instance ToHttpApiDataInjective str => ToHttpApiDataInjective (CI str) where + toUrlPieceInjective = toUrlPieceInjective . CI.foldedCase + toEncodedUrlPieceInjective = toEncodedUrlPieceInjective . CI.foldedCase + toHeaderInjective = toHeaderInjective . CI.foldedCase + toQueryParamInjective = toQueryParamInjective . CI.foldedCase +instance ToHttpApiDataInjective Version +instance ToHttpApiDataInjective All +instance ToHttpApiDataInjective Any +instance ToHttpApiDataInjective UTCTime +instance ToHttpApiDataInjective ZonedTime +instance ToHttpApiDataInjective LocalTime +instance ToHttpApiDataInjective TimeOfDay +instance ToHttpApiDataInjective NominalDiffTime +instance ToHttpApiDataInjective Day +instance ToHttpApiDataInjective DayOfWeek +instance ToHttpApiDataInjective UUID +instance ToHttpApiDataInjective a => ToHttpApiDataInjective (Maybe a) +instance ToHttpApiDataInjective a => ToHttpApiDataInjective (CryptoID ns a) where + toUrlPieceInjective = toUrlPieceInjective . ciphertext + toEncodedUrlPieceInjective = toEncodedUrlPieceInjective . ciphertext + toHeaderInjective = toHeaderInjective . ciphertext + toQueryParamInjective = toQueryParamInjective . ciphertext diff --git a/stack.yaml b/stack.yaml index 3dd0e2dab..80e724356 100644 --- a/stack.yaml +++ b/stack.yaml @@ -84,7 +84,7 @@ extra-deps: commit: 71a630edaf5f22c464e24fac8d9d310f4055ea1f - git: git@gitlab2.rz.ifi.lmu.de:uni2work/esqueleto.git - commit: b9987d94af9d7403eded8ca75ad761eb7fc06e4c + commit: e18dd125c5ea26fa4e88bed079b61d8c1365ee37 - classy-prelude-yesod-1.5.0@sha256:8f7e183bdfd6d2ea9674284c4f285294ab086aff60d9be4e5d7d2f3c1a2b05b7,1330 - acid-state-0.16.0.1@sha256:d43f6ee0b23338758156c500290c4405d769abefeb98e9bc112780dae09ece6f,6207 @@ -102,6 +102,8 @@ extra-deps: - unidecode-0.1.0.4@sha256:99581ee1ea334a4596a09ae3642e007808457c66893b587e965b31f15cbf8c4d,1144 # - wai-middleware-prometheus-1.0.0@sha256:1625792914fb2139f005685be8ce519111451cfb854816e430fbf54af46238b4,1314 - hlint-test-0.1.0.0@sha256:e427c0593433205fc629fb05b74c6b1deb1de72d1571f26142de008f0d5ee7a9,1814 + - servant-quickcheck-0.0.10.0@sha256:1d5849d703c2487752f8fc7391cca7c998ee24f54ca0bb72d238bf99b64ac667,3755 + - servant-flatten-0.2@sha256:276896f7c5cdec5b8f8493f6205fded0cc602d050b58fdb09a6d7c85c3bb0837,1234 - network-arbitrary-0.7.0.0@sha256:0cd381c80ae20c16048936edcdb018b1d9fbe2b6ac8c44e908df403a5c6d7cd5,2520 # - process-extras-0.7.4@sha256:4e79289131415796c181889c4a226ebab7fc3b0d27b164f65e1aad123ae9b9e3,1759 diff --git a/stack.yaml.lock b/stack.yaml.lock index 531c27d3f..e55d4209e 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -428,15 +428,15 @@ packages: commit: 71a630edaf5f22c464e24fac8d9d310f4055ea1f - completed: name: esqueleto - version: 3.5.2.0 + version: 3.5.4.0 git: git@gitlab2.rz.ifi.lmu.de:uni2work/esqueleto.git pantry-tree: - size: 5630 - sha256: b949af2533893ffd16407825d22c0a524ffa48cdd0eab91644cbe0dc4b2c8319 - commit: b9987d94af9d7403eded8ca75ad761eb7fc06e4c + size: 5633 + sha256: 8a93dc98eb4529ff64aa5bcdaa3c00dcdf0378033ad675864e2b0fc3d869d947 + commit: e18dd125c5ea26fa4e88bed079b61d8c1365ee37 original: git: git@gitlab2.rz.ifi.lmu.de:uni2work/esqueleto.git - commit: b9987d94af9d7403eded8ca75ad761eb7fc06e4c + commit: e18dd125c5ea26fa4e88bed079b61d8c1365ee37 - completed: hackage: classy-prelude-yesod-1.5.0@sha256:8f7e183bdfd6d2ea9674284c4f285294ab086aff60d9be4e5d7d2f3c1a2b05b7,1330 pantry-tree: @@ -500,6 +500,20 @@ packages: sha256: 347eac6c8a3c02fc0101444d6526b57b3c27785809149b12f90d8db57c721fea original: hackage: hlint-test-0.1.0.0@sha256:e427c0593433205fc629fb05b74c6b1deb1de72d1571f26142de008f0d5ee7a9,1814 +- completed: + hackage: servant-quickcheck-0.0.10.0@sha256:1d5849d703c2487752f8fc7391cca7c998ee24f54ca0bb72d238bf99b64ac667,3755 + pantry-tree: + size: 976 + sha256: 37dab60111c71d011fc4964e9a8b4b05ac544bc0ba8155e895518680066c2adb + original: + hackage: servant-quickcheck-0.0.10.0@sha256:1d5849d703c2487752f8fc7391cca7c998ee24f54ca0bb72d238bf99b64ac667,3755 +- completed: + hackage: servant-flatten-0.2@sha256:276896f7c5cdec5b8f8493f6205fded0cc602d050b58fdb09a6d7c85c3bb0837,1234 + pantry-tree: + size: 325 + sha256: 04f12c7bef2c3f9a25d94eb9489752ed498db8e243069fe95838dbb51df1dcb3 + original: + hackage: servant-flatten-0.2@sha256:276896f7c5cdec5b8f8493f6205fded0cc602d050b58fdb09a6d7c85c3bb0837,1234 - completed: hackage: network-arbitrary-0.7.0.0@sha256:0cd381c80ae20c16048936edcdb018b1d9fbe2b6ac8c44e908df403a5c6d7cd5,2520 pantry-tree: diff --git a/templates/course.hamlet b/templates/course.hamlet index 2205d1f73..de6452829 100644 --- a/templates/course.hamlet +++ b/templates/course.hamlet @@ -93,6 +93,13 @@ $# #{summary}

2I+=J( z$uzWe2Q%Axo>8Z9+Hi*m4JwXN&M}FGxXx`GsWghFyX$-1XKyY}z7ElErd68D!{wYX zo-Q$rd*+ZMT4BTG`1G{rn2za4qG_Nl5bU=tc%7C>qNh4|9`Rd(Y^Y+1 zPhlfV2t+1&F;9xh!fiANAq!f4sV=k1l@CecIL-^Gg--iMI0>O<-YwsYI^4Fl=-8va z%&TgBu;Kys;Tm?Xt}!=e^87>ME@vD&Yfwa)y%-i&bV!M`$vE4^X2TpO5?M|pgjzP& zTy>3JZ;U$`B3oJSsO;vTA48~zBeF=sY{_H}YIwX+z@8na5!1=EJ4`2dZZ)bKg`yqR zm4U%@r0)BSrthcaKDb11BSZ%>>?BJeF$k=5^wYGlnVG4XT6L8cC0fRH!`@8iY}kh3 zO;W>|nwKJ4qlnRhyUgHp!p>9TCk)*2id6RV5r#7{b&el7&mH$1zZs-N8GJt)icV{% z&Zk^WPg|HDVv=}v^31g^$m1=l)9D;x6A3>OsJDBb!p$+l>C2tfrtpn){b-hKn05nY zzR(Z12B|g6nl6Vm*NsMY@WX2^G$C7RBL_7y@#^o|@+7!u=bqhgI`ZHkjK$Vs*%6xO zcH5H~1njYK8heMM7 z_>5s9l4!b1g}eYTA%H0Hcwl65!;7}s6T}jfwgej%DTA6~5g8v1A#jb1Cz00!nwT>q z6RwGF)5kJzaL~^#*MM@J>#c`V#B$ic(a&sTr=e@8nFk{T_MIa+DLQ2^^KQ?P-QS&F zP6{wVnRL~fsUH|v!VPH3nE3M>b@n-J@ABK<;EfWYn6*4ZPuy$Zq6bdvMdPCNfh38(9~6VAQ+k zJr1$ga{zOL2cLs2Cc*nQ1UZ3c%bON0nqxMf3HI;27M|&od};!dli3L(c*)GlQaE^n zoIs3xYTUxV9GZt+bFK*8T4Ezyjp&{@L7RhGo01(fwsORA6xs|XXovJ^3Wj8`+{NHt zak`awRARF|2Y_hdDeK=H6(e#0Yl2y*wG*;snz>d*tFv0;c$io%8w|@mL^$qk50h|9OC>cZl*)F| zDjD36@2NF)!RAB_(3rJ6XFO+&%MIG28ndX!ZEKF#ph=Be_Dz&+Ul}KzG@4nE+yx@L z5JbLB_MXuoomQQ$gf^?2vb5ad`o1`A<+ftcdb_hOYE#5akItUB%mU&yHnOjY;y`l9 z@={YZI94VT$ZmF_s5KMTO>vypF<~iVZWxK)_%WATO>7H@@^t3*LsY0IQOmI#mkS-V zLnPa{C}~}mD~TNLwA)XGDzxZnH+1@^?Qt;^CB!Q`Jmxtr3a+1Myl-Ti>D@VSK!<~J z!r7MNf^|<4Of9fZH(25Mq84vWWHvVxta%_WX`U;D@ZIt1xU@a3;+Fb#Q+sFPA0`e! zg$T!OWm%4A*&D??KPxOU-&GZLjv^NZ3_Pw}MtWNBidZ~09u{3QW((lmJK7_lh=JO9 z#B@maa5ZLuYb_H@T(o6kT-)J9D=unEPEpcZHf~#y9H!Mb5w`En_H$_Ej9Dye1IjEq z3kWQkB+V2glB0MWAj%z}^66#ZhPtL)8=Uac(+YUT8@p|Zf`FbksxjI-7g;gHG#%N< zF!EX7%Zsq@-@;2)ni6ybCXg7D!#3O-1`N@Glc?c=Cy?``@8F@ zj^Mkf8NqBjK%QHW&eTw5-jk-9)Mp+X%AXSmM!Z@%8-zO+?~Bt*O71>RCG1l9g~o1) ziDs>yhI`~@M=out>xjK=@e@+-1BQ@z@!<-a3`jAkJ&&;XT={0u#u%$<$6bwF@`VU% z;wnFZc@}r;2JK{W&W_PXQ1{|T$9KT7%`-7w({0$pirXBNXwFUsX)6+kXc{KF!x}J~al^pbLVmJ&W>Iz#n0@&0bAp7cwib~56)MBMa2_w7M6n(^HRFlnv7B_K z4JhfdM)2kg;mVn#J}u54%VT6mgicN8Et}%O@q!2~OHxWHhh@P1qem9clQcu_q@H-+ zB(`S6LQZ24#`Cz0MIm%_VXqh$XLK?V(~d1tjwO~leNR_WeB{?FUA#tl$9$r*&sfR@ z3xq_`h?54XB;3{<@xa_T@^IUM!Xy<0DBch!iouY(iXvJjgZOT~kHN!5NxQ388D8YVM9~GMJ%z182@=LL_ z5Oc%`IS1l2nhbR2f}CnW!VZ=W6OM7j&x5DAut^*zTpUBRJFeN5sm#gROPo~WyhPw! zu4l&sc4K%vYn4+=NGO5X_m1tp#&C=6r^*Ztct=T^ zYmXE$+db*zSwzk(UAjt4PgeC-k*0OfEGIXmrm{n;&&?eWu{i zLlO_n>{P@x+dJ9Cv{+;*?U-QgS&v$ShdEi&9dEWb4m`l>DW*;qw^iFWF4)aCM;YrK z8r2kNXgDdToV*DQ2Mid1qD&ClgN)B(N^heZFU<2ztZwb~T2ii@LP@W^cbDkr$xbn> zOQw7|3eybYlE<5e2VA?~Jy&crl59C-Lz^o#n1RsrL`)bU+QmMVwoclQEpdEhAh-># zp5W#jwJI7LQ&WSiTE;Z`&X%}{I^(VJb6e$OSGk19b3#&2lFr`N@Eva66rDnYbX#skfBXBD=2H zyO+sv4Z15_sEtHfYB3z>v3BjtaO-+626qQ5g1L+1T5|?3TV6PJ?Tz6fGmqDcGpEBk z?Qz0{9QrQZp4z&MXfWMd@I03VOb2F8LFJ~jK(KGeWMa)?U%BW!?n(i0Y{{+*{7`l5N>%92qr=)XZDjaYfcQ!Lusz zb(x1*rZ%9qGtAz!J`FWd0f7VXmLjEwN*_2SqJ`lZTEKQKyHMPy4Lgyrc7X>KEw%=& zj`vdS7=Cxsy+g7oiRIgv;MW=Ix5-*%HOpNX(EM@4Q*h`=!1#^Jy>a3pGj=9|R$qxB zv#t$qvu~!e69$`|w;6O0j3(u@)unm1?f$-da>(H1?Hmqn4IAgaZ5i|jftcTeCM$%> z?0{U@mXLX?S-%nXZ+^EUp(Fe%xNI?evKWXXEO|GtOw7#;#kWHqP-9M8j@o7+jcDF* zJ}b?*Yuh&9^Y+-s7pM+Umlc`SJJ&KX#)i-^KyQPVLQUo|1#}=V3nar&QvYsG_Krlj z>FL-{cV>M25rb(kBOPH=yS#ITyLZUnT?q_uRL~R@V}eeP>wE{Q^9emk@vyMy2YB*- zNCqytA3q`tKzSVy&THOuA8JtJ3YZ|GC~&>$n<2@b>5;+7+mI=s?u{`lCggLsNT3cb z4xAGtclN*(4Lj54${ITD14a+H%cFMahmAZJYpdExmz) zl1YPuhKNF|m@u-&QwR)%iipg~Nn{w23`d6GW;D!pDYUVSjwGc6t-#|>33M@oU3|(g zUN`(>NA8M2{=wtIu~ciLx;&vUc*P1 zSf{DxbRm0|6qFvhUCqq(I`U4^2fXfd(LkPZW6bZ@wciL#ycF*bBgH$Nme@VPIxxm@ zG_#A7n(bM*6cJ;YeO%fu+=defw$;Jw=N4AEB~FN&!Y;0#0oXY+*y&K}3v0lME}1$# zTDlD)kUC*-wqX39$vksCIGnZ^SX9o2_~%^`O)a>%kmeX|so3kCvlFDfj2wW1Pg4-= z5~i&dPCq8QSd2{rLk|#XEiG%m9C#cVnPFs_YBL4M)m*zaT_>k=T$f8Cs3uPXDyuRL zxtA4(D%w33iZf3}wIN1PLBQGxaCBm5(-DDz)S;LVp;{j*kTmc|gwxWZJMW>YNo};& z)huP23u7I>SFw=x2HB~1T^u)Qc2UsOr-P3qx0^)RGK>TVGJb;|o>1vTIROykLh&#o zGYwU#4&q{x|4u7!rED0-Ozbq;&t93WmjUdJveUO!5mZuDSjQ38aJD%EqsobWGbl{N z#vr1VJFj6g=mwBIPj_tv1Vg}jB~M=hYr+p4F(iCxxS}GWh0+v;`XjK!I)FfDJP4eg zk&smcN9n*bLqnJb5sP!|(~X7@5?W0YNF4(~yS&h1c3*FN9C!ndReE@(dnoq=CwBI9 zOvcPI*WMFGCXQ1GVu+q0SR+F8Jh3}<;e)1)6SCgJ2r#W2QFmq6wG6c;OOt8cK)FD5 zIT&CmoF*8GV1XP5N7Zn*&rS)PaZa!i6qPT3m!rR4yyj}kZ41n7XEd64>F_jS(V7J$ zJffyoFbr@+DhtLo^6i6m4jVHGywKA&Y-uH8Hv^wkNd@pRXb&#m=QPKfa!z7Bc|z&7@0?SrCfweE^@&J0$P<0;$oVK zg_3vHGHfu%Fg$gKV4RRum=gq!&j*DLf@88MJiBjau61z$D9S5X#2zBex?r1$b z_Bh0-DWYkrFwCpl)$G&ccvulP160l4;+X?Zj@@Y>xguCbtzq9y`uWnU0=4f_Los zJA#ZL;SkfaWOQM=sB0pF90dg8Aa&XkQD){L1r~KEWx-*>LOeyFY~)9lF^oNzyQyO8 zOhRm9eC#}fg~|}RF1*%dlbSjvlZQrYcH2~T?N)%@ce;}Tn2~ot@+FOoajyJU6b^*$ zAtBu84#Pm(T)UCm5Js_wo|N~*3r)g7W;1Ct1icq+ftg5vLLm~13r<`e`0vwva?obY z>cYBSgRC=P+Uy`f>kr53LGmauK#uWe<7{=j)&+$TtVB+m#4#j-Mos{gvjjH0Bn1ry zn41Z9O3O=ybrYigkWkcdAox1dJ7Rk zP4_8+5Gh!cp<;}7`T`6Y7O}>fBqWCd$`F_)seod+={kp%OhdV%NgyU!WEdrqiG`vN znMy(+mjg&cFC5S_D|HRSu0OV`&Kz6=A+b7O>C}Q@P9q93*ph5vXxr2ajW$89)|!!K zwC0>ZqBAiGX-QR{3{`QE$1nmU(V2lN;tuS+HsB2u>E#%RLPQK=Dp4s-a|qF)#&F14 z#nR(;TIgsui8TbG8yK|F{)QyUe)v}zIFZyYfP@E9L;`OQgdVD-(lW^jF>l-_9o~IC z=KQeW#)}I_xzg4i++|BdbEAorD5CPNBo~HZ-DVAP$?kqD#r_s|oa+?&3+>KK25&sM z)Yn-yws7=v^}*NXA^H5-ez0)&u9Crm`H62Q(p1&Qc`>)TEHTX0kg6mox)Eeh{Eh+X zW03;YTVHhDCpfdSv}|HJ8RL_lp-)iBW?dc_vcW@8dFokw1s&L0~%!be;fMC!cz zv|#Q~LD9bl3E^_*HLMJq2&HIcCUscc)0k4_jaqM8)~A$YjE+Ui%N9N<@UVD%+#m-` z+slj$!MoWH(=?39FeU|DWoH51I>1whkVq1c7}aAA2YP*F_z~8uSX_=jmX9RrJoS7@ zLUhh@&t-Ovg`7jfh+Wh7-Y&Sta(KMPGRPZmMKTdMK@vMigpDrZXe3trD9F`r@LFaM zNHi=V6^Jc3?0B!?fV*#0Wb&qCz_KRA>ZUH60-Qt9-FD4)S=IWXjcw}~d`=O=D(&Jo zyLc^x#PVu9yxu$Z2%uqdv%T|*sHm`9p`oZxjkyxJBhy)i4);0<(;XbnCcD{+CnUOt z&Sw*o0$fvao;DCtW7ly8FKPHYJ8s-srK3D<`Nl{#tUHq|kv=#$y!O{@IYpVs@E50B z?Sww#RBMI38G??hyj`g@piCfO<>2o9x>Gf{+G}d^p8A{d`LxV!H#|XXa-1i{Skx3J zYXr#!pIMEPau5*<6(C1c^&ZDm?X#+TdWTc02Z%+}Ob+rS&I}5KxB?3wvICL%Xgkd& zMJ!X)@p+-xsci_0f+!5|)iD%R6+uM=K99KbI8TT^2M%*6$e!@gh#_-;^aL?O9tLpl z2f6J!^OiX1_6MQiBu_tjW}t|6tHCdX^aMTXy}aFrl9Wj=Bd5s>4yq4;a(4ma&){?E zFu+9egbraF}f$%$?8F<4TAeaUTDKmTC zU#Z?<^E&)E?annwQn%p1PWh~a$aNVC;RD!I(=4Ls-{YM%X|(EmX@6k}oBfFX5K$3I zP`}pvOie({qd^c(7~u>aJtsM8qvYt&Xg<;SAPLeSFCqeY zA?84^L@==g1QZi3K+1ujBrmthX>K<6IU#=GhCoYeRv&&uIK zXF_|RAan5iJxWF5_2QmLT}iEs4p5Xh!W5`z+MElR;;FYz&p%*X2}DO?Kp2kzx{>nrN7$AW8w0B}QTxMirVu3FYhjcV+YH0s-hwa^1QQ7{3P>~wRG~pj1f)olB}EDp5mOYiKvfdJerf^d1Efg;C?sB!rhZOt z;mH|;z$gc!SNPRDQe@GH;en7rfr}6`49N*G5e^{}1}0)a5kiObNEs^RE|LTt1TT(E zibO(yH6;c?hGdd4AW}7EcMfRP~tqzD9))j0J8 zkbUrU-NBpAjl*g{Y;P8e&4Gqqxbc?lY-So#i=*h|AIA zG>jWqeZvOAncc`8c>T9le>d0udJgo$K37CP-HV}LQcMJP8#WxSmD?Pg27)vPB1hD6 zKG8pK$N55g4NKUH1|Y(r`5hRM85Cp#feVl{3`hZl1DeIi)E)IWpziXMayh|@B2tJN zaK$nLBqBhn1|UuiBtjOv5lzQ)vgEPO0#ISQYRf{DqN$*$3M55Dozhl@(eEu-0U;a# z$$)eu9NW-H(!_vT8Rg}0fZ%t@v%IF#r89j$G{^4+J0prGJmd63>@7hlMNvTvO%PEi z1wubd)4E0-bY5*;b&jo`V6LGX4G&FH=8b5<>s8X_iyN65Exq%rnl^|pwep4$f#%f6d6Ai! z1)0n_!OVIISaeJCc#|&S%D#^MCg$ZKElUH;!^Db#rV)2VGMCy+%xg^G>F}$K z?ZCbw`BX<SxCq9wI3Lx>j>D!93&*$L?$+r zOuR&?6GYcl#ZX>VD?_$LrZp=D$73QONv_g@Mw`a8Ubr#FOwyAMhv}KO;j-4*IPj~T zP7z=bEIbFi6M+0F6AE@?K+;ID8DKP8K@=JRh8a?-Qh@71V9kk{N#fzWQ0go@Xy%Qh zkWJ|kAco`XImsbu$YZdF0&~u?9NUJX;uBRmH!v~~W@M#|W0@97&pI?zo#f(8NJ8na z8j!q36zQ(Bn!8m4hoz`Cgb|^b4DSS?C`6=DqBasZr6&ithz7ZWGL#wPPW0Q2jaH6& zoE0t^!$R4SKu!QBL9vDr&myW0X`K!VJ9VpKft%<~8KXoS1_DpJf=?WHE3l8gmZj?` z4lo3Hselhw0X5KiZ#NrpK;;Y)SXy{wRL5HwFxw%3!eV3G0#SIBMkjlK;iv{X93xFu zL#DT5a2RG`wp}$Q-ulQj?Z#^ev^s_oEQ4dc*Ctx(c;V+Jp|#E>hRI!R@tR4KJ?fuB z@UTgI#%Pxm5a}6rX;)aeAdm~aA*~IkaGf_hG7Jt(ftkj|j6yktnOZ;yAnU&~j~pj{ zFnrVuGfAejvga`Dq-ai3DmKj|Swj!jX{acS4st}D6!u+3!09mVVw2@tp|^u7Q*7bD zjdnXcZiSUdzOxdLg^+C2wowB)3C8C*W`%XEriRA_rrBCYh8BhlBxJ64Azg9I=8q>M zbbxhc>&l6*8%%6eNdr5Id3YLy&0FG1vt$HCk=uuZOaU~UaO_4p$iY?>fx{iXcpGV^ z9lW8#1lr?3qK~@>%E`+kdZjOwd@EZ8!!YGC*RG0ze5U1o;>OY7?XZgS4WEs->cdh{VSQh&E{qc`gkn z3b2i(gv2onMT8JmaKK#>Ne2OQXkwwDTqT*H70{V8K#+_vN;44>wO}e3amafOraJ*T zoQ>*AEw95 z5Ph?VR3%9z5kIPyRL-V)qxH|*RruihVa=F*vFsYHNZ=YqS5aBKi|)^+=c+D^a>NX0 zMoy8EIEZq!l8GRDKnKXcK>;!g@hFmhNG9L{lo@1&g*Uz;20UOUNrq!2tb`Issr9j) zJS$@zci}pLf%h_r&_Dz1P&r9L0L%iGxq&@XyrW^)@oNsVN+1*XN@wP(U+wdPyjEn7 zyEQ0DjXoetg!w6Qr0&p+}w7!QuE91q^A<_^)t*rjT+`)sq&tY67AA*U&KE= z?|juRu|!yncz$Nw?T)PLlgATDk)*KN-)ynt#Bmw7ksv%Kl(LVq8!FB_+xYFQN!o4T zHdPhf?%fI3HasO{Obb#_2-Zx`UEa`l6&9(wZg7m^1!j49gZf*9U_bRrqfx`Uy#*h9=}Bo=oel$tl~13~RF=HafW;3WhFdA*PH<$-Z=8UR?HmsU5p9YCf(u1(?q{AE}VZNjN>l59G1rCWb{&owr18sTP5|^o`S`vOtA3a@L)#IJ;#oo_{(Q2 zGgXX1+YwEWTuql@Wzdgd=v--DWh=nW+X z9(-|OUCbVvuxZCU28(>G(X@B94vhzhbV`N*u-MgHm?V1|DTk3tni8v|Npwqv<)Vgi zCEQyln}F8AFx#ZIVj5r#fS7aqLJ3H# zO#v{4AxcCvr7}vBB~etwn+@{J&!ta;Q6#>4-dJXJ{8<5HjUS$2seBcd^gZL6xnc86 z`NJWl2_&B|oY}lf2IGf=fb&ORRB_4DD54_HdUOQDNO1s8{W=itID}BZMM6SIOEORd zNW?@GQn41!?s2?;q-Y{aRi#iU5|FAGfN2n+qyeIo36ddbWhD}XDN>S(X(?i*hFDS( zLPda*78ryfC6Hv6R*FeNNf{C(2xLN<0tp}{n1Y0W2?darA!HgLWuQVCrb=omiXxg2 zsAXv(ib5hu8*}Bq1Bh@p1ZgRze++j(DBuEquRfZTx2H$@6DC-Sm8(PO>rkF;C zG{(x$8CzDP3pK58c^q(Pbrj7F8k}Ot*YU#|oK6{&d74c4G>RlK8fFmQEI}GsL1RH! zSq+Ry=p;h7S%SE8AQ;HjnBYvyYgG-iV?xJljT&Y%oW)etyBp4f;*SA^2-6mgz|%_W zNGqU`$!ZAEH3~Jct>}njLcnTLt^mN>vwZ2r;?V5g+>(-$8r$5MkcJCZ0ayn2b%{3~ z5<XwVa!7zh?I$)VtYCMb9!Y$^maG9YCQU`i$^ z@Qk2A2-7P_0-~Z0n@bQQ23d-vE(;X|80i}v$p|Yku)~yMiSY<%2ME!t0MM%df)z~) z;?{te3|R=42mpgHCKTGhVhl()CJzSG69I^JL>LeT1jW4?)`QR=Us63pUgSYLpcN@M z?8RSp182+RCXUD#!-WsMpdna3z?=jpB%&(>0605T^XguBD8}TG`L{_MRt0QwNEQ{O zlA>J1A7~!<_hE*^XgX3g~I+X+Ff*((eQQF~u*(2P5 z_(CB}BoW>f)_8`RX~_)BBte-XauSm>00G9rXhCuV0;eD#kYJLTl))S)D;!i{fXTst zA%r3bQI#T5h@?Ql=my6D`6t($C_IQWB>|HKNyH)V=F-6tKI{fEc*8PkCOS_BjXz%l z=##@Yd5BgYkx#$;n5IuXoudo;N5F(?82UJLmv$&HPR3khL`h=($WoU^@S@R`%vpcZP5XiUt}2+&Z9EN0}W25iaHC-&6M}RC?iIju3j3NNk=b=^+f8y84(Nm}FE@b-MZ7kAUQZ!F#PE?}`dJo-g1Z zI7Wz&qa*1Sv04vUK?^Y`BQqK;%4CUJEX>|unQa zb2ONy1R!O*3M@}DI+hT3J#g&_dSS(8MNuyIiXLRA6*1Ef_9NjQ(i**T#POesV#4InflMFT*T6af-MG}2J9F(MSNuMEjdgsU(RG7^w1#7rWBh=3_pfQeYD zh#-PyR%JpNBC4dSsfwzgC?JHIDp)2$kQgtp&w2MH`q+MLefG0owZE#->7$NbPsa-f z#{V_ovN;I0jyMX=nJJB~vwCKo*6rp@iUicGH0M>6INr&;8)wb9^ZJmE>8ggiz314N_Go3P^Prw!{6r#8sy9cvv=q?{rNCoN+kR21McexrZFm=;m@hxV2ku zINCH#$O@Q<%twth&IYmUXxksa(Nflj5+Y$?7T)+;W-S^Ym~1r6G$?DqHRPGJnWmuc zsl^Y?DQ?uqhtCI{9>Na z`cHK_zFwU9hQsR)C^{QdAn19R=0-Uul~{1K*w2a84gvNr2&MZk+iWAoqo_h2M}{gK zRqJ?3Iey^q?CJ@^+YPJ?OguywFccaUYSr%Z^yBW>q5e2j8=rq5AYWQ2ey8BqPmIui zj6v@xmYQ#+k@+FROkvy!=k$E|&%>|}PPtel5Mbow2vVy}0#d4&G65o9Rp|FZAfg(N zJ%kfdP)SpE?2G3XV3BmS0hnY~gXs4L!%}1k)k32NCNOzR(*t4(32YS`ZGbcaks^kZ zP$p^_ranWpKs%L1{xh22tJOFD^Yjo0>-VU?x0F6` z6na8*f$l?uJD&tqTMSQh_}-lG>jCyd>`!4hStZ)%rmsZsExo{&RVz{^bYVaIPBoz+ zw3r#j0ryAW3890|Jp8kMb_R%vd(PvTe7hO(5-)PWM;Wfn!1FOg70iq#atul^!7z-B zamNC}z`N|?Vd>e$GEeSx&oT~@a>{lH;L(S^PQ0Oj5D5Q?a*`V*FyC-AeD+lN;@vLH z|0KGxghN^pV{)MCNgVFSyv{GCgq5IgCkn>mjYPto9>#YWwI=8s(i|iPXprMDX=Iox zpic6bk~D-$eJF@4paTf1Xksd&D43#!plG6sD58o2iURzUpYm96I0re4>k4EPi9<0$ zM9fUr*Ywb8-T-4Un2CgW&J@%o5J(YF8?|Z%0*P2A3Lx zAOejGmLvz}`yg=7FF1|!&Bs`WL81*K5bWRZtlOTtPl1sjq!t7IH%yXY1HwX?1tJ*= z(~w}04Gv4l{-4JD+&ok0RVDbZ!iBU^otR`j{`bOVdIh}>Uck}`=tIPY5`oeFuI7L^ z8Nf&%)?5Xrf*^@9S4Csmmoq&a-iiCAB{1Gxtz)gi&a7%$sD z7u;De>6FqGcge2Ao_ieqV9fTf^-qNF4$Vp=7GaA6gpMaTmY zaf(uwAZT64rX+@kL|AEp03v2JlsO~JgH!YQGw|6`Kj1p%_I8s%v=eGq*Sn8=pUDGB zqJR*f59r@rp|%gg6S4Ke1WO>aqa;Mq5g<&W(kz*dEhLad60Sr2qz z5~@o8ju-)u8K4UQv_A*%K4zAJ9wWaH^<^{%m*@RFw)heBkgzyn`u~Coe-)ufKgBj5y)|=M?4qB>!0Yw0rV;aHd+2C`^~M5_dTTQ8UB~geyl$a-<4PvYhZ>+r)KIkOsm-Q0j^y%QF`v za^nX{eBk0bafdwNp^@p1F6=2{k=C3Hgsvwf0NfdICazcz!c%rsq0Ngbb8TUDAxuCA z5;#FrgOU(PL<2yYgys$Ngu>(}6O+bat5TY>rQ!mBtr0~iP@G0VT87PL8bhvP?ix|a zA}E<2?8P?LC}@2=a5JS1_7pz>52_9##8QMv($t|;!b$`oF%(e>bRL*Flc6313_#(y zDT|@V0}@OO0Kxzxa}jZkWKxPzmtZ=E#5hfKgYR5!5Ih8n3 z5sFhL6xZNpvo*U7X3Y#q5g8tOQy0*kfgG$EurQ}?unm^VOl(2fDlovo2q*yRl{^`U zZH6#;K@>#{r9>zy76gJSsHO;n59A;p1f)$Y6}M64pBVw-kv-(eOlt@$*&hAW2X-$a zH>hLa_9vr(7d8;h-m)4NIv~W5goCgi?&6xO85sv792${?WNpScCm_L+1P~v9I-Qs@ ziLmAuq^3w@kufMzf>1P~^{5SN5H$@pvm+%kS5gb95bX}ZAo9qfisDSEs%n~$swy-F z3!ufoXo`eC7(m$+Q54a2il&O7iK;zJ;DAauvm!)s!$y;F zVb@8zZ4=nmMHNjIK@(I&K<-Fs4TA=%sYopw?WnC~9{5S3D%%Z!oAWa24N;qG?Jgs1yMj!bMe39`*YTPm*YE(|4&c!Y&iJuNZaS#`>E4^vz!|j zH+xS^-170hXOJH(FVdzLaxeniX{qUPOPm> z1_Xvmd?&E;BxK^?S%HvY6EI*FIF1#DHaVFE7!E;%x>y067);CtPY2!7fgQfN|C0XF zEmk0}wSE^#K@Av9rT!#c)Q9>VF;_7P00osMV5z>=j@Iz`nxn1q=Y9KZMgL?;cVSvT zKhYPLoDZHN0KuIcFA`6>sH@ZtWSvm_Z<-ZE4{w6R48k_2i68pm63h{aL}&{mwt zs1?Gg!fB)5juWgnjZ*|T%D@mA7A6TIW+xWX5%cY~w!(2Y)=?E4x-oT1OU_{Rnt2TX z#v=&8;e0nC@;22%I6~rvbnqZA=MA3m{ma!vY3cMveiI#0i}khJ`6e zk|L0t#0w=F`BFM~-xCbCIr7B{8!hgt~2q3(%MLPXHcpp@GZ!H<+ zsp_=cBMH=s_sE{XjD@GA>49kq89l)Jp0ZFxP?SQ+H5A-DA;Jkda0E|i0VI&F4#ejJ1^ir0LwVge{l|~KjUe+?Vear{@bRQ!poYVaw}}Z1T*dsvA?)t~JpOhiUS!`XjbQAX)3ES*3^WlNfzWXF#Ex{z7z z;#jX1?t8V(Nx!H)+M?ot^X{*Q(+5HAJY*JUhu3$Pnu7V{Z2t|oLCpf?;mX4YAE-|B z2|69<=S2s*7MYuNi{NzZs~KJ3CkO1sn`_Zk>QTbqvq!R0G!=voZl7{)-TgHw?(6=& zS#c_-fsaT7ayMdTPrXy<-U|(z&GBiu`eNmC=Nt9C+OR)q;(5zsGsrNxr@caBV+S`w z+V7?y0nRy3o-+_i3^LpDtDxfX^ReM!l2gxaknYO(<{z0@gnr6c8dDp&Ji5)lga1`# zVPQxAv2Tc$R#2Mm&KCIdU-AvZ!(Hb^`fIj)%e+5Eu{JU8rvb~yeF-{3?V`M}-H`K4 zp8t+_Eg&e@Qby?p#r^$tDQ6{QIC%o@!Te)R?8K}6H5I}{FXV4UqMOs5An@0ai0y#L z(5-Ml=y1sClmsPBWT$HHG0std9N?MC{Fid?ipo;CS^Pd1<82?-H1H`du}`;%YK57%JfqAlOR3DFUGIn{oHU)e@7a91hTf_OeBjHvuUo?>ig^oZnDaq$}^3r z-+li)nK@}5=X~b*xAG?soV_wZ&r2jU(4W)5oF#%$Q}eI?Bq#kN4oX$dSSKIPcIUsH z2JVUrzS0B9DKND@Xva#Rq*&+6r%ds_6X$gd2;KQyJIo;zZo?ihKYMo z5!<(2c(^$`;dW%j-i5*kTcx)GxcfH%9-oJy$2U&X-g3p-E4b~IVC}-*0F%0Y;tQM4 zpUu;gzDtuG?%0cMXwoMsSd;K^p6%@KO4QxF*qLjCyIun%2e0as-`N)kD-_AkCZ?hB^=ix zO1LyeG1;Z++Bi5@17#3%5!e0v*ywLzsD{6d_*LsfD&U&Q$evknNkf`-!XUO`o^ z=S-`%mW()1F$&!IQVDYAjE*O+WAV$I@H8P!23n7ljR-GhVZhZY+duC6Y;<9xpV8+P z{A%Tec7eH#&dg+2>QGP8IfIw%tAHKQKf6B;o}4|?2--#kJc#e^&mAc@+(vPe%7Yj#|#R9rWCP zBl){~*FnDVl=5=Og3h;lGQOu8l(Vrvc?j$8_zi}zN#!x7Kx-}yu>1GBra{!pxdDdQ zSe<9)1v`HYDpM2)c7+?8sde!BU~;fH-zYb81vi{9i&BAe%P@q7FhlU(5F{OEq=_Ul zaJ8ZGk`NihMv|Nl;e<1pGL`uhHanDok<<``3i6I0-nQupy&f%Fh&KW7d-=IT!?zQ@ zFDh5OI&Elbw-Q^_UY(n|aAIeJ+I#HjokJTqaxVV0%x~!@Ujqz88_Guc%IaceSP%U?3d4eav!+H3Vtq^cn&}3%=fb9uAT2@i~8WC5S8qzvW_m~ z5acCSzJRm5d-cB_z0U+4q>-82qEyWxUanD<1(}`E5|I7e5$*lMt^*b>+r_COAqih; z$*y?u`6E4^GDS986GJ#H{J{& z%2S9#$O3Q^(F-=(<%l9<;aeKI+{ZdPs+>d9e4Gr(+;Nnjqd82KJaKv_*)s*mgSM|x*`)9E|>EiyCX zZS%)d8U3oWm}4Sint&rD(25`;N$B3+oq;lf8WEc5s-9;CHZ$G`xrwACMu=>8dRi}# z@3g+up~QTezS4?Smx1I9RT5eDa>vtL4D-Y??D|Xq)`NWERAPcD53Tg({WhoL7z7K( z7_Y|q*13`arj$aAcQ&1}#hc5*j9-zt^yZ7l#WSD&Jo&uh37qjoT?lK!*4xrlD2eO8 z;_qI5#I?>%ov0etwwI(gP<~P{zy3AeANr;8?dEEaW6Eo&3Fu3is~{7slT zY1r`W>`A@*5C3YvyMO#dcH!1jo7V4mysT>lM3np(Ty}W|sLfUX>*TENcU!(j8M%Y1 z*K|bD%EE2yzuRv{Ji7gSOGk`?GPDxQ=s_QiR)^|Yz~9L2 z0edtv;^b1W`TO?dgnm9m00@%fk2aT;M4g2(9@*-g@hNcmzTfdmnXQ>}uT$b~_@?iP z4i9fvY2&0sp3QUCl3-?(778JroEYP`q{Lgx!C+`ANGcq<2+7b1II-aIoh6>zS8YmrM=(xWEdaK{IGkR?k&pGPCSoZhFXBhIXC8?+ALa?}_9e`0vLbA5)S9KPC3!@4X=xYs>?r z8cKKH>f@|5uF9UfpqR6wES&$|`XdlyyRRiMs6#3C~dBx`}v^!SMz(PlfOvN19;p$=|OyD-HXHZ0&)v@mpUY%(%R>M zZ`cKG{C>Kx$Cpb!XByeBdB0;LpX{z7*Plcc_1^ZN=Wfls>Fj*)@RhU5eR$W5ghc=J zEYpi)SDl> zc0mHA^oS^Nb}qSlIp>~^LEWzFAvFpX(oz5GRYXC@2a$P(68yNbx!Pz@;Aqt4sML|B zN5JE$bx*7lHpsC<&~w<_DlRgnkEN~H;h))ZbiO7#P}nLh#4Xnd^!VTEnQMp^c@5heDM_T(N;)$jc)y z4}ur8Peq=+$gQE7x>Pq(OB?fq=3Bx z0u}x@a_7xSqu?WN4>e4ZO4P&Wm}MOarsIz4M<;8cLJRe9^HN0H^`c@1fHJ%waVoa_09#p5dSJA!_GYCRL@zr=)Gm$i@!4WDI8bd{_xYv^g|NZFm>NQK$>vpSw1#yStXy!-GcS$JIcy#guk`Ns3f8}PQ#`@FiLhvXxZ7Vd8d z{SG4-e`gmGzO~|Z=k9~37LnG}M_|27G-T5+JTmwLfu^~$m zG#t+72u%eQK}8K*7z2qn=G0S+;RFV^@?c0dlGLD$RX`dvoX3Q!^J+}shR{55F)dwS zOo);Y6riHeYKa0Q&rA+8pyMHqq6lS*gpODkuU;W=S5Zw?OjrE!fAXALP(Lv5Hzz0#xjv8`63|=3O23|VP>);Ma6&(wJ8-VAI`?)xt2h< z5P8jdbS*tEOCv2R03B))T9eNxbcbm$y_iK1crDq_g6ZhvmWE~cVf}nhhvb^_+ySE! zUjwSFA8M31Kpf9gB9rHo>Fz)(g;hxQGHb;nHyT(LEDBkkg7P6DSqNh!o+6I~x*!hd;i;g_RyNF4yVh?++=ZRV zeT6^OV-W2Moty#rLdIj``_0b6$IxhSy3ozAG?JMgPz5*bCv$SW=;D7tpwwSvxD%@K z9Ad|m)8bVcXMwWMVOZ>NakA(4Su?u;|1*y#l&2q0G-~0reQ_LQRyig&-;TD;(4jWV zJD(s#%4XyaUOnBo`jYzMU-DShr{75xKj&TExJT(~H$K&1F65-F>1Jltf#_ zDg$D2;48T^;+iq^(tMkoKrEm$y@rUrTe|Qb0vD$d| zseJ1VW3u=-l;jpGspEDuP`Vk6gLo2VRGs7P2quPU2lpRDGhRHP@`Mb*qS|Pb+9Um2 zu3j~TnYA6UYz(h(9Ff1B(?!13uutr(BL8?o$2%U}p}*$v9q!i6W8SXSvSq}y&$8YE zC{9mawV&V(QhyBdZM$qo3HHOGS4;}SC@`-IOAsd&Z=+Tmr!Jo-u+Sd-UhhA8t+qdL z>_nN}yK_IbsRJvXUJmE__L6IguIPlvNLXJH*QaYn+L<>kYg5r+Hxu0U-=5O?$3M~? zi%v6MxoYaPNS+p4jq6%g?z2W|8!H$ALA~+ErkCGw(eVS1xxDm8856Z(aKV|!>n-*7 z+RSu4Y|iy*4gJ zm5nXsPp6jVT})v|o9s4Wlx64j%Z?GSm#B(FAa{OSJS?T?=>aUF#+hE?T?xT$w3Rdj zAJ_lftxUP&{N-e1bkK;oX`h|<&WX{Z{>RO__AIOxQ#YBwI9;L%U|Exw5E#tR%q~95 z(j4~YJ;J?_JVq3^z?!?_>~)lLtn1mz*i2&O=hp3`aubZlz#(}7XuQ7$^R=*_Ps2rw zN_2UhB1k8ZSoGv3c%phI3f}E2;JTZPKXItt@xl47p9k;hOSYH!so|q}CvRm(>Ye|O zGP${V-+W4mHb$^9sQeZ4cDc5!QfR`2)+LO8LW@@azI?fUqb?`{s zSK4`IrFPL1F@rBMGJ@kehrN-0N-^ z5)ODw-=gQ9K#ea8)fut_m7D4LX88W~|E+sU@Fe5DIpc0g=-J)V z*PwW6(tkS8^W`bC{gBLBiHB9VyY(S^M~6L!8osVp-{0)~UDHgfqd^-tpp*Psx|uwU zKbVcodDd(oc7)TR^9v-J6J+a-pSS_!&~ z5UJYDEh&F^otK}^Ko!atVI%muSd}%k){&1V>K?G?X5uf9$CDEC8hB>{dEJlhTtar7Stk3F$WE!uiiJv&yE4N{FJOpU>WC&)v~{6YHlHGQ8w?EWse(_CQ_R5Zh)?T-ZAY1H7>bLCuZD`TeHRX+cu>R49Z{3&V zHo>uw2Qw9@Flxq)=%}_l9}A6K`qiqkNA5b=3Dlydt~{?6X?{H{Mz=Ukt?3XRj!gSH zAHFF=c}=r1z|1t)WA%~q_r19pIe2EOxva8lX;N64PTZivl!!gtgUXLxYiLcUAZn!M z#!C+?CSDY> zrj{Ht`p8V%p-pU;kI-tpa^q%DmYQXfryl*aNn49&XlV6Q(ONsjL1gRk#=QG=b;mQe zg&ERlXaG;!M_4g_`$%W^)1#vOsqYi(4LuCp!o!WIdxoT5PrlNzNdc-yv64Zqa7Otd1Qm(T1WT^d_MOGWt`bO z*&KK1>$!6;zM%`M2P`CtayxNRz7ey*uO`w(E3w*T@*&;ibnU19!eEhr2^N@=$N&-s zo62hw8}4>rld|{^V4Sgtn#OHtFCrT{6XKj&r8o=6$n5!H8p(Z(qR~2 zwIxa$GJ-xX&n$b&8~dni_=99Y761wWF+!nGk1#tGwRJw(vhJNtgsg@JPHgF4OD$5R zv$cVU@&XCk{_M4fu8wJmn_Nzw&wUiRKyEi49c>GZ4Oxi!WI%varC#PDg)Z1Dozd6Q zO|e>(f(9{5TYd$2r#bz7(Zs?2ta@R6eQim-3C;vp-^eQoiYw1q{&iyZ-O91yu_yO$ zkM7;pSN`PcipI|*k34QQyEapj50z_k=u!Ad>%}57=Cb8|?LDr}t?S;lJG0YF={)-v z__NBz2+3XiqZst%w|_#9bupZLKp2J_MKmZHk{S4^a}odT%(s@ty$d#1$>Bjp-I~`4 z?}&Ot0W2Igscoyig?nK%0}S#5uD?8Ub^49ncWkM!IxN8?yl zN*rS{d0^KHWH&w)Ab=xV;S~)CHy}DwwOeQI$;XGYXY9UPscn}C9*{9)9k9WQO0VHP zT`zr4`P3~tfBm5!>0@fg^=(l#4hW52ZSyvg2DbYhB@LLqXmLDvBlas3S2DNLr87*b zr*-`uTC1z9Kjy@pQ_%-Os#;MwIb4N})FQrjB>0Zg@uPs;+7Q+{Z6(^Lw%CbiK{MH$n4*-^}X8^ZXyXg!J{~2X!(6bj z>Aumz(v^c5fjbvcH!;?gsUnRmg~3H%k%@48k4E-xl%a`F9gb9{lqX|)x||wjSUVWq z@Ym9DEt@m% zEV6_s0X@SSA&bxe_nPw-110?k12D1`p-54d%Eic^CUELQ@;inBU52Wr!~SttlD~5I zHA0BBlhBUS#VU0)2aD3S%H3v1Ss&=q-Uva-cZ%Kb@Uy(EfLt1SUcYPUSUfQ`R3T<> z2OAKsYQl~6_-L+*SzKv*fXpMrqAS^&?oAkh4jmlfL2B!V6wo5S)v9Gz=VqWtUzJ}T z7ABPgF%G-V-WJ>HuDpKzt(mSDymDrrC3Hmt_-y)IzvV)C`4v>=;h86Y^gf;Yhx?ls z|KtYNxl?yGAO$aQwgK;*xc_LO$Cd-1m+wXec3pjaWn`CE;fL*S3|g-V zGiiTkjs=cXB>XKM$*CAilTJ7s-_Wz(XpI=LTz@pUZ`D@0ze_7=nz~lsHOf3?l9rX@bRg=o*WSmL?*+-$eezA^F9|-| z6b}n%H_Pq%)7~qwZ#r%JYFImRH)_q+<|WcuE(!JFxv`Gopo{=?b zU}Cfa2fXM3x$?dN*NtY}sRrZhu9G+ZX{UQ$8%o@?^pBC-_X_kqrI;MDp%hsC<0{9l z-GMoSAzH$J{}XqP0xmHwYQ4{wsuZTgzVl8KJDl2f|G%RR6Dkb78%h0N`DycRH$%RC za{jE_bh3TU^Vgn^Rr|T5$1iNu^tI{rggUBi-LU5sjhexl7n z>|cph{PWv!RzHG%8roO)Zc&Gw+c!V&zl6I~L9zcAc06Qx>!NaUyF-}j(+?`YYU-i~ zrW4)6=3(`?%Brs+cZcRX|7hRkE6&L#>l*Ak{`Js>lzfN3?eSlO&sqP8{5<32HFqqV zQ{y4D=U;3Zp7~GdP>G|^VcS*{xx)a@l3tOdEX6-h(;}DCQ!i04nZ#D)7n1RlB$g96 zq%@sefnx5g0}sHs!OrRh7984n?tuG|XW|)?l7JW~eBxR*GY36$hy3;>amQBAPcq%x1C-0Txq@rGXRy4VA}B;rK(b;^~5Xw>L&VVy+uHFCUqA zGSrYw_lcxy=aY9rWwcBbI&e6pf8jHo%pfXW> zBm|$%tdTdC$*jn7ag9`WYF?l!TZ`Gc?oFHC*+07h8&a->Z3&3TciZj-35iA}1TYJk zj>e}&@SRxGR4z3g&aO(w%$Y&9hJv}25V-ZMjIqk2l3kPD_~)8oZjB@)Ji+|?zdY6D z!pz;_9{Y>rS*y_xe4ZXz+U+YFY-Me-|nBQD!v~qFZ6m@lb=c_*^M%$`D z;=(18?V)yQ%l>zhJs&PQV!t?=*|apFl22ghrz_8ZjrkAa4o7~8-dFHtS$Cr+U#xfQ z=||MB1caWVTNW&v=vogSgw_!GJl^-?ieEIuPgxcH@h9i){rS1&hot4aqMJ!CAX*Rd zs^SX`G)r$~S9MJ8v-<5TjLuaIns?BO0>upEUa-koG|N4ZBMsOS;>^QxCNUXWWW-1; zM{NQD^{#ZEYQOcn6Ey~f%=(;%=2C1hyIDeSz{OQ(S-=F~lOiez>W994cMLUwsRpFB z5_QB4#_)BoIQo=smN+ykL?LDNm6~WxPnM7lFgb!kz25ZQ=kYsb898Qeo#0)HC$?}~ z4>0lG$zw@R#$Oh$&JOM0lxrBLcz#c1-!5{eXf}`Ye6i=Sh6YUU{2^#~0lPuROm_PD z^rMxM*GAe1VQTSuebkSC+Ip8fqn_Lz9HhxsV#`WXA00zCE9uUR_nk_Qru1ngT{Cl2UdB< zMeXZAckRd3G9pb@CWUC;yF%WH_dBGs2y^fKQa0&=D@=WQRCiZ*R!C?GH|3ks(>uM6 z9JCxd-VGY$YG#Ngd0lI3_Qy$}}`MKYAO_)}pY@y2>8$ zGsTH!ZVCRkKpy?1ti5sMqm);^OZq%SfBd`dt!Qkv6bG*x@I4n;D%s+0AB~GGHRb^h z8^B`HCxM%Qel|L6XVVA{aOps`3t{T`81*wVhfbj3EY zSCP~|Y=ZBDg~2-Q(VB03%ICG#MppyU&00iK1BEj>nlEm8Yyas>Jgl@9X#rgQPZM^_ zR83Qfoc{BD&|zOrc6iAIkDti3#`YktHNnjg&`~evH4qCOgg^g0^7OJ~$D?=vg(zrY_wOlGja1dyNK#6fJo9 zUcQ4a@X?2(;JjEvW!PQSySyixZelJv`Uj(SbMrPxw+y7ElN#PQO9GLlpzM=kM|Vw2 zP{`427gNTMix+^5d#TJ{#HhpwY4ct1sUG5d13pJ z#&)O6?6{W0m+q8kml*8A*#%gLH2zy4;u&J~Oc{{RNUDipsDgS)i3kayLIuP#lg_Rg z+`07GO4V)0#yae65piEqukOb{@NXbJglbsw3C?I9+*|XeulxJ=)!tm?S3*mW0?{Q8 zEJnAsnw)habA!AMp4UWSC|-O9fm5;guL^WC1=K9<3Fh%^v#ncB+Wh!*S#0)dKLh`S zwXTwR{Jq`>ZDtM5M93$|r(;{p>M8fr&Tk^d%ZD0g-4%Dqr(3O&b4!iuL$k=IR6)Z} zhF+b+%yWK}et*i`*9$^D7Z|Dt)Xz3R)@!;aXq{@$s|6UBw8?+V@_S4W+be zCf!~+neYhZ*+I#Gjxt$Z3ic_^`k_rl1i`FY+RLq2NwV zGpE{9Kl@Rp{=1pEcF1+j{|!Yo}cfat10l z#*dynYu;v-d4KT5k)^G2lBM@)Dir>G&EoaBx9g#C$3yI|4d{NOl?@Q7hc#U#X-ryseAB4`rhW)h6q!WDQo2Om3x?#*^cK1?a+tg^fF3O@^nnl4NpSj3 zrY}lKk*db@MY=IzPO`EjS%j0DNEYSRDGzot08-q1=PUs#W++<4-)W%~<-CMH=FC0Aq2@i(5Vy7i+WxZP45%gFeS@ud@>xtHQ4D;G9HLvR|VjWqDdahp6vM`W)o9$zN(i_Q@!z6rt zxznT)x2^RnsOeIN?yxMDIYN2WzV?%pyyMP!gVo>X$Cd#e`xzXP2!zp}hZiCJiYm;xl_9cLKsm(QFx7tM| zB?nh}x4z1`Mtp%r?P7bvH@*vOYN2If7-IHx&+ghw$2yim?>d3rN)|U+|5Mb{yn%48 zbR!Y&l23*-V=K$^^?s;7UWdQ^`F#%aRUX(^`b6vy%+LEUHvP8zckJ5M%=Z~r-mr~! z?{-cdk{giod;|7i5i;+f^0rvusrU+z((7EB9x^^ujK{o3XPcY{iX?_Avo={@><@b$ z3%4~e4k)LLv-ARhpU(=FIubOzdNmrP^b#kdxy8ZDW)hks%789UMCiT6G|~T)U6S`1 z6qYCAN&qxlQAO?$&J;m(R4_#ve@BBIHm@$oT}s(OeFT{BUS_W&$1EFFhJ>e9S|bBW zN}Z_A5yfFU^GewZyVN7Nei23CUZU{ua1RHTRzsnRlB=HJOZba#_FbCrA<>rrL#A)H z@57^NOj?&C!c;l^;mgix7%&#N3j#n1Ygo8l_$ZQlnbP^_8FtDPlk3W=5f<`g!Ub5I zE3F32O)D-GSK#0{Dt9B*D$bIj)>*pqrr~Y(WW=kHo6dsT9UityGmiDAZ&Lrc2X9Vn z&JKzXy=B0h5mpezRc9<*P-bUI zumUek_7%emn=!AnG!5$7h+&!>g^pb7Iw(zlm$A)PY3wh)8xFqH`w>Emw_KF+5vi(`Uz#J!?6E6f(yRyVK4RsRnE-(Y1sf4tTNOBys#f~H{oI7uz zEP~vAXzQ7r!I+52z zOy(mcd=;HROpQ1=Rcg{Cz*%;YFEjaaItqmCd#DNez;C3mTXlRLO$ga^V~uO4fSJl3 z*L?QvJUky975DC9Dx|}wUa0WL4fiH~%Txn{elVJAf z_+&`f+6W;!HV3vpyTtx@`GqgHjC1eF&30?989A_Ey!W-r%aHM&hvn24rSl1|u2&R7 zyvCj0Uax$gKZZp&%X^cnoP%k%l%G+}1=@QA@&!+D26IVjg zLx`o20&Fj5G)#5SsjiT{C#u$IyD%_F3M~8*)t3L!;cd`TZ`*-8dAr)Ds{B89?&<&hB;)tY>{Sj@;>xu9y~w@0E>I1-bI6U<@?$<>V-^{; z7lU?FK=&+6GuN72q*P-#4Tq#OI1i#=m%7_kLa=w^Qcw{^MZYEesESj+u)- zcV5fq@7?OpFE2od**0X}nLC?&ANOOM6tf3$`r~pH$Nb+X7=Gv#zB+N$J@y=8CiKo^ zZgAS$di%7(F4Ym`@LaTe&tsw0h1;pBDE5u+spa!DqagGaE2t%Y`d#RD+xgphK&kZ+ z^d+qui5|bgF1P+Ve)N{!ox_I?u?^wJkJym+y-l<~r^_nOsns2~>9Cuf$o%*MOF%-_ zoWc6@%i)gEXDePtrLxx{7Y|-}Zu4sLT3`)z)kR{PAoHQ`;C(u>mj5KH*-O8H{J8kERYE@OW*hz1q;wh*h#5Q*ESvTY6eS@3w zLnCpTV(>(H?J(6rQkde<#?{+lb*JKuF=#{vK6+xH5qs1jKNc}jr2M+mSk*veiKbzPc$7>Xz{D^dmbDVAs;N|e=k~1w zYYT~U+cCg&H6=l-*@*J0`?w=}f5EjO=Z_;lm6zt7Pzs-?i4e@hxjd(P3U@=A;sQX- z=D}lpUI>P)*`H6#_@e!u)TcWCMyL{Vn~|%_y$w3ba}@Fs;GGH9ea| z0B82d$+*LH=1!0CIU%@o4TU+Qof;m~)!cA#4E|h9)SO zn`Ik;pEAK_Ub65^`2LB1CWpT>Qg}sUZL4Vm8l3$twuf^g!$?{jw#oMTb)5+qLkVNf z(CvIa^UQIP&mrIxkmy1#kDvixOot|Wz2Q`fl#czADqlbIwb$<2F6=W5*X%p3!%oW+kX8#dJ_Ap}0EJDm{nPUK;T zI!xq^mp8!BU7NuyCktZbAecOXfD_$Xy}+ZQd?ZkzgDiLeGpm4sa2;@obmN-tP3HbJ zRMsD?mKjaW&_1YybSosG=u$;wCw@486m^~DOTQ>W%dmWVe7wAT$$pzVs@67%O2ho) zrZgc808W!%Eh*mP9Yt*%IUKAwt*RFIC3)OB& zMlJ`1?F`J+N}{`!9b%Q?tS6Glns>4ceaizq_T068V^m5W*6c9rF7ipAQ8#6U&7~%p zC|lh%89&1-$*4JvM3G9@b<-n%--ms((HPlo-cpS#%k$!!jENk|~Q&C`Cgs9Dhi(6Nl9+OCyi_nozfJ zGsV)e4Au~pmPr+lV1iZ62zQ7(zS;5SQR0%$cVQlxU0thXLI4J4w+CG`H6YS$v1Bu*~2>6BlzHG@G)6EyY+HqK*od$jt z&ZLaN8yP+b-;`;Zh-lU$mdUG&)3@Qu`JXcQ@u^7ysC) z=$)DA?dz2{Yb%qD6$Cl6@Mbiwkb~l5(lUQk^YA{1EkH5JNkw7|Go?XUTzV}mzYbO} z7{kdbKwQ%Zo8c(PLSQfxj)3L>Iu+jO; z5i)$70TT}-4=sz8i$LJxud%%{m=Y{MV}Sla9LznKS+2V%Wq!@7n)0}N_7r&ybU;_t z8-jTFG5fu8|NE^b<&@UTMC3nN#;@{!*HAPP5_=ae~JC7`5L4Lt5j zSAvmt!h2ATNH~ciqNu5o=&DW@szAJHJq6*L=|&sE!KK2&Fp;mw0C#}Q`=)g$%vy?8 z<$dI8w6t#}dYRrxm45u941AYJ;!|C^c`uLiRZTL~yy2THcTb%C=N2bd=iYN4U;;biBYqI>G@d<>1c9kll6`Q5$m`o8}7 z)8`m%1(#l8zUQlF0ai!x6OH?Q)0|^HrWe9}iY87~R z8ZI1LHbR~)yI7Wz-~qbfeKw}s3l6Csbv=L@7|;Y|`mnCyKFbo_S~Xkz zd3bM;Qa4$JsA;f}0Y96syEQ^7folh@Gx4U2km?e*NfXZPLz|SCjj`6wL=u!FcL1;7 zTeKgjTZdzVZ$m-c42nwlN96-vqSpY5+AYEigzOv3MmWNMW}v!o$4j*H zMw-Yg;Wm>5k?FC1oNLOdR)m`E+FtljC|Fj5qo89&xl z)@|r*fERIT@)8j@5|9aa)YR=(h+~~|E5IQ8GvEiYNWmVz3hVEVo$rGuguM}DPX=S2KmCTV&Zbhb1FVLKh2hs6|>gxzE{P>3h z+PdoqFsm!!;T2|Xg(z=&Bej6;Lyyevn3#<~M_RXGGdCkgw=^r^j{NldF7DTZRV@CV zK6t%8yT#o2-Q;!C1t&y6N#6F7g^&QjMw1c$>)PCcp2^kJ$KL};SgZn^<)$apaiHsD zbUctGps4yG**l66az--)&#PAdcI-QGmBjMo?&V%k923Oou~I*aZlRj;U-3f_L|4QX zY*#3v^B5&u{n1-&v5W-n=R*m>LId4~(ShaZ*w!@e6)QO-HZ{6^4b ziYr`L6=qeGaD{UGn5>Ke^lpS)?AA<21EntQu2SeLK!FOpkqXbj6mF$`!UQ!~iGZ#7 zj$v1dz0Q3(_uo$VLUYZx^(#Rdgu4xC&>v$qOKqUW$$2*=C$*BbQ$q!)!{Pc@o0Z(4 zd~z>ph18{~iliG+(}NiYG(&G=jf=;k=ElI553Zt5U{&0!ddp1gg!;;B-%|HHI8Idm zirlH>{++UQ!g@jIiLt7={0s%|l->)O(~w%hHGmO-!lh>lZ$buM{yLn~7`QP8yMsDDoEE%0aa&u)Hvc1LG1OZ5o;~$V zkO~NrDhV?mTk>)=?8@T3fb`DJa+leGT8uP?=1y^EYoetsdH*-vX@dP7#IfVu%BPQ3 zU=7e1hKH$5iM6X+s;ewU@Yo!f&>rlFMX1VC;Z(_4C?9hG0?lQBsEV-r%c`xDfH{DG zuk$M`vwFnixHk-~Ejgj>6?%|Eu#Xv^^^FgO#3m|5Y%T1@1u~q~rk120M{aO}xudLB z9^EZf{}EPH<`%S|JNwT~maIlAqQX&Geo%x0&RbC~VN&y7_Nmqmx9|-Bo7%_uqzyCE z{GBYVZ3};g72nw}+bZ^K3&XjJni|FWR0f~7o=X@28yyEst%Ts~2qIM(nhz5vE0eNZ zTQT}`?hDAxL5TR#1&+91);+eKF`53h$`!DzGF8KI;2cOz;5?KnBW6*y(k8u$2yZ{s z>u=iy$@{Xq&ra=_WVD}Ro?J~OFm|qpE{{?=O*|*>Pl&qch@C69R(&V05e8uTa;E-J z2UB$HB%7n?Q>PTU6(vHAkWmI|Tdw2Gt_Ql4FUyBPDU2LCRgi}os3XRTn{k;CrcmY9 zj$P%%tDv?mV6aA%Am12WEpoSsJ2r?GI3aEmJK~fzXj~ao5B!@j+Lv&D?(ZTH4)hw{ z%bZ)u-l@1ib@^K5UHj+orV(e!ne(YLcX#OO0d=Fb6j#2(>E^2)!>o937*QWV6!ZPF z45Idx*tq|+SGhXuiu_ltO~mg+4(83fE?q%$Mmd|;AMYSYF{Vkn5WUt<^0Yi;8a7-V zijij<@R3;k+y7H^=J8Dbe*iaz(Xh?PZJS{v4O4F0j5dbNQ7XwXXDVl;axP}M<|aAk zOoj9fsoYn{l|;%Nxdl;i$|B3<7ipDI{6cUbe9Pmi~&8Uppv_ed>^~i#(nlzJ)!^u2#E$4h|ml zzECKwicKlkFLZ_f+Y5DASHEuAA^2;&1KvP5Vlcyv`+K(HRK}Y(@8p($kcrVx>0g2! zwcs(9a9)lQ{=UhwJRTX#SH;81qoH_I%vqKwax6Lz{&#+FqO9@D4s@ggN2qj+E_FPG z7AR;dbuyzzQ?&Cv1WEK59=gmSi#p(#4UCyqtipp=D^Ruz%3lF!6^ zM}((yv>k#D)8v&g0ByM}UCo8)AT=<@_uYwCpX3iw#?AzGLVBEC2Nv^5cb#g}Gcit1 z2PemjbnD>Fw8U@%x!YS7K#pNk-X3Pe+S%cxF>qCi^*5kwc<}*66qf-+J`G5K@GuNp zAo*yZ0Zbnxn*dFF1h?)mMt5ExJx=yBQ|?d~Oq)4TzB=H~aC=e#K(-f9Z4(r<7mp0_ZSPi_Xx65!dww9g# z2+VCTgRhhA;vkwFGT7B#86^NJv9BTCiv#QBk6@&s2+ep$BMo&aR2nuDiX#YQ^1){l zRgowuX7r^mv8!bALc296_3Wm4df^{`(f_-CNg3ns~x=5+^d%WD{_r-28LnJ`|gI`n1fknabwwPHEc{e8&jNR z-F)rP^zHTbKc*b+uF#4gD%In~?^nL7C0hx{jbQJ2=z}Uwsakw1jqN!@e>Z<1_SGUa>lAy zE;`tz)F~ZplLvp*_0K2OHO!bdSl|N6M~2Ib6mZ=gZc<59uPCbNHw+f1%{z)Kr8i}i zovBc!O*_Uw_#3M2w(FE?VG3T3WtX>X^h=OIr@{4Uh(Z52K~?jrVhj`G&TGl3U?xf( zv1^G5bZ44T5SJbM?1gv+n4;AN(axd8dpuu+EQmyyq>!-a#~^jFV+R|ri7usl!@*8Y6v0bJeJKzNB&&cMBlrUNuR&Zy(54qMwHXNb zEbmhP&9y^q6M9iT!1T(i2SE4*c(45SWhZ}zd-=uU=dmVJyd!Skq+`hc5UH&hzv2xI z!KX9y`La}f-X*@8|NF*Kmk^!+Vi^&eBdw4w79YH4;@T}rKU58G4ZLtru(SB#QR#20 z(qrls5o%#D=N?aFRMA=}-$b>fhAi5XdTCRTTYe2q?*ihI-0Jla@UlQixIw-WQA1t= zMK(iNoQ;<|XE|Yp(NfNWSh&aeBs~zdx~RZQ1D#^(-JZyrn-K7s0DF;7YYVq*NXzhj zs>``5TOj(MEb}cXa}fGQj*}N5AAIMcjvQSA!^D&GK_CKh_jYU>PPR|>*bWA9=L70P z%d!X~6LIYGU_1zu?)rU|t{mFn+lS@;E)y0e3dcJ|KNfIHE%-XkeNwG&nM8sIswkt~ z7+fle?#4A6T+wWcmQiHVv0loj*JH`p_e*=(AeK*SZINnVCux_Jk89bp#XM zI(OqGc*0SEwr#AXZ5n=LFL6q`=sjYpQ3^LieTQ!;PG<_odnW3!Rz zlG2&#L`qeu5CfgbRpYXlxAH-l+!Ei?_$)ss6<#8QH>()KEyqACNoi>;LSCM)D<>V! zMP_0weNjL}BH2Q~F;$@4vbd_WI$8}_;?83iQ{sT~MG+C8Y^EJT7#TxWK{yEuWmj8L z$inDs89$zibV+En+F58GPYniLgULGR$~en%jmbyeisgVTD}cff3(g&^74S}=oRx0r6C1;d7smL+f_!+@7^iNP zL@OVED)Q;t6ZM}kw*N%z<-sH}G;5&BXM!UL{qw_hT019m+()VJ_1ypLP~ctj4&; z7N=~C?g>!JpI_nq{r4MfU-84{=NqpYO~$rtBCjjmBdj8J89SY)&bFEG?8S>Dm^OFl zeMZF|m599LuKt^_+C4XY34v5b!FYw7!XfhfxW+H*tew~@Vh%*&_r&+$j4Kx&R3UO1 zLX>hAix+@)6NZs<|7}(bZPW66F+LRc{BmA`FPT@^mxHpX5-MjYvx&Scwr5%_5rHaI zW2B!+M1W$XViI|)Whl`g74@uqG^ZF{EprygN+f5oq{s+XCPtZ4%3v~Mc}s<5?1YdE z*LXLvE)&{BWZ_|uPn0&esWFlQ$0eeN06bb- zsjDfVYeemSsd1mFq5j+K`Xuv-F%{osrw4`lIfTLYOGGluVv5Pn-;hb9x}LV?J=N#P z2gsDtO5zbj%iW3v0FvQM2cpkd85?jY+A@ioNs}-~z}Xd6?sIi#Ft_^%qv^ze|IX~u z&5u`Bq-u=g{nmOcHr%p3MT%*CbmNieX3w&cXi6Z2=DTDa$v(n(X2pnMR1S%MKf(Z z&z*@w*)g(a9>h7O$VuQXo#!9y>6bipIl?s9qvSPqq67$4X7K7zSm&f}&xrK*eE4dx zK)5FT?~_zl^YP2qa%b$H&S2!$K7k6)7o_;v{Y!r+RA-#?b~g9-q095CNjrsaz0b)- z7KeOO)fH+y^_4{(v#D5fa28Kbs=B0ZURPZ;JZv(QHCd?sMM#5aMy8Qc{?ySvf#B6Z z@$5aP!}2nf*%LCuGx=RRzaLjz zwCc}6ued{^YmT<- z(1SaaYwG*Sk#7-e77hF==4ovIBlz||z48Z!KMe&h4+gab z6QYlkfjre&V6tDCXv~PkTBX&rcudj!Op&-pS&y^{{FhznKO5dFAJ+HJn*dic(70wNQKzLO1^Y#<*zt*bCB0_6g1Ed6OS8U7XYom?hi= zk9%5SgSs#^@lI4fp%}YADmq^%Y#X>PGeU<@>2DN|J^Vdw=3V)7pF4F|U?<3(Bl`R;&AJ|DU*%6S?hNqd?+v}dOlj3@* z@VNZwz=F|ZPJ;wGKRnk9or|;DlSe zl)0OJUakix1EArhPou*hNXJV;EFX~u=0OChY{&>j58Hr5IHmBGtlS(is*;v)09eA0 z5^0Y1Bmj{PxB8?FQ$O=4%$;V?A?P+HXm6YF_MaJ*Xd>v}{800Ym^iv9eReuGpEE7z zb zWbAt1&CMG!Hz92NIEy0e0OBV1Z66jct4dMjsyt*NozOSlw2z^}Bdh>+q2Ujp;8|fG zbvDM2EwepXD%90QLH6~b@FjiEu2;NHZ09i$lS(wIx#`=Llz}EukwBP3HM|pD3km)J z6&k$hNfsI1GU-P#+SgGi7AD`_k;JH^S7{F8U z#hi8<8*J!xH`Ej3og)??mSFgi>~Y*>5+ABY<#b#>#$ z>DN_N@_j4vF-JrFwlCTWRpk2=AAG&2UY`v6o~)HE*7!mr6F!cm<0%LVh9Y&@byWz> zIrfaD^t~g=_ogeK8v!;*s!6vh(*bFt3Nn-MZPAaW>G)p;DJ?6=@38RspC0Z=G|nv* z^6$gP&Naghue}~5*7Li3f}V}g%~8uRjcVh4$S{$@F=Dy&jo`DWFgy88PdXGT0x-ML zlCSu{*!$_aBIM1R5X8ra-@S*Y1cBwef9eE7w)CPxeznpBMooyuYutYe*uQ;sKFlAQ zcV77#R(78#YPs>WF;b)VdSL$-PY;&~ue!YDBNm6y|8*@$LoMWtx_go{yEI>b0B9FJ za?&Ykq=hXj^t{yZ)ULMUK6kn|Z*N51-E@krN4`0)S=XtHUzMH|Xz0FAg4&Tya+`>k z!S8&7QU3OnvcnXXlpey>z3ULxHyx!KB;81uPKg7#-awWKj4zm-nro{eg9;M)E>~+% z{gv(F>g@DHNCXiL-(;V@_}G}f9*m}qPJ!IK3jmd^;_I3r2n?yNCXTJ)ZkJ%qh!q%D zKxt2$<$4;rA4i}P(Z|W~MHP=2s+Rzz3Komj4uVfCNxF}$lX39?#0p&t_Oo+y zkyFYsRHjxeNb(f6Q=-PrA#3qaz>t=d78TLpQ4{TqSaQ_D z<6_Fi{8RG|_>xcu5=m{__L5XZKc7uQjKRRueHB4KXY`0hKa2nw>1_k7DZVm^dXpPi z)cr!dUnm5U{;*kG?q5Y}+V;R|x8m|1N@o^Y_)i}Cq@m&HmZ9OuW?o&wr|(f0_AX)| zDGjq`B6^CyM!HJMog+%r44wvvMK||52(o^D*X*7DH6i;S! zzolLDnvg?c8a#9C5(iv$gvQXUq<6*N$z9P;(>HTtD^PDs8^^k*uwC5M}Pg0VxH z4l|4`D=?tgzTXIz0qFmgl6j&sH!5IZ37-D!_9khc_gW~c`DS>r0iUE(mWPL{*4_(~ z`a=`HFNKwFhqC9)IC;tQ9dTDjZQApbKafQ)dR^&Jn_GxMHr`|SN+RrtFcKLZJSXI~d1Z2s0 zxm)#|B2N(Ea4^YYD`_*1aa0#d(50j`NkM3Ucs%=#ulYDHe_+LJ#5k`{tgwD3U#=D^ z9o5{apm+1x@jx1XsBxfS-JR;sUgw8nD$gg`8@>hgzz?A3*7Px?*)%q-jH^GWZ{RZ_D~1+z{%IiyZZ$1s0MuQO=WX0ub?sUCO*e7V=m z<|#+g;iTRoi6KqVau~b@H**aQw&9t=HKmh(gbsLI=Kura&j;v#Dj*gRx1`;0soa*7 zAM(9&27F3QV!rM1Pw31a-*U9*Y<_dg;Fh^>G?9LsiUiR&tLxr{BBedo}%$>_`jWS z>>BFoVvL_wx}nQk9RGsB$uqNKya*zK_2sZAjlUHtfaFQ)1a|1iY0+HBZl~QnlNP5> z@mqC{1$@m;`7fyN0p|9;}JINu4M~AoT{7(Pa^(ZdRPV6FII&mBO_J8uC~Nr zsuFV%rP0dfsem~gARQ%$lmps)>a)T|b-+yWt*V zkjCp14f__i&dslu@1se2k(d7W91M0`bz4h+zx6*Ty%frU=s zIAYPZL*ITYo*r!wZ2s7lS(;Xs780&KsE7oGF;S}3;85I{57vcG0*x>m$YcV3pdIxD zw|~c_QJw?=A!1KOj;ipcsO z1sZ1iH6VMx=XY)tu4wIUOcWNhUqrlW?Ol8D$41=BQubw|V8V0HBnM+jcC`v9ziq>=t#jT5cs|ZF06rS{_IGV5WBh*c?*%rrR3fv#1mk#=cd>f z!7`Jsh;@ev9+~J|2)9rC=-Fh6vct-bi{TjG+YytQTzh4AODrQX1SY`!6P9=nnjpUj zg?Mq=I~@9~Enx2L0A!<9n9Ij|m4cPN{0K51aieYZmt9%Zg0o^E#46)#eo4Yc{MtzCCNyE==%ng^p0)>04zUw>U#W?d*HW8(<&1+=VZp*l zejyem{uZ_h1-EdAOrmLv&hZJ`QHs7|_XhX5?xW4gzquFUf7phbf0GggeQs?vK?z@{ z)QO6*-6q%8E`J)CM>#?uU48w0-B@9b{va#!|oebnm*l% zgmxtWBj4^7MY&cXgik%~7<9Xb}6w5ds7u&f`7tAx_D!3#KoA{!U&AWd{W# zYeS>tJ)3nd6#CB9>m>(113bNwBRym6{f?+u%T7vta^B|Cn6IU!B`hdW7Jdlb;mn&C zkier$8XM$?Q=ks^%I14I>O$nK#D^AMu1?KD*RE5Cu9u8zyG&{GGt$&PseoT3>Ei~u z5qZql$~+{JqX3-5@r=%ERcM*V760DmP=f|hq@0^SRHbNo7Z%rlhaBTQH@hhUq)})| zkQCKo70s*L@KB3&KX>)Y-ZKj~p6}-Gq_W|HH{JK%rzxZtCcHPY_GvkuDE{0>v5~T+ zHfS80AR#Bt(PFkVI?bn;(_Qf?qULD!NhLcGtyi=z3jt+LVorZ73CzhDgFKRb$+1i zKU0%$)*)4I3Qpc-z5n$(De4I7u>2uAU*jKp_e`@b;*7tFe2jadEZy1o4BvBUk)2#o z>-1fF*zR*tsOTjJIZ=nGp5p3inN#M5p253ib?#zEyetNUAQ{Tc_B;6>{o*%OYrn7qSoH}afICMEOcWoAj2+uM zSQc)2+o_n4joL|$yK(eRMI&)7L92%I5nDdvHE3O+r*HW2aDepqe>pVHJl|aH z*hpmzH;*U%6j~@d4;U+{I4G~OmM{=b%jLCtAZ7kkBTfk<%O{f|htVlu#KY3rKNJHJ zHz=QW&DRXY+6cX|B&Y`QiqIb(AD+J7>C)bMkO!LUyl$w4xgUS#q(IylFsnB7g^a+d zerM}S^D;}n*~L$w8*AtrXlp{VyyvrHU+0I> z3j{7-@sD)2`*D%z1IQz=kM@9LJBc`U9^s$o2jgKF7`)~C1^5M40dW!C{pefKY{(_` zyBzz5XlqxFZq(X$CobP~|L~>B@t0lz&$X zGE&PqiWIqZ+ksjQdn63Q@+0sBJc)Bi8w%tD$EnY&91>pP*95zf@Z>o>71Ndm2c}o^ zVB>h&(nzsxU`t_F7&eWm#)8bT+lWKpW{@;0mLVa;`z!C$?Z%S2FJQPTlnRW>DOeSU8EcL) zH)>NL?4Gf{8<}QGV`Y*K`le|(rj@cIBn_*jbHpJUcu0o~qawgSHpCLH1Lc9D`vwV^ zQ~Lq_X25E?4qXCF9RP?+z^U~>jsrYPS4*6Z77W}GHZ=HUtN-f5pKveF?*b0vA*DO- z=MPv7uC82xBX*H5*9aCj1ZV0D|2ij%MVfpVcySZhRSq&I)8Hf^nTUTxDu#^G;DD9s zq6MOHL+(J>j+9_7q%f#{b5I~nG3vvki(~j7g^o(w#4CTDrxB4)VFYE@k~^aRhQ1{%{9=><&;yz<5M>q*8PUm4sq(2E-8KQFZM4;Q9UbjyjT5l zerP3UvLFHHd_sDpb?!VO^|-2dGAFDpLPle!y-s+llzeI} zv!mBWzxyvv)-4V+T7v4uOZ0bO-m?O=0i(WG9#(eXHihJqP zbLR!DQ~2R+uwl1M*clFt;g*J7TJeH990WRW9Y+Z-DHM~-1Ar_=+X-nj>B4(RPNMW% zG%uV(v|5$~Q_A9uq!Wh@Jd+2dwv)^_St5@15P8o)AD%q=I53Th5)g`qN~1VXUU2~_ z0V#qtAZcDa&m%)EF^1OzE6#2ZC6m*Ei2$H*-CT(pWbUP&0A^k!CPPJ3Efb{ik`Qkr z;E@P)2eR*cqJY$V@xpwN5;O6eGDI&M)Qi@UgQ&@pcFT?cAP{MBFt{>exSXm*%cS;W-(skSou`kFlSxgN^Q%dxsqGR_=wEl4-nNX1dWIjFsZ zuE(xu%sQmpGQjZV_iHTfM30}g?0F>BCX2afu8XSnQRB!ASoqiFbz%x)jRN$ct%;ldOn@tB#M$>Lq5V9TERz)DFvrVBgZi? z$%mdifBcY^R_bY2LIvg2u1oo0J$*cY0oE8|jm{c`qpJ8bAu8S5Flw&o&A0Gt>+Gl7 zHH~X06Q7w2OMLn{f24%(F+;AT&C_lN)=0X1_=6fDu+QV4;P4yrVd|Neyb=RlleL|C zT|aL;{F30b#ZDSbi+D_OvF;l^q=PP9Gc404=|s1FU(>l#Dw;A(nt&aBeNA8aYLswz z&&!Hiv@c}Tg-)e7*yFQ{z4on>y$QK%yD5->%tFOh-A`sG1SZxF>jLZ%D}Iiy+XQxd z=5mFbx)Jp7LK*WtVo-CVVXtItu|yx7p`pq(7Lx|u9P&J&qwt@xW?mmeX<-FiIKA0> zqepr{MT+1@OAB#u$E-KL--%$fNJ^jIy<-=%(>z3Zs*0(1G>pnR^^y*2=JP*nc9niz zU*^Y=EJp#ubB8;Ro~1d4cUO&tchtzl{A}_N(uCdYx}q|!U!`dyPinlP*=%0?q!CpC z%uqY2_r=I%QMyZoExv4X(Mo0*9hyW^P@5_*l{>XFaK~xa+HiC{pKjIv)4dTiWRkqL8U2mV6W{IEvPdKrCwy~^bENeYE@GSLfOXaLo11m1f%uXugS9Sx6+S|FX zWTO|XH}@g+dh12s6X_8OIqmP2n`(R3hu`NX-g@mYCOx9Rv=v$POzgu6>MD_&@!tuw zb=cQ=b;Lk~Mb7&K`V4UCuF;<1E93R*f7&bF{Q{H-dZ%n)?_vG6$CZLeaoXzo3dVQ% zoT8Ih=yzNgz23tnp%nALR{PhzvY}U$$N(|0op*ADGEil@k|lXET>t)`mR_QJ((1U0 zPw_T%IiNmO(@fzkgSL3fT>b;s_u7Kf=*N%Gb=-eUE&YG*;Z0tbk=g+N0s90cB7{~fa6~8WG~G=H|Zc%epy@>*gfPFnNH8nBK0%pLp7H_jC0XWvGjHo=D2es-0c& z#JBW&1_w9q{keN3wEO;yp=S0_hC_DC2YF>7f#XJHAKttO8XomC3h=8FTYao&c*dCW zDM`8ZbfneaLDSwwIi-asZ+pWoec3As&&yyJ`qAG3?Y4iWR3_goYnRNhuN(A7C#*hk z6TATG0u90Xi+AP}L>@h-Z?LPcI6ShxM2gU2TWhZ^$|=GA&{|@bBF@E((d2NXx_ zUk+bL$yljTyftWRixpjI3RMT**g{@DDYV>eZ3*=FDYHUHR_Q`9bVi+fVRH!oH zFs{YX2Y;0+dyi>{XOUED6{pCN(A7fFs!cJA4 z*Z3M_tg!LDqwn*DB;xa3=lKfDT$2eL_@@NC1;Baz!E#CS`RhW>q53BNb`Rx%Jg39% zmd{O2>-(xayYcyXnB4saNW(WDL-UQm6%XCnVywaCmD#ZKr(A`vpwTn!^mo@9EN2#6 zCL}M$P1omm=X5cg-22L=)%(BawF&#b*FTciAkk-XygYEK*A%ZBZ-1ZtyrQPbK z@Uzpc1@7k_CWy9Wbb>#6UjMxL>iK)gw|#>;kNWuri983zzL^Yzi@3vRI6vR|)s|Vo zfb5~sXtu8d^Kl{n&CI7y3yC{c_fNs}`xjq9TYq-$8S0*})riI#_07G3bqIshPACTl zS-ibcc$V7^&mEI!y6(Ic|1&TS-2VCBd7F)Jw~U6HgO9qlabf}ADV4Jc6+Aw?5G_f!sc`$L>jboHh8^h*&g~w)T293tc zubk0o%bHe95WeN>#laI)&(>C-=)zw&asLHK#l1KmJ_$U#(X5GHwwXmO>-`yZ$@JEX z(^!!esLifctQ-F8BIUCvy?59(ju#g&LU-Q5}mq? zLij=N$~hJztd7|yyN#IFI@cgNXj&}-w)HXo6COR<+G}*RG@<5R{Izny4Ck5bLA(&W z@4CYybNYLcaInSN&u_1Q@w!gEa@p2@p33WZxFhDvr%o)t(DeRL2-V&b<&a^bv|&x! z;fgo~dn4cD?pZwzA-`Utr=yTcVn%`Ax@ENb^_9{Y3zt;LRtmX$d%n&#av72LRWlSp~lOdm_+XF-X{b<|LQM-FaSxmC-|cjisl+N-C$Fq4ME|=1oIa z-*-H^Ncr1r1+g!L5c?9pRAh|jv;~fvJe|DfAla!v4SDCadG|#3rc%q82i z7gkiWvODLmseImjt1mG`qWvh5P5NpnDP9^*-RjZNNodsj`kmwx_|f0o?ext*`jbX( zdx{*t*->MIyTx&}&sr-I;(w|2)Mman+B!7!Tj|(PxN*T-0i+u>EO9g2ft(7;c&YXM zHo~E)DZDvf{Gl@W^XK#e{t-G_x-^|HCHQ?t+d3N;a%fA*ir=N45e8lLDdb~3A)LNc^kX<$g_tbK9lef;>y3;41vASh- zB9Sfh>hk5Gg=_bJ9=cf;5Z>W$i5Vjnw`S4Wwn}<)05<0K*7Z2wS5{ zvYq9PwUXraoI=fqbA`Pkd#ysMzk8YOZ#(~cX`PmSbX$4Rd8+b-<%+Mn66j6qqIY%j zl!4Uk6{K(W=(CvEFl;*C*~Mv_+rfwC9y(Q?^ox835{@y=Z+p3+cMCDq z{aH*|R`x35hnczYUx}YB!9V{5dp|Mdi`qMe-iV3l&?J+@PMrCf;Ku4l7kt<>&CI1$GZ3IbKPYi8DKzkJ6J|c{hc^!)5W_xJWY2n$gDvB-r?d9mowEhW=rUP zagP{=hTAt&6MOh&kF!NLOWCi}Zt7TAINmBv8UOg@*Q+1}!n+-i(4$+nd9S>~c860j z>4=K#>QcnUb1D1N0j6eOs5YNA^sz>f9MSiI>kp0O@oP7nwt{WZk3wqZ!UnD^ova^R zYr6Mjrv7&0=BKa7uaDi_WO`v>=^w|px^2H1*0wEek5Cy~xb(eFAJ#}j8WcD!3!9hG zbE&s)3XrwPw}9V_m$jMV34K#N##XONrb|noaUN{w#a6Mp1D1B~CQpyS0B&Kx=9^tJs;$?`OGPKAj9tb%~=eOf8nJj*(S1??8Brv^Ib6}>P&#VUfM^K z#e3T(p4fLR>1MT<>N?TiSKmC^7}5XuZ#(pA>rkr>PUEaCkj~Evzu7ilv!x^m82rI= zGo8Ory}-(fTTp$lXlP!&^JG?vOV!Kqp*A=(f`$XOI9CL3KW46~Gxsgjn( z563M)_lD^uuty{V zbPvm2-{YPG(uT2O;{}f)*j%ZUmx<@8qoHD9P+vigrfjZyu0s&HgoRBI*Dm24G%mA% zz~WFeWGYQ>psBr+r{(T@O{t#VW&Ol5r^Oa2)g@^oG1&gizD%QU&ma8RRTPsw8+uZQ z7AGq&Vtm}9VZf+2xrR9L)>(j=kAFT_@cN@^PR@UEUsGSqv+2w7bSZ=RAC4t&g{Xrx zI^gfB9_(iQZr^Ek`#@Xfdz|fe;LSHT{?Ha6VX2wvF5kzl39UXy8EbE#7fzH2&SLpC z99)NgoYZ{xRkJS5cy6l?e(R_Z#hjNQ0=9zCi4o}*0wVAOHfj285*02E;|E%+-@?RD z%s_Q+_U5h*%%vrV2`IrFeR#As?P*ZDr5zeiq7lS}wMQWmv@s4;Nduw= zz-A&La5O$0k0l?%7n5irpmK3F>^QuQN-8GZa z4*+)Mtew1K)?@LHBHMJE%4tbo!iOp zbbJ?n^%UON18Q-6qi`&8I^c~=*5B5v?xyelRtRb>q>@zaEuwY6UpI~c7hMu$ha;m+ zii=ngNBaMck;+X41QgY5QSXXQ??kd|1TgBL?6ewgEHAW*UCeQnL_!(aOhTTcYu4GC zGSkdIx$|r7uPJ(YB9&+xQCwfSnuWQ$11q^1fGUmCNb3d1PRgvjGdP0aHfXWBOd&;W zo~JEdLPW*J74N;?iVBhyWBy7feOvGSaWXbIALT3xvLs?q@jvHp*_>x2nyhXj7KCer zuS3G#n*%FzI{6w^%{F>f8To}zR#&91Sxp$>>(@L`kwLh?BK)glq9A7I(UJff6wA)f zKkJn%&?f6-5f)!`jh8Hidx7}d+hiP{dT1E{8OelmB(A%9Ld_w%^4DS`PA+WrXo%$o z_Q7XRcJWJcXne+9Qs@d$CC!9?Z|X zLoD4*t2?QjRlD!dBKa!d=DFjBv+}y+;H#hG7PgbnHQMT3aq4BmU6Xz|C|5_Bn8%I3 z4YGE)Xp=zTVv=o8v@9ZA3C8lHL&kaXmDAx!Wk7}oE5B69oMYfe?LB&tnmIx^Ro~}R z>UJ=I{_>UIk@~B0w{~*Mf3)qNSkQS7vdR=n{1LnUBH(>xepJZUIG3{>+3fRm69wcm z1dG-C-}s2g660I8v$pm;LN9OGI}$3^Pd5)GK*sstvw zTnRWWK79cxcbdJ6eaYT(^b(y;H{-#*h<&9Q(E-a*4DDJxG*Z4NKlqPy6`kw_&2@vy zgTd;hCLaHlDq=<}^azD@zvs_l{|bKgIb76;`_EUd46Xl8oUg)PB(hlm&?5XqPR^#e zE;@kcSA@ua)j5eQgP;^spZgfT0ciBUs3-sSzy4d?|M~C3*WXe9qQ3oZ-S6HX+W+G6 zZC`A^XaCLqz1g2n|0!ndU)T@Zry@+mw*S6Z-aqze-}_(D(*C3UpWpvo7z*DX-!J-C z^!HoTKUUQ8{?K-0Z`At!aP$89!B&@xeyRQY_WQ~H`KUe9ov8h&(f!r^@xLZl4z{fN z_hmol--Z36J<~6L-r4>#-MneKAGNvvvdeTUDtzC)I?CY1L|@Tp9&YHL|4Aq_I^PK< zjIqS1mA;te@x()gDg5>X0vKsdkf1d*-lB_>Ge>A6^^d@0zyhQ%4dKL!r@P5h3y1&q{^vle&HU&* zEzfI3=M-sHZ$JPHY#dY32K!`al)(@2%+-WoS|kpM3pgecze4!})5(J%RxEzu zi;i5{4b@WcrDy9heU~QkE&DFDC9b7YcqvLF(>Ly;&C=BdCFGgbjUs_z=HUn*9}gUQ zN3YW(I?i8COD?6d(i5JB_tRkQX(KHyVDWqi?pT?5!F|)Y{>~ul{Da|v0Vn6L9_eo1xq09N| z_XVcyHW9wo{iPU@{&X+@I7^EPdWQPs|0zb}dH~^;+2LAeYIV21u z0{CCDu{>qR)KEa5#4@>99h=_#sN7AS0EWY=45En&2Iemc5cn|gQjofg$f2ly(NPmI z>2ncf2p-dw(BiR#^s3X5s}@(TjI|}j^KE$#G30G36a~LVwgx=tdf}X)`TR&&BkD>G zXjQyzOg0pVwN}<84IZVX!w(b_{pK(pvSpLz^}C86{NMAWtJaNwS=u#}5J}+tecs~I zQE3iV7~9Rtax2=ce0ApJ0Jure>tf)?;*B=b4@R%?Ge6IDa>GdH<%TT;{pHzq8=DL3 zzGdTe-y~MQhbDJiUp}eCkQM;On8KzutiZ8JvNOY9Rdj+(o3VRJ9HT$yi{CcnJhrV!2FqEclP z9OGR0pXPJDRPA=V-)ClcpJQ(?ellHoW|4ZmbH7IL^3qAK_@U$D#(}2A^X+;GFfg+! zHWS32+pqU7aeE`1q)kQiKV&TBsajm^w;CQ4gBYfsxe%q_b=@kjBHg{2Ie-#k?Fa4S z6dNPo8Eh?{s++i$#z@UO)>2bkSl{P4|2Acl;dhO)^iIEe_VI6I0XFnTfq8pGrRcT0 z;HVX$-!V|Eofa0?0KN|-p|#LSjkRzQWdN|2HHhLs&}O_2Z6q#CjS5L5XM!NYmPwA_ zqsl@=Ad$jPBcQ122O*g_pSgnrlqPJBhVs0&2j1g{+!m)RgRNpl@fklkpOksr26Yqz zpDBG6Nv!)hKlc;63{|_QzR|PmUMO}%;aL0r`2v&JN4AGof-eT2c=k{5??s881=F_~ z+V~xES?{ssm+{A64S&hA4Jq3GQ-0#j)1`@tD@%w0g* z^+l(EkG8BlHbGsFll;i`-&q~aU~lZz^@ zvgu}zZh|g}#a8t@3VF)7Iv`SOJ6uU=$Y0)ez*EB>h)6jvqML7A6pT80eDF(Hj?n7m zwbo9KVIsrsy0eB_s201l z@~rfHo`y%_y0gy9E2P1ZFGrs5IUfld5WV}P7H;KX*2iebtZu?Kc;*W}Ta}&RMf&&3T@^_itLRp(VJgTcj%Ed5*T_sQAF> zyzd47s?EGd5qH9_uyUu{&K}f$R1mdk;DrNKdS7cdZy0Vo_~J+~=yOk;33bfci576G z*WXn6#Ki9o(Vz2Dv3bJnmp*tK+vE};vcyC97W<&NrRHS(u9w*O2CL1yuA(Cg@7-{h zFNAv%?JoJ5U7gKgq?yd+orJ^ND@b^2?hZ(B@=bxja~|J=477}K;!NY$KGxx9JWzu# zWVF)&OY7*GEO+8`*hh^hsczr|%J)5+RnN%W)js$$Gny(ZnUA3Cqo*kqqI-(j9vD?l z^1j*9zH=iC8N?3iXULp>oq`e*_-pRBDWJ^bmQ%~tye`7)83WCJ!c=lq%)h^WVhW-K zk+8ksVjp1qJ8=5&DDIPb4)IHH?yicSzfAx1jKqZa z!mF%pJBD2yKU~H7Wt@<_myJQY5=qgzH|sha`HPg9-8=*m(s2?r!##9VwW_9R@r3HI zNaL82C$#dWh|J&@rB5xtteB_PeI3{1-op~GZ+RgaslnZp?uek*YQ)7$AN%1%E$20l zV6JMvYpE(+9&{|pkD+xw8J>q^hq_WQ`|Gd?EBeTQ=+1iQK^GLrO;O>XUb8k^*h)yf!?xivzT>O}7PxPLeXSJ76Q>jmrL^cdFR8;x zO9IUXvTh04igyL;VBBQ2_y+BkfKX2CC86NeuKE#J{E5HiG1#|tD8v8Yh5a`Cp2@oz z0jiP)iK;@^&F{>zl=GgV2pvmmPW;wuKZl}zRDmjg#yo?Ya3HX6m^wwenujmd*=&ST zMjp;69ZYWel8m?BxnEA>du93v>`Wa}hW|Ada2>lZ)-(U^ z?c=u=BxV%N)oJKu94v5k3K*{H|>6nPZE2AC_Bd^WqD zS1$6ulNRvfO}({|g%aGTaOl$C_G=N1YMN@i@|y21{Nb!~;Y)d?bWwxy^+hY&4sEFU zhkG*Vis?=s)sad8j~nL> zz#HA|O0-6UcAak9eHmvlsN||bPK5?sYB0vqxaw|B0NVF^#pAmQU|(+Ja|G0LCSu&4 zrx2zQZ7MG9DmCnmps3NFBVUV(!_vG~nNQxPpOWBgkAf>wdVvxU78kC#Vx?l3#)X~fFMClIz~ zGD~B{o&RwN z_iCZ}V1X9CDxSy}Cm}dRWP12}GH?;eLg%u?Dj&ENv zyHv6VX<2hyt@dD{4a!4*E+h!uc>6KV&-KGS>Ll_dsl}o64V%PPpKe+*z5Zi~mhv%< zER!Ca3ZikgTh_GCb-SEV({Wa1lPZH*?f_|J@xa~V`R^O8Z)e1q$L^u%Q+MkjBd_|U z!~7Wv+}2D)W8e-I*)RLjP|T_23s?4bEaluNE6re*GTjAcE8R4(ukD9K2dKl*%}_#a zK&+Rleq!?6SFr;Dm=hn--qHsrLH_L54EK*gPFW-_stK^D-tJMpf4Odm~Je`&oID9(wtLM`e(|+u3$U!sBq0Ew=~&fAGPlX8EUQpToik&9~#ZS)k_h~ z7s{M2(?}UE8k#;?|Kyu)d(?6vk=LNYFZ|c#JN^@r!e5P=ujd>+$zwFBnw0teg9A{L?+uHSxzb^INCs-ci)kCqvPFs{4;$ zGM^kJexe^%u6bxA(uA9JDB$-)5$4jKhrGMlop!V>wijUkxG!f$-4P$XysU{+DRGfY zcJpsjD`ufQQ(PT4eUUu6*(Rj*M$H!*WV3u1*jm?k1C<@fdU(GkI_dbWx2v(Bg8oov z=p4#x_<{eEV12P6*CSa`mW36F=CnXWbcgiN3x269-G@j>Q(}p&07K*L_K&L8xRaSN zMd-~qlj)k4H7jQGt5VBJoralAp$eW|dP71P;^8t^i zGw!2pGL1^H9_<7668B6q5`#o6%+KE%9g}!DjO8 zhh=NEe?2Z6SZb{uO+oUiZ)y~0m2D}EaZi_Iy|FSH7oYBMj{IsT9gJ69@U*S%_gH%iN~4T#Urv10?&o}{h3Y@Yuq1) zJF4N0z(pvF&FId{w%+ZvGD$UM0Tb`t+^vhb-_ZrjMwLB-YfXXV!h$Hj4Y+)QpR9GP zTuJqw`aPpm>|y{)F9&-(37G^(>tJG3HZI)FuJ`$Xr$<)*Ho7U!Gf z+gjSPm2I6f@8TW?#Wyy;{XASq%+uR%BriLP7Fw@S{b#xYdKQ;NLuE#M&eq@9ey(;j zJV{tw>nl7uUb&U%)snGwuah&YS0y{g^w&{Z>tcJq_?1WxhUcaC(Kw9_d?8{HWtrG* zIHE_sbS+ReaJxC@LHp*OQcHLJ7e{W@rIw51=g9i;>hSUDP8p?g-tf)(u3=HxfSk#m zBtA%hCTkD`XZ1?Hku*u{NQwmIVd%-zQ>$e^ZS&(cKjf~wSMnZAG(OAiKN-80TCd(J zmx}QbFYEEDBLCccB|aHg@PlZ0`G=!ipA1m9mIJL!PL%o7nkdsSF#jrDwEv;FfPLvB zoQ+FN3hY~fkEBu763eb3oVhXaa)Fc{<;KLr@#nv3iBN8qA7XWV5$&FR5OfX!_`a^l0zV;M97{9uXRLF*CANG(``7KK%il%^nn zd||Le|6LQVqMo@BBit}4Z_9HvFF)%B4f0F$@P*t;U#W5Jq*8?ZMMH?D5_`8|uzNeT zbp4>dpZa^*H*Mr7;W1>(*fon%77@z5u4mihf=}jO3y{-QyowNDEp<)?n&P1B9qO0h zde!!=3QW$Cz+OQ}hv}up7R2J#R2-MHej$YYrc#zo#)8!ASTrt<+t7sj0iHM2Rp`F< zp^rBMu7aN831Q_58`UC6!s?p|94w-}?ibs?4W-Mj+57TL;fFog17MMQ7EzaJ*ek_K zEW*#|7)_Jc*p;I5;S70JJrxZjJA?+GgSWgos`~o{WC<{ds#q46Brv@HCQ~vt*TyK# zY=A>B&$Y(ixU1};;9eVjn-REHRrGd#@SnD0H8x9WaSa0@DKywow7;PH+Tdh#d)9GK za<-cPH9x%P_D>wBlDe~q!`@>ebt0v86Ni|k2m)7_iB9}p(>Jjxq7b(8jGpNQ z3|DfQ?6*&U0#0Kf17%s1aDdQFTZtt#V5m!>ri$+QsRVbIO+*7a2F24x~FuYeF<{2E@z z@%DcK=anes+@{@uFsfiQ9Gh^ung5JqR&;Pdl@@5*d5mAn@Qh$X+!b>2RSu6gOC9Gr zx1klX>awqI=Z%RWiv}Z73%P-6WC5vNZzm@wo5|cBt}tAiEnaP}u>Mkjv6jaNqr8>8 zh53GvxyHgA9?gF%<4X1X!+-~VR?wPl0dWA&?Z6r36sIRaK4*Y1D%!B~(H1s*USntU zhTgqI`^5enc@gbjTO6Dnk5ngX69w9LgMx#9`b$WZl{kXe*XT}8)VgA7h4dc|?q0id z#WBsa9XtF82TYpau;S4HVokfWIlHN59A?tgE*=>%T~P*(&0BdSBaZ$6Cf2ZH_^P!8 zqg?&h!w}T%j!%=#L8?KAK7qqfA-;}vWB&8%{DY>Yjb>wR&u)^Biw75ix-6!f&0LO* z!umSfhDYPL%N~-_Q^$A3*{ObG@sYGh;bIkVP+Jrp)FOqG+^Q*AkVj7&5xDhAOViqF zyIw^K*(I$>Zy$7YUs&!l@sztl@IDEBVAOCA>d;5N`EF68*zeI97+ zRy#rgLYtM-s5LEnLO(Ia*C(KOg-4;6MS}=yR^HYF`8;BQqixheX5r#Bbi)Ef?;_`q zaRVT=ivs8G_ykw0I3IeYjeJ zG39DH{Zlo=fEs!~k8ZrSxvXDIsK-6E0F4mFWAga$|qSZ2ziZuR}^ z?z7+vLkUGG5(DLK=V1wCK73L{EI18`HlAODU_`B_#4)u~3=$ zbIyq5Thcu|1AxuDSgJhtS0DXzQON@o!#lyGKfss$469-~3>qC^4XMhgcrugKqB>JZ zctb;@5O<=nbev$qO@cS42pnz%MbFz9ZxzdOh16E@@g+LDSh3H`$vP!CHl(B(I$NDP z?jad{?0S}$K{omr*#zYjb10WZiYy<=wT~GUJ3$v+ea;9iupEf$md(hKATD_+s1h_B zUr8fz$Y1plq zMKPeZmRqkb)pfqp7L;2hftDb8=Xw`s&&4E_>zFX8&4}~h>nI2+su^Rp5b(c zHy#Z3u9$kMNqC@z6p8%>d{USx9S@nMi^sfn{WB3CY4B92s~CR}Oh9Z{DK=>-13jJ0 zkCNGY%YNae4v#*akqeq6)4%LHL9tAx>%32oiHp3#0Axj7q*Gu(lHFvz_((Vk4 zk0g4O0W!|Pa@TIg_CHpOLBJGA`5jdgmh-rFzd2 z%FtS6N5J6>cYDF@TZ{RtB9Cm+r6k#FWjKZgqPxlA_KEhkRrdFcjLMed?C>Nh*22%l zL00nzs+4D@*^Zl}`cf^=kvW59jHh2l4mVrHMP29-%?-AYuXh3<7_ zZ<|YCtR4%y1@9O=GF=4zFqOix8{fw;WnSOx&|N&RS_pM}%VDoqbxWM+idwyxV_4yw zEnsL=(_c^sy({C3^E{UkK!=%C1V_3R%6!3o7s&8fhJs@I9M$n|m{wR~B;z^Ju#Sn* zD5urtcD4c1K)=+&V#CH3S6tH{0UdA6Hg#=(cfBQ6YHhdiYCiA?fC1+ho z!$OLi@&~Q#<8z)Or``dUPph3{aFF#K({hY`>+UiSUvP3)gT$ncmU@nQhE4RG(mIV79^x zHt7`gkfB{;VyWo~FdFf6Lt39c+=nhAf+#%%VDlAHj4Su-=!k?^2PZ^@(RJ^s<@GTVF{UEX?PR#|bkL`cKGY!FUP-rCN_9U z?niqaidx?|C~LcNM_}Xbz2^sd3(Tgp=PH>gKS2onHEm6HE>5jFlbG%wK0WLvKBeye z{Sp7$@x<<3!x5~naO)a#&1xuiTC4GZo=T{KO0rocddjg}P;Z)^0 z>MYKs%GI@b7|i@8l1g=O0dbctOMjAM0`%J{*~IqPd8K*xBvhkdvg}Z2W*aNP$l*9y zWoM)PBVBo7uQZuu%CpMhQjwRUGtOoSOd~B;I%(C)^omn0`?&ar%l8pTUp+lpVuf_1 zm2FemF|lry#H)KGd*0a@wdk-!{T;NIo z(b8sRRl01dVXD+x9vd>ON2a?AmF;%n0;Oe27I(`Z<17kWlu2%!UnDM(3!mR2r*Tw= zY0pcEM1w5Fa!{18477P9pR1{0v=$i@OFq;@bTk!#6v4nK__?f%FAXvE+!X?-jy0Pu zq=94fV>uYTF23|I2G$u?vDP#$qdb$$063Wo7`$w=G0S3|ZY5@k&v_PA;#NdQnd7D; z8PN#fRId~X39Ez|lw0p2g@SE&CK+~64Hp}1KItkgT+*Kg3clhP>~Xl{mfZ2Y z&mtV1f@_Rzue8QRf_uAXXkHVA6}z|;b55Gwn$40~HKnY_mU)BTT60O_773)Sv-)E$Nm7-{koEXnhGFhglHAB;%<*pU`r*#d{&a()K+b9hk7l%kQ%d4}sij z$Sw2p9wHPeWA58F0w0euB8en|ST9Mok3ZQl2e!@A>%B7isxS&suo@FSPR1}oHRMEO z;|DC;Ij0F|+?RLKzsA0;ol}`1U>PVkur}{?Wx&?7^W4Tn{^z#^TMVrugvKXZF!6o$B|7|y33x>=5?x(*@v`yOQwTRYV9Gq4*M^8XyT;-2O z-})5Y6^JyBkq_fAW3oV@pkNG!EvTk@qTH^+wk#ISHXH%Tmx3C`@`_ezJb7<`QEXLq zAZ91EC8nyy*u3Vt+@Y_>DPF^`zS1^1j5FlFkUw(`D zMYcw0aR|3r+%ANrgcA_SWfG2#>=6WZv^htzE|@5^G5F{BXe|3|d8cvpY4koRudobJ zoQ98&V`ApCeI?yL71rgXd<8v$(sA!cM-`l>UI^~ot%$xIMV%gVV6B6m>s^6dxWZcz ziG2O82I0`|2x@}^u-WAp6#-7Ez(imQV*!~?zJ7my@15$Ep9#fm^CfNojtd-$Zc>bwmrNb}u6ZAoIRGKah6Fab^-V&arjI zif{^&id+@Us<#mQEHtA|BBh z%Cs@8DU)k9tZFiJsO}KD%9Rw?H5C3kc09RWYqn&Iq0v20?~bTtCHc~5Y~`k`B7bv7 zz(zXur(27n$LW-Z_~rijg)WOUx94vKY?030-8Dt?Ju9xO8>{6mVy)j)6blY4LK@!s zf^+xGwCxvJ?+no&3f($AdqI zSyCBhKa!;UW3a6*CV?lWOI@Y+r1b@M-g|5lLhjC71>7Gzv-YJY^-j%&>L8Ljm({j8 zz4=^^hCSrTVJURls0L4RH2JJA-^3d4JAWkl4lM9OJSm^>H{uPSE7*!gvV6UKB81r>)SOJ7qvEOa!gmRWd27f| z^w&Cdxx>P*mB0|4;MPLPq$`6@4?ghbbj{-fll)UPEJ#k_O#MS;5)&j*I-{?|w&vz- zbjSWLFk#~8$Gf2Ox%KTVX%xrpe$08yiPmT4K7kI|h+#9@$*ff+G^tCr?gCU6$`|ir zCMF@B6Rpvm#p4`}z@S9IWUyn3MjSnps4M>530*2DuZ%Tgw9pZ&?k13|?x>%RM~_{6iZ^K{ zjrl#F!@9n3LY3iWSA~JQ!iupc-vlZ`o}|P3m3+=zntzyFMJF=>eGprsDA#*~@-x$7 zb)R>ALQ}b-#lAgFJ7d}~yy$Um6hf0NRkk<(X5C- zQ78}_XE>)MnVgbFqvTUu=*?kw3G@!ea&S$_6F(pdk-0wUm?P-ac@hGI~eQG1uqz|Gjc$TI9^H^5X7|TB+z`61W7~Z zQtCcnnonv_RG*z%t;-0koFBj;x$C%7bhGN8&L;4YltJ7Y-Ih8!M(o3eI$CHk zn^$!0vI&lBu#BjBx>Dw;pZNjwxdf!61SS@Np+svE`KWx32)Yl><~-9k{?^mF$0rSE z8tnPw1$1?j)}`mJDQ13TvsIezpS=BoH)(_UajSs7rkh?b>j&uXmCdY5uFbvrPA92b znbP`(Gtwb=8pjMc+f!pCk&{8HcRh@F$tTw4#_G+Mf`S+g)o49c+l)ee$FB zvmaK-LJ8m#y0`ptAO39r^J~<7_Vd2?GaH0(B7jYn?(pfCR3^SOJ9B8b-X)AAcfTk} z=SVm%=A*ObI*C9b5xM>~)9=Gs^rc-cz*tpsu;El4fPVA8>%+o1#cckG=R61vQBHjp z5!reMPIUiie+fIp$N;KA#c+VxHL*Z;?zl_}`W*Des!^Z7T*JkMj*0^^V!Bb2!*!BT zDbjfMB2Ik9*ysI0LMx>M{ zjYqM+Nd6BMk*&g%^$;Dok}R8Nv0RNC4~k^B*k!5ackV|1`Oj3D)3u9%o&$l$rTdb0 zPC%&+zuG6W6+nC9c(IE~lPBVDh_na-Ig%B7{n}baw=)%+j2Zh=sN-c8O&7^$OP_#? z_xBA)H8CdbbyEf=i<6|MVYnnyF&dOuNTHO=GJqw!Wx8+xIGCq>k|;)Yb)_MaSQ#n| zuFG&C8MeXtvBVdT=gY^v+J9XKPMrORiUIs8rFf&9VPmogbrewe2XEq&7o%gHfAfr- z#{zct=3Yy0&MCeafhbp~`hm`yiPc%d-M@vz9{(rfaepDa{7A!?wc1}uX*%aGP2C4^ zmaO>40I2^*D$#4(xss=><2>J`@M_hiw^VSM1@x}WtAl0mhI?yIgZPoNqW15*dr&blqK zCjT1dTM4&iX=h4@ce>`UVN!A(VYTh4bhJTPkszY00X?rp6)4U~w~{ujhu5#}&NB3k z3gO(LFDe6Sg)+R>TKU!TT!HTTm;aQCnnf-B0kJtd+4qmoPhfuY96F^QE?qLBxIv9L%HfwTNg=Ftt$Sq>spWK11Q|-g=S>Rh zFn7;$N81TU${XnIDNo?6bZ@?Z0*$Z^Q~*V7@aOboI2 z9~rz{5xE#I-9b#2L~iRp0pBP6QfCM|)PIm?=-EcLs17T=c|0WDRRZ=eobdV&_H6Fg zw}U+C9;HZFQ+vP9rqZi`hu|HEN6nnQLF}PzI7w4nx?6du|BX1-Oy#;gQ=$r-A;Udk zJy|6^X#HktsElkumw>(s=XsFi-nQc*?Eo2dSL=`|8}RkdojaR!WFBUA6aY-%NP%-w zVs%TL$zY-=F^OjChJm8Z3Iw76`ML-f0EUx_EWBFpI~>znq56XP2xGtkI0q?&!u4M*vaxnbVx$~i*z|~@Hd~wWVt$NN5oqQ zh+(7#2L@uROEmI}?~zzioItU7G6g4!XMxLTS&1Nvl;y+q;V6U*L$w2mOot+eM}ddG zqQ2vbCjK2Z9P{0R3FA~I5+^^6#qBA$e!oPN!rr!0gWSf5~va4yTeI5veBcP+$*@4=0=%^k#I;g(sq_n2I zCK_j1gO$>pz*$Lmb3-{8dCa)E&DM`rp1JcY0iGF4_?dSB*)_0_Svj5;rfG(gsaY8m z(G+u1S{Mm|B)F%<+DGm4I90uvSwLVVbxbu`=${;fZ(sc&zNF_MdKT>TUxcWSRf-Z1 zM-LpnJg$*ohWirT`ZotAWPs1L*hyW#Q}tGoGSky?U41yk{J0tD!tl||W+Jm^Zxb8S zJ<#9jCV`P3rXElyg+r(uaWCGmE3@w^Tx5wBYL41BKF#T+|EqNJPwKp!3HMRWJN`tC zW-*`Ov;vQJeQJIoc!4RNk*k)YSEi$|Uf^Pv2)hKPU`fe@j@enPb2dLo!wttnXKtyR zU@Gwrn*a}QJHobd>Qjr z8DhGZkK`b3qy|QF9NI#{Kt`Thi7!)Ii$lknEBXSXh_kgAmyJe8CX9M+ud~EP>0lgq zUtGU>{FL>D&`(?|jEhUm@uM^9Q6564AuJONAAh!#$9%1*_1S$!;GG`dC&p`oq1T@X z`E@;`XL)@5E%nFs-%@{uf2i{fRncNTpLOI}6TU7`Z|3~HaQb_tYcfI)IUu_pHl%Bl z)g_5XVQn*$aoUz#qTG-)EE;%$4`9AgC9NT=d_CEjl!4D27=&adq_EP8%*2d=PJ$C9 zvGqiyu+gWi+$sRg&{`)8%Txn89Z4MqFn_o#bF9sEYsn@klEWMbq`40g!#YKv0It)u>Xl zTDxCc%~HVKQ~M&C%$L2w9?GzD+iFMM6Vh%>@}EoPl|`x}&8AvO4I*0sH# zei#FF_{bt;fZM&BC>Z0^e@^R0Nz@7&0Fj2S?Q(S8Okj3Qgn4OK276D_O4_}+5E@8S zQp~M9q5_O5i>S!bFOf{9o!7C!cQ-H{LVw;@cv0%kBZf_+IsgkFz9Yk2A4%#;CWP9_ z%g}q;ie^ORivq&duzZC)h_qzx5s&i!5cexfBk3-ydty}Y^$J9v6uO1(w)lpQ92Z=3 z=WU^FN}GtRla<&#(bxG^9C(x=I07f-_Xk(lPpzgGAR)agbh8_WcP={yXg|}2FyxZN z6m-oT{MaI}1MDIkcyFK@fUKH zG@rv>zdZ3E7Xd=$(*)SL??w{cq+jnQ(&VqK{PEw!5ChafcF9plXyo0N3JHs8e=~!N z61Z$&f8t==I$T-PP}w}*-X-SbcDcm=IpV3vJn!tIBXV$OXf)S%tpP!k>tB8-IN;2z ziF4^U7k<*%v^HY{wZ4?GJ~gHfE&s9l-R!4i;xJ0} z(wfzs$4fXhZ^*TeQ3f#+$1~RIw&~Wl|5gfxs)exI_W-}+>3Z0zjJxB7!xWvnUfuuj zRRH^wC5+5Mf9G;@ROa?hxOkDU%-33>Fnjo*#L}JX9o>G?7*&ROtPO6Y!mIJ^k%{3F zvy3^rPeR$I+1ecA&^k5tkZYL~(i~YNZq-2bR7P|wh zF^A>DNJ%Ad$jFzOX8wWhlybv|Gt;GjUx-tar=>;{F>Z=^1N|Trk1BCbI{f z0$MXkGJl;+6|f*&7EO@O>dr{yv^_M(Pp890mM)HS$4tfTooFYMHeG_eMbLf=IKN&| z?Vf>#$qkl(KGK>>&}>swtIbKdirnf$j@-q%SkUJiF5I|so=@Xlj59IXn|d-;;kr%A zU4qQiFEAGsMYcLWR*CPTwA3j(@PV!x_-LDXcWUK z_`*8bj_+|LIU+JqdJnQ9`rx^;9isnHcwtkjZ^6_X+I}lh8ETF@Yu=dCJh@cHlvNh! zpvOZ^h>RS!5tP*HC=wJ&?0sP*Tq04yjDl3aqRP<``Y1O@7)?@An?fUl z@{`jX>BBNIzz8vB`f!w{WFdqeY3?d!PN6tD5;VCB3pEMm;PB)!vU3_e1z*9OpOIM> zfhJU-$+7qpKxSDc9xi5s*QbY&!DYp<#QX@+5)k2{SOz_(E+is}jE_JeT#zX?`oLH* z?PRzuTAxIqx}^}p&{Q!vD5(I%2h%@aLNuO}kR@TGOQqU~GFF(n=(svW&}D>^tx;JN zBH4x*jSSNi<*uN>lU+1Olyk2zIK?;LCZ`=N;4=xT)h3tgmod8+obz_VB4Ser9tgvX ztbW6A6j^ilJSQNGVw2^X#0)6LID{jZ%LA^%q+naZQQq+ z=gh{`jbH|$@Gc}fYlK|}h2TtI zZj<3!;hKrSWP;HSd^`~#yr!tNs4FBbgZ(h{ohINP(|>~X_rLpppVeMO$4#BK+&;iPoW@Aq5qeJJukOw<4gUN8Qf?L8hecW2Y3aZgrxLwgl;?~&oO@^X0kX6H z;V+X@#l?ta1ANIEbp`gLbJpzRCy0If(VXN}M#p>y^Af2LF76zzD_7naRxmejY`ypq zv;uSXQ5<+><<902tPpzD)rh|!iZpzC%*bT}V;-#CZJASbVOEff<p%4P zN<+eK{1d)tnMqeZ{p`p~-u_+ZO?h1&zFrqb+f0i%ZxlmzMjNtX?!;~|;R`i%nQzW| zWqnfD%mnwDrJKdQgrvNhE*FHoz_HwNS@EJkkQjX=!!J0;1ZW}N5GF7Ry257;0+#FR znaf$R0W-0d`dR6sm;k;p#CXa`B0YciZ|K zkMgy&W}PptpHFL~RcFd_J&!FUi*n0t8BI=!an+>C7v#Q3bTTARA@i^5{iV`vo!&%3 zjcA>|h>%`-hqCk2AYe9}%VLO_+ zUdHD>3qL87P^df77GII#aSuZ$3PP@m)gR^6Bpu)Ep z8UEr^!qEhWMtntBCAVZ}T4+K_N|=Qsl!?E4xu!<|ZeD%AXI4!`v-R`c zCv6Y)Oqe|MIr^7#-F;s3@#SJI;9k()`~hZ-NGZ6)2n~(ji=G~Mi40f6Dr?5y&t`wQ z(QS`PEC*#pi^3&AjMbRGz0K{EIx|$Tf^4GFAC+$z&9(FFUtJ>21oA38Rd-QeIJ>zi zvKQRK=5CsMRoIWT`=PF+Yt7sp5Rm**~k^!2` z6a^ly1#o%NO-J^26`==zEDc3PQpXEweaCz2w_T<4M$+8%t_??feXB|8&Gpu0^=wKB|%hMw`D(orVQ~Atx_n zxqha|3NZS(a^rx8NXU6${6}kea<^vQ zTM*L((|GpaBI{re%u#XXmVFQ=7>+GpVZ z=D?qHo@oCy6aZ<5>HvrPrSe7Fc$c+Cb|YYcsz(|Z21NyEF|{uxjvs)Vfl{%p%{PY3 zCI0|5gfEW~B{FX}jr3=pQ+MZ!f4V%GxxGLyohOG*{FwJl<<5`yU;%gc7bRs=f8<)_ zn--wMV{OSTR&`S>GE#!(ce^5%75$NA&r~ZWu)K#1I z(Tm96nng`L&htbnw_SiI|CawU2b)_dOSLY_=`nFXxtX}tGfEZpycgH;m{-Mw^l*Ei zBDM-E?rYf@aFQG_WBdFfZ1~Bqf8p||nw^s2ANB%Axv0e@;ADiPC03w)!hQ3<>yr_> zV@$$--v8BjI`beiRBP=v%XQCETNdaC^G9YI5yzdvyV;J14tpjcIv!>ik(Y?W4N1Pr z2B~Y1Yzop+#yaoU`+U`lh#r6be8hUh)9A@qPQ1C4Cg25c_RznWgS*_{o}L8T{1o5+ zGaCHgjWNC$;lHb@|4tr!^c}v_qZ0M!~I{rco=I9PGK zC-`l5^C9}WF>AX0&B2V>tAYGEdHQX7e{N(dUVN&18cyKtXp{?@>`YGCp?-Ei zGu;JW|7GfI=wt>RX*4uw>fJHh>uOY%LRdZRvCJ|1OMDu~}_@#a4*3>AJf;f0!7LwvUg?P?Zn9U{aIE?pS&t!KVroOdux#e6EtaF^5)#I2~ z+Z69G;yl_gyt7%w#-+M`Q1CbS%c9+9|IF-TTunmV)7}i#H;bAV-e;7!Ib^XS9`u>L zA#ZiL95j3KDtNv3uO&J875eq2Oxt+*GzagPON#n6Q~|#}Ru%X$5ay`+`*`qo@1DWG zv76YEc4^Whc}bqn20nNHNhBkGlH!FD$6UEAx~h{UEO$P6 ziHD1+r9JMGp~cf>w)i2xnLy%{?g{LDNG~OSIzBr8u**#x7Y5%u=&H7y`0J|{-<^I^o)x5&up)i__^)nzcD%UDF2q)%}a zH^lgNk@N41GgYROKAcg#jDmgdiJbZTG6-i{@1Y4)Z`0915RoPaqnOo)khaL= zH)6nJbxN-CcDduDOMkZuDk~iTW<77(kZCN5ZEM+2Pxv_Of4s?J(Y*e3y-iuhQNlLer(sr~7?sbr#FV0U!J@k1cs_r@-s0Qqc_0_(D6IsE+|travj^q>6q zBYINnJ&G-g4JuiZ9R*j@1|Euk@7R%eKlL4> zkTIY6wQlEB>m2_3jbC)vy}m0@_~S@weo`#7yM490O8RaRQ{QDYzY}rZTq!Z(CfmI) zb|X@^6Mx~cV;IwAq1qn_T=ptY?Hk&l>Hqo7H)^)_$oN5g|8xlpywWe@lNXmz#~mq4VQD|Mo9GN$>lIl)QfMufCW5AGQ16pe)1E z)?b6)jr8xA^4Bk8uKyc0wI)z!^;Y?)fOg28fB*mblF)|>)be$bl>d>!R-51s8~^)l z?orW^k{SR2pgR%v5Y=G*1)?%(0O+F5M=Izw7y*F%^Ctl2e>Z^HINi7keVM{uE?B05A?vw7x@R7zbSY!Fo=}{@?ZU=+@~FZ#+oHE5_*ju%kksV9J^A zIu5vSAHkY}0_20{E3kl1ts!}9rG&iAm!E&+1KBNZgUr&K;j$>U#d$+4md2 z9Q3_DU#5!C?~vLsKtBKtY$ZzUzkBv->Fx5XGkOyCJF*JE?avwmo(mDY_V)1C8GtPx zz&aKZoIuwI&TBc}9=aI-!&+|WT@ApG%#}NS`n)yybQ8-Rx?yY@_B(X?=p+?7?;VZ& z;QZhT@_A>rb^dXB_So|@VSVmPAxj5G?~W|CQdC2#KIQf1WeKgm34Hv&JqMgm0}NvZ zF#Z7i0w`7k80z8@7!Vkzw;kX2(;A0W@8>hawHf)gcuwD48eI%k6r0?pUR%HO*z@M) zz`z^spPsABe-R7_{SXiuvcC0(wblOGj>nPOuXn#!U)a6&l2A|peJYD^8=kcqf+auWTpZW+_J#GcMiOaqF zebnkXvvlR#o?`A%>%r&dZvj8{FI+oNeA615@%`wvO2EjQkkYuEY?ezzrQaVpN1nG` zbm}@P4xFnvXmmVXeW@7wBWCqOXy2XS%g+K15|@txU#%N_@LPH9^l4=E3x!c>has>s zcy#;Z$F~nRKLn`0z%ZKU&5KuAx9#+YtQ;!*SQ)GG`e1+g=DnBR!TD3Z&tA>Fd*O0g z^!9Yth3(4ZyQ_B;+W}@0{--Oa3)kLx_*n~$31zQ@c(tu=4nJVh2XG$Q&%HgI{yzYG zK!d;Q+U>zZce~~1*srDk? z-m`r7)6b_f?(`0icez`SYR$vjlx}rOZI`cJ%-(N4!@Is8ef0utHs{B^IqmQVfB@fT z*Tx<28QHz>UwQ4^`)NM4Z6?0DyXB4-)*pQOFE+=e_T86fXh5xZYoHlcoF`qi){44m z(OtdW=I!kDsx(}@-rdgcIg#rv?#t!ZufE~lI}Wv#2IIrCx6Qo10Yx8XlHQDSwOKO) zbe0pY`dDvy_ipbuyxWrRTXr?+-rd6N8jv#b6clHA)V!z432a9g6MU=F0DP zp1coEhJZ0QyV@PH*4@KhTe`Jdzysk>d$ZkB=5{!}SH0QqM$M#wYTD~_2VV1_yVrJY z_i^{79anp8z0Td?>FVC%`*yzPyHmq@*W1PQ*TVBtK92jjv(|KO)k+|&j+k3OUy!B1Ipy9UD z%}l@p-N1HP)!x~b_jhY!Q#SWF?#pV2yF!qAb!%YktnT4}0Ge0c1<$+1^B1@{*WV9M zd3?I_-uHVpFaja(c7jBQuIw#o)mvS$$C=l)?7e~NuV$NXr`@8xX?^Ecr$?n+@^@~` z?H#7~(?}1Gf~XWEEe6#42S-67y29y7*9j`#&%M3y)dB|Xr%RTA000MN+BRu@c71!W zS6%h%zWdL5X?>aYa1tj@TItKAt18_^r<+Gsy|Z=Kz0?Yo<0RJGZSFL5=V6}u-8Xl~ z+velD?T*i$4?~Xthr-kZG(B^>oo={wD9u<0S1kMDkt#b3prJ)oCA+y%6;h;#NT;TP zp7(cc?{9j&!=bk~XTA3M?S;tR``z9d4k!Qs=R2sWwa(esQ`e9OR?3I55r)~$w8L)n z+|PHec{Ovlub%awP+ws5^nC~3x7~xSnNIA!umXYT05q)~uv4JAx8Hl08*29F8>%?> zZj~~-yWV@k_K#UEnUZwY@C~bLZ1jWORTX`CwiQ>ePM*x>eXU!vzQ>obo*m9)(cLXh z2T0Dm02cdvc0RaP&YxGeVWkmzrwex2G|)QJty7)3vB$SV)6xzRDP-H zKh)JfN@yAegAg=mXaEL)00000000C0y=W;vs6qj1jAK95jc64XeHd6WGy|E4>O&-T z0Ygj~jX9Vaod&HLed2@qm60`~ib#rrG7&ILUiP(4WYQ$6fdc7N0eF+}g#izs{ILcC zpuachoBpT$Hd+3v5{FTG*rJoXRYHXFm8TL`brieR(W9EnG)%p^)?n{4^{aB`sl8Lp z-PESd)~1bKwI6XPQC|{V^wVfbu^?ZP zx9eAOv`jUxbbGH{zPG+#IHu*w=(AguIlJby&2G(?OEsx47OKa`r?;BsRdMq-D3!T4 ztd6sHS$wS7dM$4AeYx$|9mBGU(y|@|f&^G(M4dBglG9Txv@NPs*=4DywGE}Rvo^CT zOInc#fgr0u(5kgX0xbeBR8=fOrbsOXA|Q6as5k(DAa=zoz(@r=WBTE4# z!R(@3oC`_7;^ZM5xjd16Z!F*b+vN=|c+Mo0^ndi$9s2OoEviyo)5jJ5xB7bjcUQnG z5j#)*o<9|qxWjE0GRUnz+m5r)QEFoOPMcGw`np+ho)`S@B7Udg8cQm9&rOW?-gxUu zMCXe3hpUNuNX8$XBP#Rc=CmJ=t^Ta*6Q>00H1dB!v*EWY)Q5TEP!ddy{!+Yy!3K!X zp7@cEpQFces_u6y4q{k-61tE2_w~-tPVRZ~BDG$l3XCsVqCZDxibaGEF(L>{PL9$O7^ku;!ly6tv#+={TAp)Nw*2z zO=WeauU%(;R9z)0^U^ohglm?OO-CaxHI`{2N{G%&WM_F$rmK9OioEZW#|l~T|UtXLBrN)+a7D zJ@J+CI#x}Fjpe;QN`*zsH@0U;sraqZlOat%$_Yz#tr9xK5x}gtZ1Fw|Xvt3AQRgbd z&`5l9ob#Lx{j;2RX6kd_%CVoeR!T(PAFI&HlcutbZ98#!?^rONN+Z6K;W}ZGS=!Od zP7@wZ1~BI}n5B_UuQ~CvThqRLmN-AA_cGy%bzWTO53d-;hCQ>+RE)aUch;1c=3n07 zY;@Go(l%I@R)N#x@F~$sCnzm%1GWrzcWwVvv2~U@Min%7nWYl&la$UTsz*uCkwRog zHIl{W#zB7vzF+g&oUK_G*=n67ewxnS7xzi|UGl`EDZe4~istPni`bV*IEqnm%iSqs zvVJQ*4s*(pYi}M@zb!aNes{So%j**0IcRG4KRj^bOrG5M@~8b9YtvTmL7zOdoTudb z^v0a`rt{t+%9E?%O5#OaeK87^rpazi_MSz5bIXQ!eIBhm>%S?>!8noLu~Z4quMZ|T zug~#vb9VUg{NJCh-$qvTE*@{03V(y$O-=nS=Y0I!beo4r?2)s~oZ_-?uf{(4Q%OWE zrQM$XW1iQ6PQF_@IqeNA$*8KcaU;9s$U^CH=%`P$VH8bdQ)iu{x=nfF8q%euONw0j zuc5Euirn)~vv<}J$~1{iNcx?Fmd?^ay7;2#l4iDbfbyHMmR=Dg9Z-;FguGD@|CbI@ zZe2qAQ&)M!;o4Pm!336w< z187GtYkC~ttTN`L82%(3!%Y8LYhxDqUY?cLM@iP?)0*?!t(mF5a_D!* zUVh2(t% zkrbv(@2pwA)e1dPJAg~7$|~^DHkIoO?^n)`YSw-R)RkoNdeu$VSCDZWuxKq1s>OqO zvCW+^ouGd9c|A#`?4vLAXt1U4&GDof>hgkH@WjWZDw|x%UN4QGj_zrt3QEGVNW-~j zb3_ory*(z&?d{1|H}}q6@A-EvLTYl>Pal5=OxOJVKhYs0(_hb7a$JqP3ICMaTF(NO z?;;#=xhCg_da6mjSP$m<;!r*;u#@;?)vjxq)i& zg3-8WOC2J4zx>sbp45~{^51fDxusj^yiH!!mesthjo%7bt^4w(|Eo!3y9d)O^7{Ba zH$G`t`_SZBIPdb_zWICRbC~+>RZC{peJy%?)h>_p8c>7urqi?8cHrhRtQ1)~c0Vpp zUG@L7$J-j5HsZoVr$xgCT0e+{AmAcm4Z+4k>UJK3tHblVcyClKDY1-tj&FDS*?N9n zURp|c&KFH5GIRV-;q%gpMUmx4ms)z?5}QqAON*SSP=(c7Gb*WVkyT8*v+$Me;SEVq$mKicyyi)Ah4i&dZMSOP-`XG^jUAX~f;rU!F1PC2J#s1JHD@UNkj9k;An z^Vbxlgon-f(13$Tac+GtX>HHve5*n;`s1>nbq*fc-@WG=MySqLj$RqcLamf}r@gw% z1oR#}Ta+Rp&!b<5BpPG)+PKU~x zQTS!He9OC6D)NbMhw^&EvQ+6@;nbGSXH&bzooGG0R4|%u+&&y*Jgl{eM#of=@K2iS z#@Tz~bTCex@}E)+3^01~zLtJ#7@EtUS~{wyjm;$1|Fh}&sh(BOE8+KRQTaZ|#<$8a zw~i)H!u48TmMl&0^uYz3n!|YOxmrYZ>| znzT~USE}Qy%R>v*D?x=ExJZD6e#ss>^g8yhO!`+oj$7FLi{7v)63Td3$3B&LrG?ht zor!g3=-LLH5SLETIcStNm$vV|Ql^QmpBa)&kVDF2`qbLU0k6xiDHo=akU8n;dPU%W@6}`)B=wrwQ(4%epM_=Po*+h(Q3K@v zTi3Z-6Vu(XIo~x_vY*a*Y1Yl(C$3B0omNjcbe&p2JoAnOk@+zIDZ2oW#E|72I5Trk zL=KBDW@n-lyHD&{NZJ|TS@QWE7o5`f{JIB*lJvX&BPDUhRA9 z>)Ss3WgTaiTj)oF%uF0`Koi723|3N@C%Ttp?Z+qOLVF@z=r5pb5Z4O>rWTz7v8nB6 zXar%9Rg&V)lWF@_r2nP%*E{wlImp^tPFbq{hXu%3z{ z6B&1J%RMa;nxx(}q)zp{tcw}Sug58=v;9xPMy7(ZzPP=$%lN8yi^Wp4Nm(=T6TRXY zl<^0NpQoie(S4~MRm{0Log+?LO}Viv*d=w(>ZHzHZQF&_ILygtySP$!EhQ=w%5>>U z%~G<`QqPSX?|({P8>?~f(<-cH{8K|ugTDu-85#tt{}|4+*$k6+pgn1?Th>)rAvaDH z_1W$uxC&KxZ6M0Pj|5$0PAs3=rpqPo;U2CQ#+(8@G@P?J!#Yf0pASB>l!swB?cS>< z>fRi+Yc+E6yj^1UoqT*Tmer+l$|`NXwRF}IRn0oXaPyI$ey63m=u)7lntBHW&BM*; zL-%lxCEbHLq!##mJShineo7qBB zqV8`sdM}*V)RIe=e~Ch1?!#n|N*5QJotAFomic=(T1+0_8D4s1=3Sp!GoES`c;Dj! z&NR%7Z4hT@hrKZzr?}Q_CgV@;=W0rQCMZbkf=0L`0I&`)v6`h+Sm&O@|Lk zULB_YB-HSFC>JD4TxPKnsYJU&(Oqhy3DnqSGTx|>AQ<^`uow4)CSyn_-+4_l+3e7O zWYS5J%ug|R#+aeN_^R-%R-QT3pNU^eyC?VR&+mF(Xc;L{;fkGfov1d}9ELMt(F0tW zNN$9R4oX}}M0S?(^301-?BTTs_z&HliZH&ahCUP5v4k{DSz?1jbdpMm(n%Zk$}{{j zLQFV(Oqk-vnKMKH5|o^T_*98cjOewM!q?#k zu}u%5*9K*>NH*ZcP(lj|z{Wkovw)EXXn zkIi$gn)R`=7oBA)Nf&3Gy*#B;(y_bi-KKWR2MkS}f@!Y#-v)UVY(7ypajhsM;&yI- zP~BOjVX|9C519-f?GfxvusVnU+dOdNS+Os`(i_46jlh9wiA5K&$TD*+K8k}c*?@gyMBi}2@=l^}m zA(dKUg*y_F6;t6ZReMbfv~iX(;<#pB$yf2%;adG^sa+SG2YMkjQ;Czd>ELuaS_`G! zXRMu=s%QHgvofk2_W9m0TAD!Q?MRWU^X*fdDt>on$fiSFJ@={IM_;{vb`)nNPtN~} z66fmDa<@KCVop4wd%V!+d$v_;h0GbzE89C4N}G*YZuufi-Pq8cuJit{RS2rWSiJeN zmGX#@qnAF!Ph%o$D{2?WR3>Cx-raRCkazKMWNA!n*{LmQ96COnJF%XcMtK?cvz(3x zKXi*wAYhsV$@5H$Xm+Uk*CwMs47AOuJ4CN2l&$cY?MF^|8el?k&gYKO9}k^gmosK~ z@XGmee6hW?%PFb6-jt1K$3MwY+etQWEYn*dUbGi&G?n>KV+LSzUqaEmDevO|MM7eI-{yvF_%Ok~ib?fi_P;hQ_EnY<1l^Da+ zfgi;4BW^BT6JHp)6;00_&`Ro%095LaGLEj)E0@3D`DNpo@f!rGm$HYsZq4D$u_nu9 z!#)Y4^0iw}aZ8ohqjY8ACsxl_)>}qdH|0oFzNH7?@3$9R9oWY757(D=zWVPvzmrgr z;G1MkPg-y`l&6}@MV5JCq#}&p@+O#Ox=vkldEicjaDEEJiFH~;kqXJ3=awmp8!PGE zpSw#&)zy8L(lyN>Ey8grPEROFiJ&f1+&la`GnKv5_TLjTUfiAQFkF%)$BQwFI5uk^ z;r!mKK9x~y87!M1_$s24d-clw%Z1pM_*T!!j`w$5TTv?h(o*jj16VMkCj)4`hLcC zn>6+Z4{Ra%r?I%=cpRmcv2K>4-b~F+*(88Q%kf&uffchb5E7)OLto@4+JPB`6nMD_{YWE%_C{q zrK*~{ny6??VufbYxkRT5Te%(*pBmbwRF^L)8Qi{xX$hfWCE=Nt>eDHAPbpT|xiV>o z^~|}EN_E}xppfe?bx6-mIYg{-^=V@tf?4i&2-xytZvZ5T%aM`Y!iNj(5?iL{#}g$B zzmeZ5a7E26J{{`qAhi8coUb|XZ*?@b@}PGk#aTb&>h$3;A-s4W^hl5|W)t7X)#1~FT~XPYy-v<;!J>2@JiO&D z3U@W(CxYiBd(%y6IwPmvW`qzMHQmPC`h4_dTn6^M>9epS0B zK$9D$WSY+G_VQ3)DrltN6c|*$hrQ)%#R_bE_M2>~UwP(kVD=8~znZM~bi%_UitaYw zH1#w~Q$HEPxF%uO7j`P;A!s^wp%#g{iae8;m(Y0k>OBlJ2uwW+`b(G4&Un9cFz-K0 z!v_M-vK#75$May6QBAcAdG&+8i?c}+Lq&gXBaHg0@5D8qZ85QZ7fV@-Doedi{==q3 z`iS70!|;}LF7KOfcf|371&XS-r-kc%DI6Wm9QO;=Zq)VVgA~E0mfjwQ z?(y>x!AfPG(;juP74t{)odG>R`d zT=#psv30_tT+D%b<(F&EI``G2(0GmoxL-QA*{(!{HzOM7*IM@G)#SWIV+N>{kES%y zbk)f_T$h+FOgp)hI(2Wo73N{$bhPI3?1z*7-{SATaw>rRbOV-)GQ=U;QrJo14PB|x@4BU2}z1Mbg>5)A!vNMhy z-u!S?;9afsQ(gQl@}<_&h_26GbnfuHHoBR?cT<+|U|BicUh?;yxo`E!)|)*^X_SaH zQ(CzsYJ~EiveK24_ls|n;_^9oy_$V6NHjpEIBKz(l=0zz)$TO8czXN?GD@5TZgZ5> z#i`uZe&QL|nm9WyoEpbNs+^9tHDeik9oA-7TKm*zRN2_!N!Zx2{SQy%ti`)$5pu3Z znfj%C=-E1wA(D@hX6U?`AXlupoq7@Vqsaq_i~RP#tD!)**-j^z3BnKFx? zh!ok|hi`6^o%wNolVfd2kG^>wwCjV|S>$gK#IAZHj^CanZ?$4XNU>>3c)?Fza?JMD z-vsv+9x@X#7nKmv;u!JFC85pEI&hzcK>F8%x%L_6o8V~HO!nWuhDBR5Ww{C_@gv|m z=GxDDLCpP=l*8%IhSD24FNp9I?Cd%iRp;sWwL7_1)$!;+v(_h~EU27!6)4?G{c@XZ z*2RujIyNgV(Z+t&uKD+?$k>7ZWcf~dZa(sJfS+wY>%C}domj`aIb%v@d{Ok{I4x*@ zhV#=MLP)L8Yrd)GCGfm8mjgk~J(Tg3i*$rW)v?J1-9nI1VN~ zz`yhnW!sg^(`TnF&Mi(q8$n~VbxfV>7lKKolKEafUHlm6(kmEK)!}HE+lbE9M9Ao( z70gk-mCI1VrbsV?N4EleHVvVDE7k6|Y@aR2M_E3*^R9}SR+opRXez(TacR9`wY~m>7A1zSU!KNgp7~pTI()+2N z+QU3TmrQ#@jePsz zx4KiuPEhk?-cI<)uw12i+Jz3()ZtalC-BI|*m_Q6luK@tEBOYB%1GHBcHV_Jk>*Q} z!jN6rpO0@yG}Cj-E8`Ay*KtOLB`TT8aLP2QR3$EPQ_gFYVzNaTgbDEq5c3v&y~bE-XB{v=Z}< z$F8nR?98pS>cveFDVOqsAs(f2^t45%+p~oZyy+#Ah)wKGD0k}p-6MS`sRo%y^w+E~ z=H4cy&5MZCG$8eqAnq{L^%E*cT_YL{ffv?sK{mOe`8HL+?;De;zdoQjYsR=lwJ(NQwOUS%`t0M1wqE#t>Z`aljrgNNw?(&K% z-oMwBSn5S(XqS#qEM?1%OMvK-1d@D5dXUL5R>@Kl-<05>rpowvG7r@5CUs@=DAs6> zmX_C{hjm-3N&EHjSm=Be7Rmqo$eW?!Cii`rSL(4QJw)a;veYaP#X zC&|`S{MKlSBKEa9XG%p#tnIhUzLj>k?*<%}eep?78Wiia+j`e*^2aQ6m2XLB zLXt8ZPJ$7V4O34yl4FwYwtC|Twjk>^FHN5k97GCFMqQs)R|ndUQ)Fg;ljd)bdr`FIL{P`8Y-j4wC0H; zB`DOvO+W)=t}| zllPCuKTW_dcc7nwYpZQZ{Oyf%dzxjII%?Lmi8ht0lq$+`MG5|^M9Jq``R!GSx}NcO zVW`>{pUc8l+jfM>-#+yyZIdy{7SMic9ou5_0>7cgHitBihm4pypvMVv)+Y+KP+lT<~L@xgxWCjPVkXx^k^0LLuu_-_Us#(E6&uTw{3MOdxxY;O`cqfo_fROUSkv4GOXO{aEDPM@cb+s{yu^(q}gBH>?8iYbEp zjyRhTkkF6nOx$uM40Fa=$vbZxEl6&gJy(bg=bJM&JQx`QCJ3tA3D;d_jnrQ}`n-Rm ztRRx(vp#yfa?$@uKKRBH$OL{R%I}hI1wki$k)7X(D>mCziF%#7iHya-_#~o|8QGSI zEnke^g&eAvUMeI!ck<@AnrBx!b{~lgKZvLI{-?@F4?t{ObXnBVZ+tcrm=kUF8$P{vY7e|(A z{^P!b*gu<{90;=+~RaI5UU&8g~v*|m(BcUCx?$~tBS|qoJAuG9c3*m=JB$BuY0PwnY z0K^sn>a&(BZ5P&9+&sF)Pj&ZK@Mg8+Y*p5?ZCu3oX{V954{E+fwd6RJ@q65RTKSrB z)ts&NTe8reyv6aVs;jOuA1%LsxJSQndv_Oi9N+|mhWVJemj~RL`!tg5P8PR(e;R*j-6 zb7+;WTBWs3?NwD3QS|EhIDxNvlUqCBUX+#_q1J%(`}lRL9YPOVP8*i75`F2t>GHNz zKFn12>*u3!PiVs)3=DBZ+-auYvr0bhtdNQ0gdrW7PO|D#nO_cz&HVp8=rPmFhoOu+ z87q;Yn}O002v@W>LoV!5%Gi zJZ80(SIF&d4%cg9ixJH3Q%13;i{UR8h{!KmrGM?i8skJ^(7=iyk-Y@JT@LBIFB zssJMw_~q0dEndeG556CdpTnHHA$5U?^q83@NM`waXAG7+Z2Ki>XvY^%9jHx2-_QoR zH3A&P0A49xz-z`xOOI3D;;Q0SNVB|U5KR(ELKmUrS%JzEnoBQ?w4BegPsi)o*|Qby zld$mThPtYx%fm5uMB3vznmBQC;Ez&aocoG9}K%aFqcn`UKK~w z)&>h(%{Lt?wN-4)z)Vj*3J5(=inIW<3V}c)N-D}ALa9In2vQ76p%Aesh$$_#?{^k_r3aI2D2b(KGi2o@F0C5M21@e#vZZc{| zC+uUG6K9shQth&uRNl==zIGLsYHd?yadtrF1vGf?rO0{uJMXnubMPS%dqQ6BY=$)x z18>JHbw+tcF-l#TP;g)&Geb66JTKvMEa0@NE|na)qb4#gv?)EkcubFB~}5%0}Y^ofCz4HpJ?HI zDArQOhO;*PyyF+Hk7-TYtZ;aP6Xa(YQ!pY4Nj>dufxOjS$EB*)jm-vXW{G5%Iq4ON z2rI*!4F@M-nYpG2APFm$21&l$M07weIYV-eN}|4AU1%RkJ*D&U!F{*8=kxe;*-4R4 zDeu2OJ&%Yy>^Z^Qow|rBrf|uc^~}&q1SR(AqYnS8J?H80Uj3*jO*d9==hlCBzsie|I5`qgjQ|f+h$-)p5btjJd)OPWm?C#(NEHsOI+Gj~!RU(U=!FVYLp6Z+ zNPU|y0PUjWcX#oaZ)W*8*d4t-!%7SBg+xBaLGjIkXO=!A$lroJPqTK9cPKt=0r4e0 zr(7?FutN_K>-F)j3?xM4N~-I?%YE8ZaFM+ZJZs}{DcS(@sRy|roAbqn9;L}a zd9c966G8#E-Z=3u6m-nT>=O&jqV7O0_^5rdD0#&L#BuH9XB%ih^DRe|qtpnSka*zk zS`arX`C&aBI09}rJau9_h2kt9)1@})HlykI|5i7@eN4UZ z!I;D)yBbzfXJQzg$ym(z(CfX@w3^I3uHiRXPxA!Zfu4&-DPI+8%!* zf~2IQXkbRZz(x30o-}U?4WAdKQGEif!p;i=o-kEfTX?WGuCeo}p((KPd2lh35e`*7@Tn_R>A@@yzV5cH%sSaZDqYJ&PcZL5<{B%i3S z8$=<&5`n}+0VvaL&$eD!5AfCNC(jAuTzgC2xqExVQk@L-+EC{{Nb&N=Ty(Ey)X?h( z0;A;Z_C@yh^hAm)GH!Eo2o8>32G$8dH16SBO`-l3iOQViMI*WhNt(>t_-4g%LoKt5 zDkg22Z5MOf^OK-|kMUI`+Q^sgr3MwLJrkj$0mM`vk)3*?BN2SAF6S)wPPYJ1It(U> zyH6lD*q#|78}aeR-d1fB>Ls*skjJlwgiuDHsDgTQm#8KO^?0@ z3$71c0A4YC67a)Hxd`{x9FPh7cBC(~!y!(7I0mE>yo;YLA1L*X5#W`f7sVV{8$K9^ z5Fk`hbev!vrS{9IP$)s*gnb9Tk`_MJNe^X7uDif`e0^uTW$fdL>OH6B^N$ze zC6V`eb@KIf5?FC3;%|fqHVq`s8JLMc_KISWF@0Ytwm;{5)$NV_RMXPO-EFj&f#Jgv z6}BO-qmMnM1tWTQ#*9(Fi^b%LCP{@P@J_XZU$*mgTDnw-|0gu}-w(U3>FI}q7n><# zx|W9&Kjn9t5s6UH%32yj2Uan^igL2z`b_8T-nZTtW&7vI!;wX~67XYsVz8w?Iq!CZ z7QKAgS(Grdm)TOj(_E~$IW{cP*`S;uMjfXKK@3ePVMy1Sw!KA_H8f0CZkf{Q9o!)!S+=E{Z`#0ibB8Zz{;~)ZZ-}3=V#ydH4o`YSG_c7Io&o z8=4yp@T>c5C@t$+#YR^omQ`T=q0(BLX&5lBo1P3Mu>)=EIzZ&MRCQ)AgBPfTlaYU{C=ArCE4hChjRv~VblJ- z44D4=pBNi6`VT3t$orS^bk(?UB_5I;sP5EnYm&8LnH6)%5Bx7B&npq>4hjrpR_`hn zfp;_#KqNq#Oqz&`(V`F^Vm=J+Tj+B1cD&^esiVZCX$}3Y-S{_(VIl%Yj{}1q?gNx7 zTEU=f%Yq+xeK)yFK~Tgz@DYm${5ZMvQPh&eM+p7YG9e)_WairPyHJ{BBV_5_sSj0D z8BE0*qAH3&>>(k*Ngh7H{Og{TDd^KC6ZEa#}Gi5b~B`~hT zq*vz1zNY)Rupf3p8!+&1=sm=1Ah~#P=R6B+uTWy6r zn(R3e!8Fl;$W`wsqCuwiWAWZlWI}R@lRIcDPFS?6Qi>V&alroeH<>NO!u=qxiFzYH z;+X{pwg{3sk@7lc-Qck-4q-=a#!(AT^xKdYALc7P`2oM|C4!gKSW?F5AOh)hzk8^a1E#-BMS&C$a4Q%hvTREQQ z<$ez`1)+s?msX?AKaBIeXOS*7Ot?v)ti^bCw;b*g5=TdHYF|grIC$18x`e`fLG^Uc zYG$=q+DW3<$oy*|7tR2FyEF3!*5>6Uv5~7uxZ_6;?Jc7=!R+|ZX5Hb4gBaYf`8#y> z9cKQsZ_^eiDFEqoE*{CqvV6}TozXn%o%%70_LTV>(oTzrl(8ZX*>s3M(i28^(BJXv zT(q@v^<(;Q(Udr15}HnfNFCF=B-?S6m&Z-c?F_cy?W-V1P5#_8NIr(fuoBQ%F3Xl2 zl6+nkax-kru-z(l!Zm+K#(n>Wl2k{DH&`k7d;xEStp!BNvYfQ+{6t+S;RTR$yS0!5 z(5wfOH2i4C`6gEkA@+&BhBAwUx%9iQ**_YQNKCYSrDhrs%8VlvMtMG~5cm}H;Top8 zCO&;2`;^9I(NcRo44ZiD^-73qv`tzF$swqwTvhIQURddc_u(}{yyShF|Z&KwxdVK?`G+Lx0 z#*fN%$b6P}j#!ygiJA^tGRS8eLp@WNhHHJwFAitnnArNr1ZmV!?GTpe3MKZ4jT<2iZHIv5ISifNE1;9 zc)Ruvhm5*qV_9`1>@FKllg>~+(yWu~u=DoNKJ2AULL~Kxo`6tDfyoXGp?Cq7Y;YY~8Yl`q|_k^!oQOxl28jRVdVLcBA z@5np%lyNi1sn%vmZkPu>jk)t<)Mx8qRH_qj<;n=TBYd^4)jR1+jXaZvQiCI~PGEWY`SD;5d=gwfz9gek4#_qH6&~ql$o5`29VM-Y`D`V^s5~SJ0hL0R2mXD zDS~&>Sg9LCER~(dN=%cf3b0j!MQKb-gvcH5E*jo}GW@Nl3D+*_NWR((>PV5rK|)lq zo`tSQ&b9>2gSWhlBFqK3~wD)A0T#(8AC5J)fVyYI7KR9vCdhhhI_6inA+Pg%(Y%uTXv0 zYqzoF?1!5nwkr9#mN4jTv7t*l9K}TxaC;4HcjJVQ$@H~?>RQ+;#pE&Vs+N*r|aN7J#R%+Z&_uoB~q`Nc=?F5o-3 z02C9yFJ8R$<+&W9s-%=MCuEg1F;%uPuuE+#*iR>U++S|L4$>TUhTjj$BSZAwK9LW| z3MevAloYB=(ohj6?H@lg#PkvBo}aTjHB(87K)89R^yVHu&o9mF)}03SrMFa@*x>0Th@SI&G~EQ*6h^D? zv0GVjN1TZi#gYuI(Pp8pJ(CG22S0bSxIP|l&AjwC@W{_F1s)9CQwcYbYWPvlvgAt# z^Isg^UY^{8cSl{jUzs&8Wrq!$9qBqrEie8ct5cdK%azHaieQqWZ4(9}@9)u?exxz< ze#iKxW1X+N+w7siNgOzLG4ohtA9-xJQ0|4!9tvM)>-zP+_-5aOZckP3BkgGD>fq5# zD&baDAC01oc7G``_##Kg!HQYZEX^@C@esn--5*FlPbd@Y=j97e`1AIbt+AhB6fy^p zbrSJi*gUq_oBkfq-1mtiW6b4j&j6=VIHJj|!OmhIoX4PqiACAgN% z;N^cYE`ko8TFI=>v*n!Ai%EFBE2PO)y7cay7go11AC65gDbEcvD}E0eXZO|RQ?l@% zfdcun4MYMNu_a?fy?vUOwui5%WduEYMZ_@qDRQui5I-_k6 z4Usv+G3qmR8NRP0NEaDHFiA5mUk7;4>6E;D4>F$f;XfDRV3F?&d>hu>48xmAsWkE2 zhysEsH)Ap|cZBn>0g?Mup9^mBhq zh~g%*ZqW&l2s{zGWbk;`^!DSB?vePDkP6)|JmVfru5V{CdBdgd^K)20I5D!An954% zqLXQtQnC>-MrQ>ngw$b-P4;`!;-?;8Z<*vgO(y?l!X}A|?+Odc&IzJoC&A$&V-tcI z9WUyor~H?QDGXn1=#(bcwV@1?V5K9h_TqwjvoO+34N7v(jZ$^&X^}~{meF@4HgaRH zbe*%|ggXWGQdrwfzkCbKKMLs-wsHB9Ur1OCOILHzaO{Pq1`dN**56O z1Ksyy~*xbMZJ#t21WqaGkwI znnhi^;{*iO2V{4_4Dn zz~@@sy=@U`jL+6v1c2blhtMf>r>i=>Gq&eu#r%;@l1Jw8 z+tisM0y3r+>vCGO3Xv@0;~KLQvs#SI_ck1nrM=i9j8#otQ!@=?l79rF6B`?W}! zrvRdVg2)}=hfLa{8Y&+j&HT6aF(dnb;WP}sIglGT<6aG-)^?h12jq7BXX^`f z6J_YNheWjTJzWp3HS<&x-?^Y80sPaXaia%@f#h4|evjov3Krd#le-HG{z5IPI ziRiAe{QN&W-z$6KPiB2*-frSx%hD)@5m%hV8h7(3!*})Xi=O}4t_iI=bu-VkIo8eO zIWE5Zd2YpKgPo10#y&~Ws<$R}F71oe2_(1xPe8E0Z$|UOHYu-1?knlT1Gn&+;EFkv ztsh16t}jo|XGYm?^15 z`$~k{nK7M?dzAL(Z8c6wUfxEzODw~Qw;NKk$h1AeVZ|k^y^zREnF09xWA$A2GA;F? z%X9VnyUz8gQ`IiruUrA$&Ltp|T?1A)M!GJQKap)jItTaJ^Pef?PO}cq>b^=m{T$L! z!atID@Y_!wcCFHDJFrTU2m#&MJ3dLgr67irmC?y=z9R*Y2@QfL_%{~zV=<}N_D#6) z!+fob-Ku_EndR5UzF49{TRsGF!KEoQp%A9f_z-CZZQU4eFEN-4FQ<3*4oP^GZZAh!1BWd*)Yt8-Zrk5__1zn z%Mf#OQL0RU$Q?N0N&H-wpQF30w>EEO?R;80zTakmgElxDL80r@Sq+xAUKS_wR7Ozm z@xGVOb3A&MJbdT(!Nkg%1*N2ir8hBJJ_(yCv$AIZckBignx19nle@ieo-$l+Hf)(5 z^!3UmCtq%H%n~whc23nz+vF=DH!PXBij3EM{Jz($J* z$r9IMEj$)l#$cPIypgX{@qM)~j!mBUC5>7vA058BoJC&CD7OLo5@{TbblQ4tDcs3m zef^Zew{GajSqZD%_bJ&2eu=s22r@aQ9t2ma5*%X6r6Gd7r5kWShU-4_titw41P(uHK-OyWGiSK7{2Z#gn%@ zh=h`EkmXlM4KS-Z9~nJ8hg~K2$JS4e-@yFdyW8kSTP}ym+Fl!x;3hf1?A?8&HGDEm zM|z(dHPL;kpM-WH>N&QEc3%rknQnT}U_4Ul}fmj49*hj;HS zNH+!IJbZE=ca;N`te;)4g)@V82c#HJN_UI~3P+%dCQ7zxb+`aDL(~d{lQRtJs6U&% z!|`)=51NF%8TPnl`(#n++^X+p>+p{kd#Uz68aVRRw5+h=84`@$s%kDNlS7Ds(}X|r z%9A&<{HyNaYg4v{>^Ap;^j^A?naA+A|s}=?9lR?c8TWw)8X>( z%=K2mUH9&uslLumSy5UwaOI)43Uc)j_1#|ERz$02m!zwdvukx#&eaSY{zKG8CGO|i z8tZNh;b3*tEC?P{LLM7GDnwF>jH#p@r92QyEp#NA3wl{kYPvL*1VLw*?D27CYYC$*mQLot=2_nhkJ14`X_r^Oo+xBzTmrJ(9+syn$mg#_^A-N$soanfZvSGs!?Eyi5gx@qMyeA(@!w|S;IvW}ODSE#EY>UGv6+M(H! z!Y-r?vY4GoI5a;9p_djW@-dwCp7X6sH{B58s)x25D(ObLds4ngSJ#!b-R##l z4Kw<^%XZ6rI};NfTs0-Bt|dL82~c08hmGw^P*YuAT$559jlZYLP3)!Ye_SygtL9pB z5j}gl4LWLG(deYPK8c7qI=30}f|_RIreiC+GdewOE_?X;JQNu1Z6`bh>N-HO6VmaT zX$8?9tHVMj5rM{L$iZx3^0cD0WKATM@x1e~=hnr9Gf0O7NF3>Ydm2K;LakZ8s*w?1i%Wbr2WQ>#E<+PZ`E3tc8HruZ; z>!u~^i|gOcpxRkh_S1PyR=dW-@r<4+S-B=m#9+efR>)Z^%(cf?iAZ*mXU`I9w5u&+ zd%XLpi*$$^zgI0{2g^C}eF&>5APlEd3~->-*NyHw2QEGJ%8>*|bUI0V>)_XYo-RId z8XyFkl=7h2?bmKBVvNMn z{lB)|81biiBfs|r=?4|OFb!4V@9jkmqq(^s+&7Rb9vk0H>^ zLI)u;7zja^%Y7mDWP8a+2%1X6a6@BXI^$qhebuN?BoLZ6g*jOK8mc zY;%S8!KN4uKNu*Y^5w|2lr5+!o!OyA3JIkrULP4ua>K6Sf6?^=QMvm;trky^%%aC| zgPNq9C)HL&$Y{5@Nu=R^>{*+WQl94yi!S=v)tOP)fOyEFrDHac|6S|mO;x@s zItt*5XiWibH07#!k&J}`$ACPw8u5C3d;!NJQ>}2l8NRu%tDt-5Tw-b;sxn$cqfQp` zQG-gHW1r5#?IcY}ga$k{bk(TZ50U}V2w^4zMPL!JHp3s!_+LEkL}?kO=<}!LtAryH z(bqll(=&lZdvPY)n)Th7L>a_Uh!J^0aKhtf)#Fb|bXF(ZAgUVR!a@lj7@27bZVXVxf2TaXSO#BUDGuWlynXaz= z`{!EMgfNq|k1wN+pbBYC!gDm25u5cra|ZmnI?_`TV9dY6oTs^zcjBB1j8pg5I{RqH zB@J|a4($ho-p>4|E3- z9n{`Xk;SyQLsGCu>`@BOBs(7bE&Wi&NszYdgxTn5Gh`{Zt@0<5X9ym(E9Wk&Vm_;n0 zQ5l3gX59sYjcXu_{SSFx+-`r+MS}$#6+$?&Ru+RdWhhr62zok8=0HHxG z6mtIFd^RU#A&&yLa$0$+2&{*6wsHt14EE8*(pZvo!YLgYb0`URQE48vh-t6l%~AIG zK6~Y6nbS?+=|tSKnh@2T<~i(Mp;K3|Q1yom7G|5{U*LbKq5i)AGJQ?pRa30v$-`pA zG&`CN=+X0K4qAy*z5B}H3G5lae8Qgv7u@xY>^G4mZJdtzPErucJbXD@%AsA~#SOkH zhSW?5W0BN?m!<1&OzhNz=rP0N1@D10N6J*|DpAsL%q~KcQ;Xz7jCJZ|?y%TZ^P5P_ z2a}%^L5@q5mY9)2ltkkCPHsz-I%X^S*}W5g-VjNB!ygx8i|C#^O-|6#9&^RJeh!1Z z!&h!OJofgAQ(Or;UhseHiXDe~UE8R8AOTR|CnMZw4typ5NPCew1Hg&x_{|@G6P8M@)QuPo$?sxT4A~H$-BY3y-dw!;i`~nPO!(PFApECN2}E@)YA6w-WToxy^ND^cO>jMkhLAqJSX{H z^T}S)J6Y6k!|~yc+)OdI>-A1^zt$+xEcr2WQ|p@RE@+6HvrRfm5uByK34ZD-kf_ey zKb0{=Z*d{oEB%uqbyr#` zISG=g)XOfCrm|}w!pU>H?J9Xll}X0@VLa1I^;xr(X(EX?p;wzyhZeQKQk>o%Jy22_ zs+rDN=gJ5kt9Z3)vNps>r@xEaCyCu;H{;tvN_T~^sfpcBEIE{0W&!1h1|0wqc|oZ(Lhd~vJa58so{k~%Ee-O=a|}(*I>hF{IvI)1 z7O$zVB@>5wY4G7PRc=qml_M&`1UfyEB#LJ;%WGDW*Q~uDyz^Vp%V$C_od_Bm55;I& zafOKqqIB*=j-Xk%SM+^JCbl`KT(tIN`;aq5qv{t=LP3L;k#Wxhw zEc?!oW#X*G)RYu`5VL|Cj45=yj9DjK1}kXCXj;NdiP zBMRIJL9VU=S~iKXiN+npGkCXr;g!T*8Q&-mgg={jl3v|vwG1*HY{9<%`t9S-u?`oW zh;@0aaiqsnq2`EhjyssaZboWLNN~qKF&o@{Nj+=%oECOBRFt2fzaYV zZ5mBO6O~_UoZ!+XqH?7rFy`jfsYma8bCs^4txIy+_?OS)(^apz^HtsFcy3kSj1Z8S zQd4-GN*YMRPOp}J7Ww`7)Qt_wTWB&Je%Ee`zjg{JQm@y~<+t+C zppjg;k~g%5^~11lTWVQz9sf+piaBbYBZrF*Cl{1QB1fHWs7d>v^F`?NZSsKEHYGk4 z_xj$ATS69*5|BWf2s~Fb(3!g3mn{RQE}KQ#B%Frg%lS ztQp{f(j@FtX*0m@d2+}W zbwgt`kI|Svqu!KW9m!AZY|;y+`Yp;!AJOTGpL@F&l|z)SPVKVa5}`*Zs}-MK5;f8# zoolA9)jk+T+YeddrmSz&(TE!!Yu(i&xO@8khMviZp|}ZxlaY;69ak*Gm8%5fQVB5M z9Ons~?Bg6aSvbZPtXL2Oem(qyy|@!*}nt~$70ZwMXbDM|$SLz6@0 zhi?6pI4Fh4-uHp52$PuHZifZ5%G%drB znU3AD-tsb6N@-*f4u-!dX=0D1Gvf2&cNZsioL>X5I$P3^7Y)T~$(fm>8Eek`c8Ctj zMt5x*j?Dd?oiVAX>>N;;1knqVnbRXfgOFgh+0T-jV4*Fg0Q^O>m}aw9ZnIJR8?n9UTX8xpp)VuYIfEk3$sS-!VkEjVq5 z+XeGYhiBp0>e+bdO66SPs|wttr0qT3xTkJ)^Jyn}Dd%5GaLao)Z8z|97c$hA`c93R zQtP?eb80X@G{F^WiZ{;YBu32tt(CH3?I{NM@&X$KCBP zawNLilhvx3HPDj+NdseGHpe}C!o7La+X|^oen309ZDc#)d_zcjPx2?&d{17VcPZP_ z#UcWPnTJV)&ErW?BSB5gC2KsTJ>#JL`LSH{soy-Pv^{xp%0=F%imK+aDY9wu@LsJ; z^Iopc9`NWdG^f7Z?CAQ{G9<>X`Z5>H`FGcY8@eY2hiq-qEac%zwT)hJ$%N4|$HLG} zGcrg_n?8JFitp9*)1hc#9@*1vvCD34R|#WsBnesAg|aD4M=1Dol1t2;5Uz)0WR@>! z%_#12)wbm?QPm0K%UVd-J%eG&w2YJGa^J-frN4lZ3v6(1}>Wy(Yr6HiRY zG){32KC*JDNuJ1c7; zp}Fm}nYm)TGq_M?y5B03DJf++YgP_bG*P)(Zb__WMK_rAeNnP`J5vu5@Qq4sV)lFE zi0Tk1gGB^7!_pm+X_aQ`lf95V-Ea7GH+QX7*63SLb=7qhBQfT)BkP!N<0xij9enK- z-gSND&WayeDdtU3_0{EGtfc6okxlxW-@jMbEBoR26dMn9t1YYG=5w*g)ucg@1?m-P znhPhX=rn6IdvunIYi!|Qw8Ng%%QYNl}^JjghC!J?SOkcN4B}~zfCL|;l zwI?z>_(Nr*>A3fOW3x7z8dj8mBb~a+sS7%VUu(hH4?B-YVgdX;n@+P`dP8WiP~}bS zsRos;?MJKvzj6#;b1v+yRh;BY=yfE@N(aw_Cj^5|4W9N>u(=&b=`kRMbAaN)(CWd)%x=VyugyQbkrrmiD!sz_P%yc?eWT>8aQ5uJ=|0R>5UZS?0_jL^QDtvs5SPH zzG7&U>w+X!dpx^|It`In<|w>~v)SRbnj&o=PJv@WB1U(eyG_)1#7^R4B9bTBOGI#i z{oXexnQf(4eVC>+GgNKb2;TFyv-r?_p0l;>Oo|abYrfL1lC>4RuiQY=!D`q57o039YyHYOD8MbL&;s=J`t&C^RzKWXqxmd66>H zoU5iGj(6vW(7ip2SSol_)=%Ym7(Pr7<&r@m-O$}QybhC><;82vuI;sk_ZD-fqs~ql zukYRXiL>sM0xl=_;vM0)J~JOF#h;wA&Nd5g540%^8I83NA?Ls%wS*X96(mm9Dp-l8 zR;;CBg;N7*G<#RYm^B|Y$?=rWzi79=$1hS@4lC70Rjc{$4*E#<@cuS~+eM^O>bG+H z;6kA=>l6xk(C*4{!na}h{P(2&<}U)S*tME)!J}-1-vZ@3>Q-~POC8M=ZH75JH5sQO ztWt6p$(MD0t}AOe^qcokdLZ+MtI}QD|7rBR_&giS=eymf=nqx=?}zp8=)$lTa{btH zonk2nIzJQpU%Q6qy$U5R6FiD&Yb~YV&^c$OJPF@R^Q9?DbuN4N>!UQ8#^~<}oig`l z=NauoVE(p#an^G<)2}?!rQ_I4#(&j|T3V{TKdw(oekp3XWZ5m9AJ&EkcNw$mgLt~V zx1>%zjXhf@46d0R4;Ex*nn5ick1I4{Goo7iwNPpp5X|K{Z96v|t6p?svX~JIpT=s< z#wOg~q?2=)%#&%Sqe?>w9Q-_TXs4Ltp(U!9q3gNn3z6CUy7uFj8$Nzgl**+M@vrTq zl-;GE{%1$(%ebEHU3{4Z=c`N_g7sR<%o6 zi}~c{8VDFc2_ZUiJ#lHasBdZt^{^-^swWnf`Mf#WN=K7eTg_$}7qVlx2!@1A3~zn> zA>7xevf4^gccevLPSUK1QuV~{@9LZpRppm(x~W{3jt`YpSs_w+nRoHM*x8KR9Jy7| zb1LgN%^04aKGFx=5e_?~B_00nr>=m_$?g>R48zAM z-|IEwd!+Du*FJzS)Im+XU{g>vj%_t62`30uEcx z@f`4)g;GL5Pu7F?-wA{;juQ>a+Wt$UxwGxyo=0{@OdiZ!#0P%Nk?VIt?$)i|nVBou zk6dpc;DL}O2O%MRpDB`D-YQTDq>fW@nBkX~k`HcWIiQg~2te!r?#?w}G0=6MPm9>m z>%O!U9W#?gK}0YQRU_Z2gO&f~lf*4-Vq+1qilgH?S`Qa7GrBbB){iP-mV zmoFNY(yGPpEpTCYXhuxUB)x?4AgG=*1J|=e#Z5I~paYPA-j2c?M|!Cyt1@dQJ^DlO zuL8^J@akZ6X{(v?Ic>KdnwHVE=3k^^pH&DutvR!1DgfXTuJYyl`aPkz| zMa0Yw`yEWfNs0x8;=P=BcKMCm50wqbe4|IDhB702c=zxfq*LT|p0fFpc_Iv4T9@@yBa~0|R9gjJfYFnxESjh{?*o-2=h`9rrD^2Ue zA)jx+VIkH{R_jvDAmrcB({VhTPOp^fJ=^L#r^^Y}K;=P*Q6!Tyczjxw`c&DAX)~Y_ zj)|gv#na}hfo;>a11A4_V2=G3r@b(;pnhHumiCk5hlBu<%(@L!twHN^~8aJNP zp}1Ja?o6IlZ(3+j3qC=w25~!-G zRkcMh(pJrLKW!l3hG@1$n;43w#yYv7HOz1qM5Xd+iUsel)N|sYLPIIg@L_`%t^~bO#`hnwaWV(`p!pI0Fhft9LjPmYocWu1& z+P4i@ixgQcQBz?^Ww4=+Lf7Z}cv>tP^K*F;q2lCDhy>Xb1VxyB79+9SOD`#2I1g@Lm*dGP{_V*rs%3ZR#EfQj+#8DqIx~1d&i{1oNn#L_}*K3m<#cDnWR^~2iUeilhcqf{oz8&FH&(^6i6l{CNh$3oe6aFYxW=*v`xC>iYONK1t@xemM;u&Ca|ePm=eRbKZj+ z5UMXanNXK1Ggw}(Q)UelFSZDRu}gs&Om63;UUD^^{;dh{^e*^GDgzg~sO-oSyQXb? z8>he>5JSTVKLMd}Aktosag08fW&0s{;~RTC_yOz>E#24pKb-rx5Kc!YnK0m7 z`Z@#LCvTIze4bva{*OM46WY`TO)|kkz+T#H+RZg2qh*GhGO>yY!_{T1mI$FE%V5{7 zD#6*rexJ8%=KCc+&;z<^?nM9u9}c{#OU?it((V}`?v>mOfkYAOtBjBg72;XM0TdwB z*1MPpAjD*a5fKv-B1t2XrvZS#S2j&oOI*QeBCp$ zA6%J5fktom>n?6D!c1_x^rp>NPNn9&L=4zUkWkwp{G_PQnO(*+?*SO zrb0qo-l(Ff6;7}|3JK*m17J1-X%CF%2a6gs#+nm19+zerWLOA4gTDsh^;jAkvojsN z1r$+Cv{6lNu2gnS1q!M>kgx z69Q366pn1)bNA2BXUDT>>9kro(uGLQ354tTZF;hAlvz zaMe71fh$7upK9b>hfHctvfh-IO#50U>3$z=!3S>v$&L=7T9gYMA$7$u85k1^@ zL%afW$j<(|g^E-~D#?RQMPx-|j#FoC9ijMZa_`%t`hA)R{r}JKfW6XdW_0Zn84S&$ z29T&SX%cu|$8YBOTg`6uYLD@<>*?8D_F+yFWuM)zi{ojiX2$ILt@=dr&G!Y}4<|aN3 zt~vV5U`KF-%;VDrO`B#lB$qisv$s&9EhQ?#$!t($LQ*v?Xb~l(lC>3JiorR0LQu!_ za3T}L^rr}1H3vpKW9;$$L8;@v1R3ReKvE9D@z-`Qg3P%cy!ao`_bk@uxK8y|Zya3e=_?@*9awd< zUru0XW~XmY4dn;h&ZzH^xAmSCA%A1Cj%KcS<;%inkt=+4Dx<|l*JDN9*;+GIS#?$M zcXu5GROcPNU&C5&FQl%i6cvqW##>q+!;c;|+^Tv^MN;Ad-UUG3`4@@p(n^u`!$Ph@P`xkaPgvX)z?&TJ-f$a=&+a)Fey z2sA{S8-R06#6*jvljjhKY)%0JTxSsxIXmj0;P6B4!`0iANgLV3o)aNWjkecT>*IVi zwrg2s)5YfEBMM_^V9zz@eQU3#xO&7x2NyG3B|NU`v?ogD3JgVu7Li4k)ffrnXHNQF z&N_{ECoXk(VLq;7TBBced2C!W; zS!>o}p~&r(2?pvi8X3YG>=ql z-GQpUZDlsKQi7O3X0;NlQx%c2sskFO8BHOm27?cQeyn`*1vRd@!xmP zS`V0aa+J``G}GUJ_Txfea79XZwfV?g@0e)B+(91APlfhXt7dbQd$NxSc0@OqyQ#mB zji~|28RoxXim;`_OB9fk@II<9%`~OuHkf(fEY2HZ(9LOnxQF6r{Xc*)Q%wG!HrYyZ zG%i5M0gqFo<87=k+~+9$KDMHGwrP+f(=nyXA=j@B)Z0uUipPQ3NNp!7$&O5z8mMgD z(1s^_B|B5-xx-|Zl&bw>+HjR*s@WiY`>gWz<7JUVo^Sn`LA<=E|Hts5Rj&ZJ`Dp|` zGLIN0RTA+p)0DqgP;9MEJifkpbX7P*NCAsW&W>A^Bq>W;Kax2I5&e*JLrUnJ&=V$! zWTy$;g<3I_X2xryLMlJ~&)7;c&tY4DfF+h{vkVd z|GuWO;j6C?zM6Xtkv0@&>s1Or7xmQKH7o`u5Z6xsE7ci<6HZI0#^*y++!vKw5MW>3 z(SsN$8z#f!yRRpG+tJ@Y4||@Ex}kH-S90ae7H z{~+tlc~2J@p3lC6^g(_gX@E)KK$>YF!2B}2X|DY)%cg5=8|4+cHbY`z&)eW~JX8fx z6to;Caq9Ycs3sqFA7`&XlpPtp;h+d1iaibcPUz&fwe|Hy&7>gFBw1o@RVf*OVWkdD ziDGD?cvU|vQau4l0GR+`D$~jjE2t3kXJ63y2AP{The3xZ$KZh@IPA9Wlm58kvKi1( z&%ri{+;B7FlX0QhgVh{HiFJwP^z1k0;2xEl6IEBq2z!tY+aM^e-!UWBfmh1bGhx0* zq~zXJO1${aP^Fk-Mq_?1%*=BSNwYx1Sqw!VagzxH#fLM+o=L`lHhkSFq1x^jx%WHr zc{+UT9YKwQj1ib71S8)2{HH%B!|e0#%5-E_Jk?Hqe(uu(h@;*2?fl>^;fTQQa=&)0 z$1L5SPx{@PRWep?vOw(0Ui~jG6!k98#ABIMz3Kj*!TDJMs+ln|L$H$^qi~)}%SYZ0 zNC7ei8{V0Q5@~OrEc$aG1}&8RXO2{t$4TwL^9HjTp#6dw(*;n62Vs#81C5a)yZ-!G@Vm?P`)N)kLYg!s%gZ=|zw-n@lUo&1oA#L$eZCkyvMU z0;m~+RbbnenWYc59ub8l$V{p3dBL3P1yKbW3o|z# zf6g0Gyl5G-2DXN8EacR(yk#RW>Q<%GCqtlFx%@CVtp5g^y1&!iSx^T#1s{URuVWdf zNJ_!(KpSIh4dGJy*t%vbMQA&q^OgN{4+IR6-ZG!9?z(j8lRVnO7SM+WU&G|?o&N77 zR-`I63SMdn;G_M25O~TZI6N@ar3YTlsPEdm&wS$!@axtBzoAKgI~F-+C7KVA8MZ_= z=AY&O-VQbhx4AY83RJ90f_+&KMXV1`Pp3!E2)CGx1tU+iuOc_4cC6WR1c|0Syj_h` zGfcH#j~>|zR?Q*Zfzk(~dU;22;n5(n?&1@VgGr=0M!G)Ahye3UYMCbLu$t(U+-AnU zaOlyC1i`B4o20@Nw7c3u+8^}XHpcs%7jl&}i28`IV+x(b6CxndY!*r+L8I~cn<2E+ z@c~KSA)~|1=6iaBvOVh&=bs;YyiE^+w80WvM z>s4T(BVAzmgC;-=plL+bzlqdhYNBWLZxam|bk0s1Buu95M9l9*AJ-fiLJBT0>5-bK z-3F_2TzYwEWY#irebSoPPaZj5U805(ct&dN?~7*DvuxWiOCG~E)%Kjxl4~mI4F~bE zG}f(^_b;|nGYzVhH~tUWmoq$jR||Z?sST5}w#q`osk{-l6k^n6M@=7txwi|37s`G6 z$>zf0P6WC>x z$8vr9a%!<&tj93`N);-^Hy?J4@{lBq4-y@y(~g-pf85^Us|%Tkd3qT-aoldX)df!R znYdI{W+r%fu;p6|bTh6UsUL#MY~z9~_VcjDAjHW55=0a6GwsoVFRkmGx(Mj&`~E&& zJOJZjcNUQLQC4x7aYUop zp5F@})J95YtA;QSsPKl>1+#WPsZ2qvqGzp!1!VwOOw0P;=vElZt~heJ{N_?DH?{}z z4IC(TzV@g*`JR|T--zi?XUs~>UHHiLAL95hhdzRbt;b{}9P^eXB0XbbuHF!{lnh7Z z@X5J+I|o>2`7OS&8RmRO-SD2vt2JI-&P@`K2$s$12<_H)r{)Iji#} z;$NW0D(!G^n}ZX7JlP);3M+gsd9}%te;{r4mZ*x-88akH zrH=l{Y|$NEo)Dx#s@ZJ<&qbTsxzUEhLx|8*CLt2?L>*dzNV=xJpFe#0F&GQfNe01VkwH4h@HZA z)1EvAv>T2|?&I96T*6Rf@;EMGQxr?~5;zeNq;fzpok*sM*^&7I4U7)+)pLgB-Li5r zN_}nhlY8Merk}R(avXnVQ`iY!0P1l+kf|uZvk}M>Qc$=AOiF4ZO=<~R5N!lLtE7V9 zaMMN_bjItro7^cx_pnZW7#Rl<=|0l*9eBPghQQG!0BPalFAVeapx_$xL$>#UV<&iS z31s5Z)s$U{k`3EJls^xF(Vu99gBxH3H2_@U)U-N~9*7Rt&Kf(&86Y|Ev{@9eU9#Kn zDBDqwchP)I#H|qW99Pl`Ta*vR93=t7V$Z!&UGm%uxO)>ZW?v6Nk-niokrjNUx zP&RP6G4NSor9@8bnxVBGNsmwZF86f_0qv)_Q);SEQw#j?uA);-1RqUG;8J;n!y;&j z5h#m8EiN__MyPau7Du@mwgq#n<;F>npI0nZa4NA2oMf4+CtJntv7GoXH3Ju)1uxup zCzCIJXTe)zJqf#7|O_NAJ6R7$8YgF}qizM%Ob& ziUjbx{>o|kPA#V9e(e5b13%0+*~Obn*DS{_dXUU?Kbq{*)0Ovqv?TuCQ7KGas!Q$Y z{6>`fPO{Lbn}aYsT2l5dB3JkM_$s+FhU+lOUl9QKM4L3kO7#Z?7l5YO z`nUP&=_Ba9xb2ot-_7{oTf6;-_Wz1W`CYtcBi?tYRS-T#=GMz4COkBl5V zcI}M*DkH*MN+Vi2a#V>Wr7JB@=%e^?J2wn?amWuGE#T0Mq)1#0${h!p)ygp&aUb2K zh;bjR)57nE?x)}1BYtln-3{LSd9xn;PMrS`TV9Co*~Xg_9CT95I3&#sB*s1<4_5?U zlJ@*Yh=}C=IrFXS)5WH_XoecV(_ajD_V@i6d%GI0DJ=l(BJ05TarH@#wI!Y+a#=Iw zvUA5ycwWTUqog`ym{2@AgR_p`Cmq;L;!D7&w|N<%oAn*6yF5Q^iy{c4jEXEulR8>xetkt@5) zJr!8>Z^8UuN#y5Wwz(!kQGZ9bqBF*vw%aS~ax?_U5P>k+ft<49{h!LVGoqWV+lpnl z=JMo05+CJn+kF%nXu7T@Q|(#rr2i*h0k|=44zle>VsK`VVLjNe)~C(1&=MH|-N2a~ z9(^1vbxX?;-7}qcwWU54r~PToxbov7JwAS~X0#9SbL@;uSh=~O)|+v@QGHGKvr0Tm zx$cn5K$>R!edeU4{Av4>>Pb2zOYdHv$Z4UfZa>4sj*Fg_XNx>qQqjD)?klA$dVXJ0 zj2wHlx=nn8u5fd=)fG|h^U4>N8;P3Fs}0YCO{BvlF)%>T9Khl+B&*5#4Wa051X)_g ztXWfU9!F9ohiEEV0&{v7!gKq4FV-W%PE2_ylaqZ;;(wJIiK+F_;>a&+?`LnT6wsol zlbv`-ohJNEwUrMJUBv#29|hcZXHrt~%XIjiI>US|(%f=7J~?YPHC+>*9t^rW+)pH!8T_4y&ut| z`2UWYXzuU!ElwDuqK^(GIw{PW?xa!Eu2QNzg|J`$aOxV$>Hb#vs%@%nP+%yvNjgxWJm?yFqxcN@EUvbi%cVXuEzdtW0O;uG@ zSI)-0+xDd58VDeWi1p61bGhc*$h*(%%jo_Sw7AbFepwCllRIsuBAwA##OhMZX$MU0 z6+WnYTvFrcL(CnZVG`5Q&a}$Q>|4eC)|S_NK?~DZo*pLA3mAy@wR@+kpG{FimRjW8 zch}wJ=*M4en};)t?Cr*N{qk$a72YjSfg%ST1E_KR?C&u4-tYON+5LI#Z1ndqxhb8Rt>uF3lyOutV zSxvNte*wKx-`;l~#hGKSX(w9qY-L>f{WNy8YWuTNRLXat9<|9&M>yuq`M3$PudNWu zN%Qx_G7us#b+oBRW-6uO1bH4zJpYb`Hg+sRbGv%LYMH1)5(I5i`uw`St`har*x)8*M~*gM-weh*|DAR1x|g=SninvxZ)6mZZi%<58v5`>Tc~e(Z?u@n@E8O zLJ*reC=@br!^y`GgRYDL5W)maoK9+Lc@Ez2wwoPB?xPkC`TDy`JbNBl`F1?JPix`5 zY?x%3nAl6N7N^MBB|kkoe3N-(*~5A$Z*F}3&gOo}QKPiraCa1X=i@0T(~mhYQBein z^Cp6FWEF$bDw=n4W_N&rW|+DdNv&smV0O96o%D{fnuB?0)Z4OV{FlB-6)H+IOgdQr zb|qhn(&QU~RxID26Utzle48U_`*Wd$Dh#Y4UK+b|772HY_ ztNjly?)dM=c6&|nH(}gT&&GC?v^hqHl#N>nl9@2w43;c$thAfDjatg|{hy5y0wyQ4iNrAM}eAulFrKK_`o1|>;SdlTybgalb_w`FHH=Spe zK0TXGd?S2R*C-OJ2_{fymHvqhk`o#iJ(2mjV?w6#p~F9)8sD40^S!R(vuY%ig>1`T zp8_FE-G%b~qi5ml%Du;XAWKkla`wUAxR$C%+6|+|fU2m0a_s8zo3~*k?u=+{muawW zs^D6?VKfd>2&5kt!G5KtEnDQW;ikN0kvOm!!6COsju|o@y!eF(R4?QqhjAc#d zU6G-e(>dptv{&3;-2KJ;_C?oQE0V4kabNMpA1othQX20K?wS+KK<0-uNueIO@|Vme zCzqV!r4Os0Lpn_5D(v;84txD_kw`#PSy^0EXbOp*kGh;fqeB=#nBCEdjvk)olC zHz<&e3&#sfy3@$8?N#T_CDgd~LWgbP%Map>Z|#VqCF_i4xyAc=4KMW2t~2 zyQsQjo0QKagHD7l?w6519il!Rh%h0LjQSk9SDygCnt zQ58`%5hSHmD!Key(~u*dU}G|6o)Qv3woSz_LMQ<8Bwr{2AJZZaB1k;RJYe%fF8^mQ zVT`X&AdJZ!KTxyvI|s+}ZAchl84O>bPtUb<@y+pRd|lr<7#HVv3Qh~wUjUr&)ua;s1J zy3p-@5Z)JkT$h)Ii+~M14_fQwmKtZ+elhKLZvEIH()DXx7p4th@bn*b;pX)8sjYlI z#$ibzFeUPA8Thliyz^oqE6L;BC}&EwSo@2dq5SV#&vkbF*wN<{F4 z^#>ei%8uC%GKty|d3VHIJAL$H$Eo#s+^?O_jq z?qTQ-GeAcKb=sLQWVRxyQzE6yD_eB&He*O1pLsegMeD9FKKwV(1NL!oa>c_F@I{5jj9f{@3K3>`MP{_|d z^Q`w|JdGHy9#JA%*Q$M#zAkZ|gU{E>b$M@P1inpXlT4_fGFGHgw+iIx)yqLCfI?9& zb);!ct6b>ZYn?7euC}?$n$xSC*r#;UZkc0o)yh0UE z#8)X|Y`d|g&Iw3&U2B~&yRL3^BAH8;>o)GZ?(s|_?z-mXxMEE%V(rvBmvtH0*DlhU zo4UIoZt5Aeb6IOq5N)lsw%bvd(H22uSvBT!M5OWAlg`@Qu}#j5TX%7>a<03xoy~Er z8s()f*LKq#+U9~bl-SmY)geU75w@ndq+4tzXu5PWvfVz2OZh?ND^>3);?O(Tm zoZCkaMr0$&F^RNvm(F?MC!B=>j^>c*XFK7A%Z@mi7$*-_ROx}9WN&WiJM?~ZDcfhF z#bx(TJ?5xsnn}B7m=*ChdUSeTk;Q#FQMdNJPR2V6j@dW5LenhTZ^%AJy0F}mLBD4~ z!&H7}Wfobo41*x$d|xHNl-dM++*-4ns?@36Ugw?aY9y*%o-Czj^hE}wAs^f6YL+y@ z5XXfPF|F>8$oihw=a_AF&zBI>Kbp^0pwk-lbXjW19EB2*4JQ+{ng?$F?!mMg@_opb zdgH$XyJ;+P;j4PH;oY|TLSWY3(pK-J@+CaG=?4cEeCd7(gmeJ)O5D1fJ*@3+*--V= z%TTIL>?9VJ)G& zKr#vF(P0AFWcD@QO;d_WEhd654F(E5>0I!P=M^gzyFst69&bMmUlp9XRA}2J>lGMe z<)7$$e3!I3h#}1T(LAZP(?+s|p`~PzgtS$ydUyiaR89<%T=>EFE(?{m+7L{gqQ`uZ~oRW{?7;A>rTKe_7C!YF&kHzTjb z{dml~{vFggoDJCmK$v7VB%Sq#SMqmvgt!}g^gXdWXO)LeP{X{vnc22Q(ny_sqA9D6 zo47~6tg_PL7v(xz68e18a@LdDPCJJ)*0rIBaS2t(+DADUibYf$9MbOD^5qvTkp?4- zoK8N(>Bf(^a<99Z97dJll*smIOMndiG9?yc( z$_vJ-1dodMHoYgZveu@Y-dZ{pUYs0p_Vmi7@!e~qo6>m^pEcn;ly}a;gyW)mWps_Q zY6WIH7~Wrno{!J<{5{?)t^RgZL5!8rYS-qcW!a^7w`7g8ZH7sZgpy2>7R+tm6+D-# zwW8vp^q6#n{?43x`j3_nlKVFUCJvG*12iEOFeqIPj?_`@83N<_17ejvuRW!c#`jb<>QePo{v*~G`0DiuQC$&{Hkyf z{EIVYY;--W*-(mg(_ZgN`m^U9s2Z|YPt!~Dl@q#Y9LTvAUOXh<9y*^$$FBQ(>{Q~6 zxca2VpE?^ht~(2klpwD<&pbQ}*(_VdVS5EMI}T0{hri&nu9*~LxbiM~HMnW6Jsu}^ z;a6XDz8pegR7G>8wAKAD^}KO``Vuuf4-l;BNL?8?m~BuODPazUb1p zJvnXe`60llA}D~p{9ljiPJVCXp}XuKY=p!HM}xka%(k_qJ#O?DzLGk}zwW`uo_O}) z_gAEFUwp^%u`yK#wRTr*tJtkG5R|1rD3LMfrkWE-LWJitNwy(;T#QvCak}}w z94{jN1xtriYF*q>+^eQlS_XG@We!_InOIa1#;%hkw4$JcZ>6Sl-7?pn!lx()SDieoU^yKEqF5+Vc!P+umQ<9em8NSm(wFoLky)5SUCPG7u!mgvk^JFv%LV@%wML zwS7K%_J**OfKUe3OL`RTH}LH8Dc1?k0QC9t%{5aNMHrD%=152cnIH_aZz2K#*x5j0 ze{J0vU`|48%V+dwz!Q48l<@FonZnGF@!!-M7GmzOc=MArCEvo`QOMpSng3Mf@%moh zrg*%Wbss2%%r>yL4b0Dl4QaZ>zMjgO+0T_d@g6@OUJvUJyYzOYeLcQg@2?hSwcpEd z?zhj+Rjit}A4bFbef~Pf=O0vZ>coCl+P?* zq=XY{j{}T^DTh}Z8$;tM3>g%sKcqqP-L;<&BYr+MVnzaRUL^Bbxz+7{FO|mq1;!-A z${(ESYOX&i?D0CxFbF8i`=E(F9dB849&#HSC({2p*_-Dtnf2)Z1@B0VYDnV@_e;yrT%v9ftXL(Qq9V-B=YM0@r#m{?oZy_E}cbO!}y?AHrX+^hiY6IN7sl(M*#Q zXB%5DTuCz&<)6-xK~;+1gL$;v@PB*DNwv$~B&XjVm6z4|rvEG9aC}^==ic4Z{c+-n z2ha}brW^rtUb+0v_K?(M+lzxktL<250I#n8Dlzr)@J*8DyNNiuBo`d9wukAaxiQh3 zUCe25<44e54Go~mtoWv^QtEW$$)$PLEpf@tf+k8yENE2Dr&WN~lXyx8TEiXkW_-k2 z_U(qDo0@FpRBtWH>Sk%M;U{#N37CYEPM=J?m;N6-<23J+el`MMAOryD2L~BBzMVSR zPiyhZg<1|NjY+w?lJ!J<-gK^9w|;tfd*YH*q)JkFh=|www3~isCWgQZATx1~<9J`F z`4iK-sO}(keVRJNq=tb$@;2|+?mlj{@B>FXotu|7cTDS5`)lFGe)&lxkc|93%Z*Jx zM-!H3Q8fCUQes2NI&F}vkDA>bExtxi48(X4I%gk(b)49mEfi{X^}S1Tdl{5G=*<^o z$$~{7kP=q-4U#t+NN)e;iW!@8=$Ujwpny!12oXL76>$Z&Lm6P~!>=sgclT`{;7$9~2OXv7`mn`!O~aG4AB6a0?dc5+>~buzR3TFHP!5y+ct00A@a}I- z%}-X6sD96+rD%F(-T69k;aQ^h({(w{VqbI!cFWzwC~w24MZHS>wAm)wvsqzi1Ujsr z+IOcx;iOtAc(=oNE^gAe3$JKrmzmJRd z*T-9)I@PFkd88+os&W&3oPwc?&bZ16UxcJsM>2646*e5a+G$efw}#lpcjB}Z`Z?y5 zJC`Id?dRLVy6x4350>5>eMm-5>5|L2-}tb7gB^)+{Rq#ryI9$p;k<{AwVqx)3U_6f z)1Q`8CUMKd%+FJY*0YwpDA9u^$@mfZQzjDQrcHX3Xhu$J+b=3@!o0ZanhA-);FvJ zN6eqUTu(=CKQjG;vBlWHYR+V4b^2gW6bQ-6hmb%Ppk`Sr0J6SLg+8WVZuC&yg?MBR z3~VZ63%dt>y5nh**7bsMQU>l&nGfshJPV^fm8w6&%M2tV29FsSJcW*$_^-58V~E7j zYg0}MY`eRR#1$Gjn`IVcIwZMXg`T|1LnfK-p2HJX#D}=xa7`f#Av(J0!eTZTk9R4= z&>%9k2rO1%nI*@k0msb!Pc0O!>P*}PeFIZ92uw-NDcI1dhI0$M5Vw)#@aSpkGcIM@ z<@)k|*Wx21ke?my{akZ%vNGGr&ZRjN=gNL=AteG5N%?!U=5*bB!l{jP*UlThnbwVz z=4n8!i4=q}AQI|icOcl2HeskTKRq4=Mguv0jw*rLhE??M&t5a}@N3Vton&%YnVn)r zWF))%v$e9T!xp`}?S=GX7@S$H7_llQT228ZwdSX~>B&+<_)c5qr7q451pTNiKC%ypFN*0|Ta{M^$_*Y#mF7HOTwl;$vFF3K(##o>(_7nwu* zq^Ma;ybMdno=Mju(<5EFwSSfH-r&1A#TWcIR{lje4=SYJj~0%753}0$eHB5`-H<5?zc|| z&Tkjr3y+DdtZdafnPedD$gcN#@kITEa*?k-b-{%SZ8 zy;r0%+hX?07jLT7PsUg`I-1i&0*P?<~BisLMNP=r$?Fly|V0i z__x}~Obc{50GtHCgl*4P(&q8kU5g^K^5ts$zGuzi;zoLX@_evygnrq7Q0XymudPSF zyTODbM8pHj-5F>1I8;2&&LK9Lr#ez+>A@efXwlq9gZN}|(sL&=@#psT!2hhEO{Gm1sXrNY5COj zk;A)@=gP!OV|eFBIcIGi-XoJKoJ`&L`d5R_aBNKehc6B{OFje;r!oF?0ji&fmC$GEh+pfH{x3O{dPx37|YgKt_ z{e^l(AB@rVw(TRB(>zh@nG<eCazcRi@##NlBTXN^VdH0;9)4G<^t~kb2aWdE~Vnh#rRz{(twe6uZA}@faM&mY( zT`fCe;wah@7g~+`Ra-p$K8D4REnV@ON&DII3)s{Y3HdYCBKu%bEI#iiQh-4i7(CCLtY zI?k@I1Bs=yNJdN2)^0M+GQmX1toF$_=`eQ)C$HC*dfsLi-$ajoT!_t3?7GV>OqW@E zWnD|YBubp)mTnS2;wQt~0O(e6(CT6glqgNSHRs`BTh5PllU0GK7cE$;iHVRRsRN}p zf^H{YD!e;7NL1wgP*>YBwRyAaNRg3{+)n}B9E9|}dq(r5JaxS0_|GmkeBwO5IPHz6 z1M6K`w9iI<^UhN2RJh^r7P;_%r}5Glwbs6Mmp#0=auQ9+4kL0`28N8r;(+fET4y|6U)f=#JNRc zP3}W;=aC`hr2XWpq3ymsbjArA?KtVU=~L6(-Q;YJ{g3jVe zmv~Xt9+$@p(g$sxzazXh%sJJ#u2;LtaM|#2Y-qV=BCy#}e+w#--lN`JI`2*c_2+2l z{t#0ytIUxCIe0P6aTTXC2BFzAG~0o`_Ro5k#&n*MqRzjzde1ko!w5q# z2kpGo>D2PK4K_LPNZFk`IuE2wxJn%`?8%8rURs!OXh+pM&nE_OZd$|rHAFMgYmWQ4BXl;kV=I?=qu9;Z8=5Oz>@4wi-#o?ViK5+*MeR6$P zfvA}bmk!Ya7)+T07Y+rvcl@R?c_fcg%kqC8hcnuH3Kjb0-6v-SPwNM?*$Fr|e zG8Y|cWiMN?)GXV^WV!M+{j~jDK2fLDlkD^ApU7p|ooh;Yw17T{piEIT`!@AD`w%BN6A%-Y4bjkr5FPepfL> zL_|bH7=wN#$c$s`b3{Z$L_|h05r~h$oQT9@7=k0&$cTuD=OgbQrFV4kr?YYQ-0|tH zD9vVGDc#wShE%VQKJqd`Q?KmyJu)-qY9SMcx4a~I1Ybbi|{_K%klJ-Fat5ev>x(& z{bDv|)OkS+vzNmW5fhsvHl5-XfTlMyA=>%2HV&GSm{9JwzbqlWY`#=%rp=j~mO3-r zT2_n_vSL~V&W+0Ts5U|yA4aQ>+uaSPInJ$^f-%N*Qa(_0 zOK)#^*N>|2_dhcnjt!825@UlPaL{qm5Vn`_N>Q%9=xMc6-=8|ZwEQ&7Uq25`iBl#j zCP|Yd!dp1$fJkp6W3v4jN)m2dAj(gIELHtQyt0tQ87-A|&AyS#6AMlH5|_-96yDp3Ki=b?4ee)n*OwAu+NB#eoG+YkX}R4= ze_9ibMjk2h?;c!2r#-hZAta9H4Ips}>>Qh=Lt#*yBC6oj`s$TbjSfN+X_1&q`t-gInuS&Zfq<&MYfWpH z+c{_k<6m*Q{^gvzAxV9o*S<1<(Dpc!8c$@5ZZ#>MG!!4Xtgpb`?`L!+rDVg}7&lJ8 zc}S)g581mk$};VZ?%up^70`XM%Sy`Cc>OCTZ|@m;za2|$`V5UBFTGr78OTX~evWV( z72w_juC(-iU&qLGKJw#OMK$(dVibislq(w5me?t6DP@W$X)>IRT(n@*Oh;A;ix;0* z8YF_PxEVNA3eorJaV3&GurOJS@MTm^Nm<(rNkE`!PSW+S(|mShu|#DKmaX3}Hg6OXc|LQb%a`yLknZnihVsh`@tfPFzdPSgc|rwi5qu&z=C_@(KHpv~ z)98${eg{qUXG&VnyZ}~WxomYD% z%UL3Rtil)J&HD6B3kVLT4>-81VUr)7r7XWhXP8vc+4S&P4YK3z#u=DmiG~X{o)hh+ z-F?ZwN$6~3DgIX2mzriwwk)jlWr&=uEv2-!mch0AnvYDTsjHty_p6SM z$&ak}O8osY?V2#{obn|mgxS9sZ`al#yS%0@Q;yl*&YP*I=Lx%Mon`vTS1PfmFH!IE z&RBQe|4eYcbX|L=(o0^PYcB@lG3!j4;^rNF&`>x#yT7gn;Y&&r%7;yFrp#@xhv@hSM+2lZp)WGd1^8WLy^%<@8CYxbWIG zl%*2kCwf5+!eE9jykmBwZrf$nNq9Pb7Hae=}&Zq?n0>v2_ZI-F;XLr)%<_eX=lOu z)X>bF5tc*FIY9D_D5-~aPRCv^Cizr)+`|S?mL7^BbN27s`X#r1OnqG>N~NYOk5S*! znR;R$cW-o#RP!yJky^$Mly#1f`~>rH#%qE&^L7qWX}}G~PWWaRNH%T$_%Usu)7tWMRDk<(Lc_` zv&X{CzrwK|O=d)&vh-X@{ub2xgVx=dN+@DiTxs}ld7Gx%i;VlHB%kS2$;W@i!S`!3F*M8xFgFcmopAbeLn<`>t zaWM+P#LUSq2D{{+iHKPfNOH=Z#;3&X+)c629^==(1rfRP%g;NtX|p$W{=#ki9(?>% zmOFN2Nzu@eDGxVi6bVnxBz0bgwpm~7UHOn64eauu%ri4gH%9iMgLu{bO8HJ1iH^^Y zspaF7l=_o*qq_Mu50qMxIXMv79xUb>e4yZ37F=?rw%N=fBGFCsd?SL2DY`a_ zD5m~v^LWl$eAkzo;`t1+*!p;S_BE;HK4|XxCUxbZ-y@D?sx%TLIm5!8+)k0ij1ih$ zDtmLM7k0erYbmq7y|nez>baipGpQOp&1!K?3?+_CO1kXrKt@7>TQ*CEI6KcAYo=M> z&(q(xyw4BHsIKl5HYS@u$l(5$C0lsl&n6ra5(QzqjeB_f^yxR&%)z1y=GD#7oX>&5 zpxm0tW5SduG8qAH31Sc6A+1)cAqfpPbm8HHk8rqLx2-o^vR{ggdFour_VRbF2=^)} zOFq-Zt7=L%xba82oW{4+x$ZbuhS8#6P=Px-NJDZR-H(Mntlf*YemwK;u3h{&kJmI~ z#qGu4(ZHs%{#ypxcTY<<=k>{@H_-BM=Rk`r4eK1lrupFf{q&)HR{G`1qR@f#)56#^vtKH*NJE}XG+WI}he4U|CbALS* zdN;^E9=_7sr-gzr*@!#kl9A}%Z_U~I3Y|vlW|Q-gqR2UGK70K>vUB2nmzNJ=w;7x- zZ%CpM^>0p>c46UD0qV>|?!eJTJY3rWLwA-uIvN1qmCT^TryNT2B zZR{=620IiGj)Rju=1@#R5QHHJLJ*4x=>wZL4vV~@lhRhLVr}wL@I7%Ty6Tnf3Q-YN z=kuY%BF1v5T9YM&VP$&SemXqeVuVXwE^=9AA|eAzMLpVLl|M{ZNAh!Qr#idJcFXqC zXPxcIthql2%co<@iqE;)NJEinGr znQ|pJ#KS3>kVTn_J0KSjHHtZ&ji7o%cxqH6*YsCO;UohlRxmojjpHXQBLx}}0oy`t zrdj#HEc?_m_%7DV1YZx@`Ck4cL4%5L2=sa^w48V+(R1r_^0!7N$4(jOWrkqx20Mf> zPIJ;t4SrLZEm|Qd`rtiv?=_Xxtr3Yr1>flW)cWK(TU|qc9L>qJ>~(SrNz+AdI}-Jb zG+=IN9Ns`Pu}ps)Qh~d*+D#}EiR{O!RGi@>Q37uj0))vitNT2yrR=Hd$AKZ=IX~j?h2pfSxu+tg(k8QE86$`6YiPKonFuIy=SRb${ninr=X}~g*2V@;|CP!W|-lw zj7dz47BggzV*%=x3x;gSLP6#d$G-o84sBZ3fw4QpHV}x3M#MI;Z|(U*>*vSwD=V+E z(&oxGRCBwD)UAGlp)}3;B|J6+CC?*+D4z%u)PdY_(F3^32OSB=C0U%kUFAA`We*&F ze%GAUY}!+-`Fs0JuP-n^34Gx>gVe-`@6$7iGH)7ZQjbsNq)q6<_dA9D>zH<_Em}WR zb6Uhd*I_6%DxYS<}aav8q2BJFv>o5vnn!jm%o3TPGMUub3>w+WPL4adE&U>D+Bms7NMTL-8o$x|cdGI($&kb6F6@4( z$S{v91cLLQJWsDl#(nJ~M*m(}miRnH-_9S3UO(uIU z!12@VFV_#1m~~_@?1CR*$Izxw=^~7DE0n!Tii&1B?3n^hFRG8ljnFxL z`A5g+vZ4|_oMY>+jh8K1_%0m-9)rJsn(1HTVZc>sGSB*D{T|LO@OvLnJ);gN zzxKkNM2#Zz*_T#O0vq~xI!RvpiE3)*(| zPN+p4ieJ!-cuP!wT5dLMe%iS9s@=r(W2f@_ksKKB_b=;}aay(UzgpWxHLTjJ*Xi|NUORqmbmACe zEVG!n%BoX4By7tr`Tb}y#*NJ%w}&KnTiM;;ko;-l10nasB~5yn=54-fJ{@`To?GEw zGn05rXrQMm%e0<;DX2vszt=bhwf-MER|xQPCf-pZRzW7dW@?A!ooZSu z7(_JRTel)sqf%{&@roj4wUH396=gIc4JzB(r>(V@U&*qz-)!R%z5vcp z+>l#7#|p-q`qn=puU3L|TGsH;)fOE+d#bnoxn&>O zhwQL!HBGDkMFS1SuRU6<{N=!DJB>NWgN5E(#P*Y;1<4YYpRVjaQh&LAn;+9tdhIvO zX792PM?-^fi7u;qlP!219(hg%m)h^n)-s&??XACtpR;z#`E0EC;hlY^+Ztojfav;s zRb(xP${8ip`G#{`EcLTvDJDN2WR14QK0c}}{a@ty!1&{norLq#DNbNXc%bJ_=smy5 z;zNHRm?Z8n>?FyUtg(SCRBIM0HpZE%Dvhx*o;JA_jHZpKw)YuNop)@ zWeq8yv22@Bv})ML^Pb*$M$D@w))J~U8j3WUWNXt~lx>pK)Y^%9C0>b7I)2zvz(ez@ zpO!l5nT|Uv-UYTuc|VAM$_8kNUH4wmmB-(%wzPl4 z4I<(67x~rycZ>b^{8)PJNHGXU{C>Rp;ff(jSN+g|l7PNB1YQ5j=l1PUUA3#dipWD`&a!e2hvskn72WRDVpbKGEtpdM18NUEGdr@m2o zB#8t#lvsgUP);C3kliT9?Iy(8!{JeYp*}FBaMm1SV=t#f1QF-l?*m3ASk5t*p zw9RTc%Z6d!kXqHC*SbQu+5ge-Yf4g$az7jSKtRMH*niL+?DU#C0*nbT zGqz#ycv1jtKHfg}d7xaXTJBp$qO_xFlBlw26E=G9Eh-imySM^qA{gj^NHARezsbf<;%_pk{p; z*WA3K@8OYb}c&Ivcietlf2p7rRg>;!ud{93`+-1M#=-C!fi=n-5)DO zVM|+%E~Jeza=F&6AdwJ2Z72S$I~FQcQblrs8Pe}Z*5z#Y)~gnolpmtzdi!otZKqE7 zJElqJ!$Uk0$yd7Wl2Y*ADZKx){FBdjDW5nQ^;oVVd{P}iflHM;RFuG0=O#JWC`$zx zsGz8jfj?C_*%55wtz^M=%Sfvr%y%iN{#b+!rY8;lY2l)e$3D=~nXr}dc8*j6>5<9G z9PrWlrBc_?8uVIJufbwgTWHyG2Jl`_JV3tsBGf#QlTk8HFUh=UaP{fbt7?6k?xZh1N zF@Z)5#$xyjJXoXD1N5)fm>3UwU~j=8`cK+_0sn9N7(n}};Qjz)=EKa8kl%VjeCcw% zTQefjVv4WiT^jg$;OX0~oOT+fy|qacFTM ze~TPzDR`WOqR#q%zPpzAuz8b206Ksjl)xI6lL>McD>ESF{I1X>l4hpg7-P@wZ)5uX zAJVQpDeYd#G)iESrDs>I-2QF<)jG)nWT-8RYd^#2Uo1mILun@3QZ0>F+-=R0#F~<2 zNGFgS$}8cM)l3hVm1q