diff --git a/.gitignore b/.gitignore index 10d1bdb9..e3b659c7 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ **/temp/* **/tmp/* *.tsbuildinfo - +*.tsimp +*.log +packages/siop-oid4vp/lib/schemas/validation/schemaValidation.js diff --git a/.prettierignore b/.prettierignore index a8fdfef0..7c4c109f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ **/dist **/coverage **/*/node_modules +packages/siop-oid4vp/lib/schemas diff --git a/README.md b/README.md index 2bf52657..de4c3015 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@


Sphereon -
OpenID for Verifiable Credential Issuance - Client and Issuer +
OpenID for Verifiable Credentials

@@ -11,9 +11,11 @@ _IMPORTANT the packages are still in an early development stage, which means tha # Background -This is a mono-repository with a client and issuer pacakge to request and receive Verifiable Credentials using +This is a mono-repository with a client and issuer package to request and receive Verifiable Credentials using the [OpenID for Verifiable Credential Issuance](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html) ( -OpenID4VCI) specification for receiving Verifiable Credentials as a holder/subject. +OpenID4VCI) specification for receiving Verifiable Credentials as a holder/subject. In addition the monorepo contains a package +for requesting the presentation of Verifiable Credentials and Verifying these presentations [OpenID for Verifiable Presentations](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) ( +OpenID4VP) OpenID4VCI defines an API designated as Credential Endpoint that is used to issue verifiable credentials and corresponding OAuth 2.0 based authorization mechanisms (see [RFC6749]) that a Wallet uses to obtain authorization to @@ -36,8 +38,11 @@ The OpenID4VCI client is typically used in wallet type of applications, where th The OpenID4VCI issuer is used in issuer type applications, where an organization is issuing the credential(s). More info can be found in the issuer [README](./packages/issuer/README.md). Please note that the Issuer is a library. It has some examples on how to run it with REST endpoints. If you are however looking for a full solution we suggest our [SSI SDK](https://github.com/Sphereon-Opensource/ssi-sdk) or the [demo](https://github.com/Sphereon-Opensource/OID4VC-demo) +## OpenID for Verifiable Presentations -# Flows +The SIOP-OpenID4VP package is used in wallet type applications and verifier type of applications. Meaning it provides both Wallet (OpenId Provider) and Verifier (Relying Party) functionality. More info can be found in the siop-oid4vp package [README](./packages/siop-oid4vp/README.md) + +# OpenID for VCI Flows The spec lists 2 flows: @@ -53,3 +58,7 @@ authenticate first. The below diagram shows the steps involved in the pre-authorized code flow. Note that inner wallet functionalities (like saving VCs) are out of scope for this library. Also This library doesn't include any functionalities of a VC Issuer ![Flow diagram](https://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/Sphereon-Opensource/OID4VCI-client/develop/docs/preauthorized-code-flow.puml) + +# OpenID for VP Flows + +Visit the [README](./packages/siop-oid4vp/README.md) for more information. diff --git a/jest.json b/jest.json index 6abdc3d4..ed1dd8c5 100644 --- a/jest.json +++ b/jest.json @@ -1,11 +1,6 @@ { "preset": "ts-jest", - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "jsx" - ], + "moduleFileExtensions": ["ts", "tsx", "js", "jsx"], "collectCoverage": true, "collectCoverageFrom": [ "packages/**/src/**/*.ts", @@ -20,23 +15,19 @@ "!**/node_modules/**", "!**/packages/**/index.ts" ], - "coverageReporters": [ - "text", - "lcov", - "json" - ], + "coverageReporters": ["text", "lcov", "json"], "coverageDirectory": "./coverage", "transform": { "\\.jsx?$": "babel-jest", - "\\.tsx?$": ["ts-jest", { - "tsconfig": "./packages/tsconfig-base.json" - } + "\\.tsx?$": [ + "ts-jest", + { + "tsconfig": "./packages/tsconfig-base.json" + } ] }, - "testMatch": [ - "**/__tests__/**/*.spec.*", - "**/tests/**/*.spec.*" - ], + "testMatch": ["**/__tests__/**/*.spec.*", "**/tests/**/*.spec.*"], + "modulePathIgnorePatterns": ["/packages/siop-oid4vp"], "testEnvironment": "node", "automock": false, "verbose": true diff --git a/package.json b/package.json index 55f888d3..86d6d178 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@sphereon/oid4vci-workspace", "version": "0.11.0", - "description": "OpenID for Verifiable Credential Issuance workspace", + "description": "OpenID for Verifiable Credentials", "author": "Sphereon", "license": "Apache-2.0", "private": true, @@ -12,8 +12,8 @@ "fix:prettier": "prettier --write \"{packages,__tests__,!dist}/**/*.{ts,tsx,js,json,md,yml}\"", "build": "pnpm -r --stream build", "build:clean": "lerna clean -y && pnpm install && lerna run build:clean --concurrency 1", - "test:ci": "jest --config=jest.json", - "test": "jest --verbose --config=jest.json --coverage=true --detectOpenHandles", + "test:ci": "jest --config=jest.json && jest --config=packages/siop-oid4vp/jest.json", + "test": "jest --verbose --config=jest.json --coverage=true --detectOpenHandles && jest --verbose --config=packages/siop-oid4vp/jest.json --coverage=true --detectOpenHandles", "clean": "rimraf --glob **/dist **/coverage **/pnpm-lock.yaml packages/**/node_modules node_modules packages/**/tsconfig.tsbuildinfo", "publish:latest": "lerna publish --conventional-commits --include-merged-tags --create-release github --yes --dist-tag latest --registry https://registry.npmjs.org", "publish:next": "lerna publish --conventional-prerelease --force-publish --canary --no-git-tag-version --include-merged-tags --preid next --pre-dist-tag next --yes --registry https://registry.npmjs.org", @@ -49,11 +49,17 @@ "Sphereon", "Verifiable Credentials", "OpenID", + "SIOP", + "Self Issued OpenID Provider", + "OPenId for Verifiable Presentations", "OpenID for Verifiable Credential Issuance", "OAuth2", "SSI", "OpenID4VCI", + "OpenID4VP", "OIDC4VCI", - "OID4VCI" + "OIDC4VP", + "OID4VCI", + "OID4VP" ] } diff --git a/packages/siop-oid4vp/CHANGELOG.md b/packages/siop-oid4vp/CHANGELOG.md new file mode 100644 index 00000000..e6f76b85 --- /dev/null +++ b/packages/siop-oid4vp/CHANGELOG.md @@ -0,0 +1,244 @@ +# Release Notes + + +The DID Auth SIOP typescript library is still in an beta state at this point. Please note that the interfaces might +still change a bit as the software still is in active development. + +## 0.6.5 +- Added: + - Initial support for OID4VP draft 20 + - Removed did-jwt and did-resolver dependencies + - Support for pluggable signing and verification methods + - Remove Signature Types + - Remove Verification Method Types + - This PR provides verification and signing 'adapters' for x5c, jwk, and did protected jwts (x5c, and jwk functionality was not present/possible previously) + +## 0.6.4 - 2024-04-24 + +- Fixed: + - Success event was emitted even though presentation verification callback failed + - Always verify nonces, extract them from VP +- Updated: + - Update to latest @sphereon/ssi-types + +## 0.6.3 - 2024-03-20 + +- Updated: + - Update to latest @sphereon/ssi-types, including the latest @sd-jwt packages + +## 0.6.2 - 2024-03-04 + +- Fixed: + - RP kept stale options to create the request object, resulting in recreation of the same request object over and over + +## 0.6.0 - 2024-02-29 + +- Added: + - Initial support for SIOPv2 draft 11 + - Initial support for OID4VP draft 18 + - SD-JWT support + - Partial support for http(s) client_ids instead of DIDs. No validation for keys in this case yet though! + - Convert presentation submissions that inadvertently come in from external OPs as a string instead of an object + - Allow id-token only handling + - Allow vp-token only handling + - EBSI support +- Fixed: + - issue with determining whether a Presentation Definition reference has been used + - vp_token handling and nonce management was incorrect in certain cases (for instance when no id token is used) + - Make sure a presentation verification callback result throws an error if it does not verify + - Do not put VP token in the id token as default for spec versions above v10 if no explicit location is provided + - Several small fixes + +## 0.4.2 - 2023-10-01 + +Fixed an issue with did:key resolution used in Veramo + +- Fixed: + - Fixed an issue with did:key resolution from Veramo. The driver requires a mediaType which according to the spec is + optional. We now always set it as it doesn't hurt to begin with. + +## 0.4.1 - 2023-10-01 + +Fixed not being able to configure the resolver for well-known DIDs + +- Fixed: + - Well-known DIDs did not use a configured DID resolver and thus always used the universal resolver, which has + issues quite often. + +## 0.4.0 - 2023-09-28 + +- Fixed: + + - Claims are not required in the auth request + - State is not required in payloads + - We didn't handle merging of verification options present on an object and passed in as argument nicely + +- Updated: + + - Updated to another JSONPath implementation for improved security `@astronautlabs/jsonpath` + - Better error handling and logging in the session manager + - Allow for numbers in the scheme thus supporting openid4vp:// + +- Added: + - Allow to pass additional claims as verified data in the authorization response. Which can be handy in case you + want to extract data from a VP and pass that to the app that uses this library + +## v0.3.1 - 2023-05-17 + +Bugfix release, fixing RPBuilder export and a client_id bug when not explicitly provided to the RP. + +- Fixed: + - Changed RPBuilder default export to a named export + - Fix #54. The client_id took the whole registration object, instead of the client_id in case it was not provided + explicitly +- Updated: + - SSI-types have been updated to the latest version. + +## v0.3.0 - 2023-04-30 + +This release contains many breaking changes. Sorry for these, but this library still is in active development, as +reflected by the major version still being 0. +A lot of code has been refactored. Now certain classes have state, instead of passing around objects between static +methods. + +- Added: + - Allow to restrict selecting VCs against Formats not communicated in a presentation definition. For instance useful + for filtering against a OID4VP RP, which signals support for certain Formats, but uses a definition which does not + include this information + - Allow to restrict selecting VCs against DID methods not communicated in a presentation definition. For instance + useful + for filtering against a OID4VP RP, which signals support for certain DID methods, but uses a definition which does + not + include this information + - Allow passing in submission data separately from a VP. Again useful in a OID4VP situation, where presentation + submission objects can be transferred next to the VP instead if in the VP + - A simple session/state manager for the RP side. This allows to find back definitions for responses coming back in. + As this is a library the only implementation is an in memory implementation. It is left up to implementers to + create their persistent implementations + - Added support for new version of the spec + - Support for JWT VC Presentation Profile + - Support for DID domain linkage +- Removed: + - Several dependencies have been removed or moved to development dependencies. Mainly the cryptographic libraries + have + been removed +- Changed: + - Requests and responses now contain state and can be instantiated from scratch/options or from an actual payload + - Schema's for AJV are now compiled at build time, instead of at runtime. +- Fixed: + - JSON-LD contexts where not always fetched correctly (Github for instance) + - Signature callback function was not always working after creating copies of data + - React-native not playing nicely with AJV schema's + - JWT VCs/VPs were not always handled correctly + - Submission data contained several errors + - Holder was sometimes missing from the VP + - Too many other fixes to list + +## v0.2.14 - 2022-10-27 + +- Updated: + - Updated some dependencies + +## v0.2.13 - 2022-08-15 + +- Updated: + - Updated some dependencies + +## v0.2.12 - 2022-07-07 + +- Fixed: + - We did not check the proper claims in an AuthResponse to determine the key type, resulting in an invalid JWT + header + - Removed some remnants of the DID-jwt fork + +## v0.2.11 - 2022-07-01 + +- Updated: + - Update to PEX 1.1.2 + - Update several other deps +- Fixed: + - Only throw a PEX error in case PEX itself has flagged the submission to be in error + - Use nonce from request in response if available + - Remove DID-JWT fork as the current version supports SIOPv2 iss values + +## v0.2.10 - 2022-02-25 + +- Added: + - Add default resolver support to builder + +## v0.2.9 - 2022-02-23 + +- Fixed: + - Remove did-jwt dependency, since we use an internal fork for the time being anyway + +## v0.2.7 - 2022-02-11 + +- Fixed: + - Revert back to commonjs + +## v0.2.6 - 2022-02-10 + +- Added: + - Supplied withSignature support. Allowing to integrate withSignature callbacks, next to supplying private keys or + using external custodial signing with authn/authz + +## v0.2.5 - 2022-01-26 + +- Updated: + - Update @sphereon/pex to the latest stable version v1.0.2 + - Moved did-key dep to dev dependency and changed to @digitalcredentials/did-method-key + +## v0.2.4 - 2022-01-13 + +- Updated: + - Update @sphereon/pex to latest stable version v1.0.1 + +## v0.2.3 - 2021-12-10 + +- Fixed: + + - Check nonce and did support first before verifying JWT + +- Updated: + - Updated PEX dependency that fixed a JSON-path bug impacting us + +## v0.2.2 - 2021-11-29 + +- Updated: + - Updated dependencies + +## v0.2.1 - 2021-11-28 + +- Updated: + - Presentation Exchange updated to latest PEX version 0.5.x. The eventual Presentation is not a VP yet (proof will + be in next minor release) + - Update Uni Resolver client to latest version 0.3.3 + +## v0.2.0 - 2021-10-06 + +- Added: + + - Presentation Exchange support [OpenID Connect for Verifiable + Presentations(https://openid.net/specs/openid-connect-4-verifiable-presentations-1_0.html) + +- Fixed: + - Many bug fixes (see git history) + +## v0.1.1 - 2021-09-29 + +- Fixed: + - Packaging fix for the did-jwt fork we include for now + +## v0.1.0 - 2021-09-29 + +This is the first Alpha release of the DID Auth SIOP typescript library. Please note that the interfaces might still +change a bit as the software still is in active development. + +- Alpha release: + + - Low level Auth Request and Response service classes + - High Level OP and RP role service classes + - Support for most of [SIOPv2](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html) + +- Planned for Beta: + - [Support for OpenID Connect for Verifiable Presentations](https://openid.net/specs/openid-connect-4-verifiable-presentations-1_0.html) diff --git a/packages/siop-oid4vp/LICENSE b/packages/siop-oid4vp/LICENSE new file mode 100644 index 00000000..5f0d873b --- /dev/null +++ b/packages/siop-oid4vp/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2022] [Sphereon B.V.] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/siop-oid4vp/README.md b/packages/siop-oid4vp/README.md new file mode 100644 index 00000000..50ef7de0 --- /dev/null +++ b/packages/siop-oid4vp/README.md @@ -0,0 +1,1078 @@ + +

+
+ Sphereon +
Self Issued OpenID Provider (SIOPv2)
+with OpenID4VP support
+
+

+
+ +[![CI](https://github.com/Sphereon-Opensource/SIOP-OpenID4VP/actions/workflows/main.yml/badge.svg)](https://github.com/Sphereon-Opensource/SIOP-OpenID4VP/actions/workflows/main.yml) [![codecov](https://codecov.io/gh/Sphereon-Opensource/SIOP-OpenID4VP/branch/develop/graph/badge.svg?token=9P1JGUYA35)](https://codecov.io/gh/Sphereon-Opensource/SIOP-OpenID4VP) [![NPM Version](https://img.shields.io/npm/v/@sphereon/did-auth-siop.svg)](https://npm.im/@sphereon/did-auth-siop) + +An OpenID authentication library conforming to +the [Self Issued OpenID Provider v2 (SIOPv2)](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html) +and [OpenID for Verifiable Presentations (OpenID4VP)](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) +as specified in the OpenID Connect working group. + +## Introduction + +[SIOP v2](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html) is an OpenID specification to allow End-users to act as OpenID Providers (OPs) themselves. Using +Self-Issued OPs, End-users can authenticate themselves and present claims directly to a Relying Party (RP), +typically a webapp, without involving a third-party Identity Provider. This makes the interactions fully self sovereign, as +it doesn't depend on any third parties and strictly happens peer 2 peer, yet still using well known constructs from the OpenID protocol. + +Next to the user acting as an OpenID Provider, this library also has support for Verifiable Presentations using +the [Presentation Exchange](https://identity.foundation/presentation-exchange/) provided by +our [PEX](https://github.com/Sphereon-Opensource/pex) library. This means that the Relying Party can express submission +requirements in the form of Presentation Definitions, defining the Verifiable Credentials(s) types it would like to receive from the User/OP. +The OP then checks whether it has the credentials to support the Presentation Definition. Only if that is the case it will send the relevant (parts of +the) credentials as a Verifiable Presentation in the Authorization Response destined for the Webapp/Relying Party. The +relying party in turn checks validity of the Verifiable Presentation(s) as well as the match with the submission +requirements. Only if everything is verified successfully the RP serves the protected page(s). This means that the +authentication can be extended with claims about the authenticating entity, but it can also be used to easily consume +credentials from supporting applications, without having to setup DIDComm connections for instance. These credentials can either be self-asserted or from trusted 3rd party issuer. + +The term Self-Issued comes from the fact that the End-users (OP) issue self-signed ID Tokens to prove validity of the +identifiers and claims. This is a trust model different from regular OpenID Connect where the OP is run by the +third party who issues ID Tokens on behalf of the End-user to the Relying Party upon the End-user's consent. This means +the End-User is in control about his/her data instead of the 3rd party OP. + +Demo: https://vimeo.com/630104529 and a more stripped down demo: https://youtu.be/cqoKuQWPj-s + +## Active Development + +_IMPORTANT:_ + +- _This software still is in an early development stage. As such you should expect breaking changes in APIs, we + expect to keep that to a minimum though. Version 0.3.X has changed the external API, especially for Requests, Responses and slightly for the RP/OP classes._ +- _The name of the package also changed from [@sphereon/did-auth-siop](https://www.npmjs.com/package/@sphereon/did-auth-siop) to [@sphereon/siopv2-oid4vp](https://www.npmjs.com/package/@sphereon/SIOP-OpenID4VP), to better reflect specification name changes_ + +## Functionality + +This library supports: + +- Generic methods to verify and create/sign Json Web Tokens (JWTs) as used in OpenID Connect, with adapter for Decentralized Identifiers (DIDs), JSON Web Keys (JWK), x509 certificates +- OP class to create Authorization Requests and verify Authorization Responses +- RP class to verify Authorization Requests and create Authorization Responses +- Verifiable Presentation and Presentation Exchange support on the RP and OP sides, according to the OpenID for Verifiable Presentations (OID4VP) and Presentation Exchange specifications +- SIOPv2 specification version discovery with support for the latest [development version (draft 11)](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html), [Implementers Draft 1](https://openid.net/specs/openid-connect-self-issued-v2-1_0-ID1.html) and the [JWT VC Presentation Interop Profile](https://identity.foundation/jwt-vc-presentation-profile/) + +## Steps involved + +Flow diagram: + +![Flow diagram](https://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/Sphereon-Opensource/did-auth-siop/develop/docs/auth-flow.puml) + +1. Client (OP) initiates an Auth request by POST-ing to an endpoint, like for instance `/did-siop/v1/authentications` or + clicking a Login button and scanning a QR code +2. Web (RP) receives the request and access the RP object which creates the Auth Request as JWT, signs it and + returns the response as an OpenID Connect URI + + 1. JWT example: + + ```json + // JWT Header + { + "alg": "ES256K", + "kid": "did:ethr:0xcBe71d18b5F1259faA9fEE8f9a5FAbe2372BE8c9#controller", + "typ": "JWT" + } + + // JWT Payload + { + "iat": 1632336634, + "exp": 1632337234, + "response_type": "id_token", + "scope": "openid", + "client_id": "did:ethr:0xcBe71d18b5F1259faA9fEE8f9a5FAbe2372BE8c9", + "redirect_uri": "https://acme.com/siop/v1/sessions", + "iss": "did:ethr:0xcBe71d18b5F1259faA9fEE8f9a5FAbe2372BE8c9", + "response_mode": "post", + "claims": ..., + "nonce": "qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg", + "state": "b32f0087fc9816eb813fd11f", + "registration": { + "did_methods_supported": [ + "did:ethr:", + "did:web:" + ], + "subject_identifiers_supported": "did" + } + } + ``` + + 2. The Signed JWT, including the JWS follows the following scheme (JWS Compact + Serialization, https://datatracker.ietf.org/doc/html/rfc7515#section-7.1): + + `BASE64URL(UTF8(JWT Protected Header)) || '.' || BASE64URL(JWT Payload) || '.' || BASE64URL(JWS Signature)` + + 3. Create the URI containing the JWT: + + ``` + openid://?response_type=id_token + &scope=openid + &client_id=did%3Aethr%3A0xBC9484414c1DcA4Aa85BadBBd8a36E3973934444 + &redirect_uri=https%3A%2F%2Frp.acme.com%2Fsiop%2Fjwts + &iss=did%3Aethr%3A0xBC9484414c1DcA4Aa85BadBBd8a36E3973934444 + &response_mode=post + &claims=... + &state=af0ifjsldkj + &nonce=qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg&state=b32f0087fc9816eb813fd11f + ®istration=%5Bobject%20Object%5D + &request= + ``` + + 4. `claims` param can be either a `vp_token` or an `id_token`: + + ```json + // vp_token example + { + "id_token": { + "email": null + }, + "vp_token": { + "presentation_definition": { + "input_descriptors": [ + { + "schema": [ + { + "uri": "https://www.w3.org/2018/credentials/examples/v1/IDCardCredential" + } + ], + "constraints": { + "limit_disclosure": "required", + "fields": [ + { + "path": [ + "$.vc.credentialSubject.given_name" + ] + } + ] + } + } + ] + } + } + } + // id_token example + { + "userinfo": { + "verifiable_presentations": [ + "presentation_definition": { + "input_descriptors": [ + { + "schema": [ + { + "uri": "https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan" + } + ] + } + ] + } + } + }, + "id_token": { + "auth_time": { + "essential": true + } + } + } + ``` + +3. Web receives the Auth Request URI Object from RP +4. Web sends the Auth Request URI in the response body to the client +5. Client uses the OP instance to create an Auth response +6. OP verifies the auth request, including checks on whether the RP DID method and key types are supported, next to + whether the OP can satisfy the RPs requested Verifiable Credentials +7. Presentation Exchange process in case the RP had presentation definition(s) in the claims (see Presentation + Exchange chapter) +8. OP creates the auth response object as follows: + + 1. Create an ID token as shown below: + + ```json + // JWT encoded ID Token + // JWT Header + { + "alg": "ES256K", + "kid": "did:ethr:0x998D43DA5d9d78500898346baf2d9B1E39Eb0Dda#keys-1", + "typ": "JWT" + } + // JWT Payload + { + "iat": 1632343857.084, + "exp": 1632344857.084, + "iss": "https://self-issued.me/v2", + "sub": "did:ethr:0x998D43DA5d9d78500898346baf2d9B1E39Eb0Dda", + "aud": "https://acme.com/siop/v1/sessions", + "did": "did:ethr:0x998D43DA5d9d78500898346baf2d9B1E39Eb0Dda", + "sub_type": "did", + "sub_jwk": { + "kid": "did:ethr:0x998D43DA5d9d78500898346baf2d9B1E39Eb0Dda#key-1", + "kty": "EC", + "crv": "secp256k1", + "x": "a4IvJILPHe3ddGPi9qvAyXY9qMTEHvQw5DpQYOJVA0c", + "y": "IKOy0JfBF8FOlsOJaC41xiKuGc2-_iqTI01jWHYIyJU" + }, + "nonce": "qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg", + "state": "b32f0087fc9816eb813fd11f", + "registration": { + "issuer": "https://self-issued.me/v2", + "response_types_supported": "id_token", + "authorization_endpoint": "openid:", + "scopes_supported": "openid", + "id_token_signing_alg_values_supported": [ + "ES256K", + "EdDSA" + ], + "request_object_signing_alg_values_supported": [ + "ES256K", + "EdDSA" + ], + "subject_types_supported": "pairwise" + } + } + ``` + + 2. Sign the ID token using the DID key (kid) using JWS scheme (JWS Compact + Serialization, https://datatracker.ietf.org/doc/html/rfc7515#section-7.1) and send it to the RP: + + `BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature)` + +9. OP returns the Auth response and jwt object to the client +10. Client does a HTTP POST to redirect_uri from the request (and the aud in the + response): https://acme.com/siop/v1/sessions using "application/x-www-form-urlencoded" +11. Web receives the ID token (auth response) and uses the RP's verify method +12. RP performs the validation of the token, including withSignature validation, expiration and Verifiable Presentations if + any. It returns the Verified Auth Response to WEB +13. WEB returns a 200 response to Client with a redirect to another page (logged in or confirmation of VP receipt etc). +14. From that moment on Client can use the Auth Response as bearer token as long as it is valid + +## OP and RP setup and interactions + +This chapter is a walk-through for using the library using the high-level OP and RP classes. To keep +it simple, the examples work without hosting partial request/response related objects using HTTP endpoints. They are passed by value, inlined in the respective payloads versus passed by reference. + +--- + +**NOTE** + +The examples use Ethereum (ethr) DIDs, but these could be other DIDs as well. The creation of DIDs is out of scope. We +provide an [ethereum DID example](ethr-dids-testnet.md), if you want to test it yourself without having DIDs currently. +You could also use the actual example keys and DIDs, as they are valid Ethr Ropsten testnet keys. + +--- + +### Relying Party and SIOP should have keys and DIDs + +This library does not provide methods for signing and verifying tokens and authorization requests. Verification and Signing functionality must be externally provided. + +### Setting up the Relying Party (RP) + +The Relying Party, typically a web app, but can also be something else, like a mobile app. +The consumer of this library must provide means for creating and verifying JWT to the RP class instance. +This library provides adapters for creating and verifying did, jwk, and x5c protected JWT`s. + +Both the actual JWT request and the +registration metadata will be sent as part of the Auth Request since we pass them by value instead of by reference where +we would have to host the data at the reference URL. The redirect URL means that the OP will need to deliver the +auth response at the URL specified by the RP. We also populated the RP with a `PresentationDefinition` claim, +meaning we expect the OP to send in a Verifiable Presentation that matches our definition. +You can pass where you expect this presentation_definition to end up via the required `location` property. +This is either a top-level vp_token or it becomes part of the id_token. + +```typescript +// The relying party (web) private key and DID and DID key (public key) + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' + +function verifyJwtCallback(): VerifyJwtCallback { + return async (jwtVerifier, jwt) => { + if (jwtVerifier.method === 'did') { + // verify didJwt's + } else if (jwtVerifier.method === 'x5c') { + // verify x5c certificate protected jwt's + } else if (jwtVerifier.method === 'jwk') { + // verify jwk certificate protected jwt's + } else if (jwtVerifier.method === 'custom') { + // Only called if based on the jwt the verification method could not be determined + throw new Error(`Unsupported JWT verifier method ${jwtIssuer.method}`) + } + } +} + +function createJwtCallback(): CreateJwtCallback { + return async (jwtIssuer, jwt) => { + if (jwtIssuer.method === 'did') { + // create didJwt + } else if (jwtIssuer.method === 'x5c') { + // create x5c certificate protected jwt + } else if (jwtIssuer.method === 'jwk') { + // create a jwk certificate protected jwt + } else if (jwtIssuer.method === 'custom') { + // Only called if no or a Custom jwtIssuer was passed to the respective methods + throw new Error(`Unsupported JWT issuer method ${jwtIssuer.method}`) + } + } +} + +const rp = RP.builder() + .redirect(EXAMPLE_REDIRECT_URL) + .requestBy(PassBy.VALUE) + .withPresentationVerification(presentationVerificationCallback) + .withCreateJwtCallback(createJwtCallback) + .withVerifyJwtCallback(verifyJwtCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withClientMetadata({ + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subjectSyntaxTypesSupported: ['did', 'did:ethr'], + passBY: PassBy.VALUE, + }) + .addPresentationDefinitionClaim({ + definition: { + input_descriptors: [ + { + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + }, + location: PresentationLocation.VP_TOKEN, // Toplevel vp_token response expected. This also can be ID_TOKEN + }) + .build() +``` + +### OpenID Provider (OP) + +The OP, typically a useragent together with a mobile phone in a cross device flow is accessing a protected resource at the RP, or needs to sent +in Verifiable Presentations. The consumer of the library must provide means for creating and verifying JWT to the OP class instance. +This library provides adapters for creating and verifying did, jwk, and x5c protected JWT`s. + +```typescript +const op = OP.builder() + .withExpiresIn(6000) + .addDidMethod('ethr') + .withCreateJwtCallback(createJwtCallback) + .withVerifyJwtCallback(verifyJwtCallback) + .withClientMetadata({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subjectSyntaxTypesSupported: ['did:ethr'], + passBy: PassBy.VALUE, + }) + .build() +``` + +### RP creates the Auth Request + +The Relying Party creates the Auth Request. This could have been triggered by the OP accessing a URL, or clicking a button +for instance. The Created SIOP V2 Auth Request could also be displayed as a QR code for cross-device flows. In the below text we are +leaving the transport out of scope. + +Given we already have configured the RP itself, all we need to provide is a nonce and state for this request. These will +be communicated throughout the process. The RP definitely needs to keep track of these values for later usage. If no +nonce and state are provided then the createAuthorizationRequest method will automatically provide values for these and +return them in the object that is returned from the method. + +Next to the nonce we could also pass in claim options, for instance to specify a Presentation Definition. We have +already configured the RP itself to have a Presentation Definition, so we can omit it in the request creation, as the RP +class will take care of that on every Auth Request creation. +When creating signed objects on the OP and RP side, a jwtIssuer can be specified. +These adapters provide information about how the jwt will be signed later and metadata to set certain fields in the JWT, +This means that the JWT only needs to be signed and not necessarily modified by the consumer of this library. +If the jwtIssuer is omitted the createJwtCallback will be called with method 'custom' indicating that it's up to the consumer +to populate required fields before the JWT is signed. + +```typescript +const authRequest = await rp.createAuthorizationRequest({ + correlationId: '1', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + jwtIssuer: { method: 'did', didUrl: 'did:key:v4zagSPkqFJxuNWu#zUC74VEqqhEHQc', alg: SigningAlgo.EDDSA }, +}) + +console.log(`nonce: ${authRequest.requestOpts.nonce}, state: ${authRequest.requestOpts.state}`) +// nonce: qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg, state: b32f0087fc9816eb813fd11f + +console.log(await authRequest.uri().then((uri) => uri.encodedUri)) +// openid://?response_type=id_token&scope=openid&client_id=did.......&jwt=ey.......... +``` + +#### Optional: OP Auth Request Payload parsing access + +The OP class has a method that both parses the Auth Request URI as it was created by the RP, but it als +resolves both the JWT and the Registration values from the Auth Request Payload. Both values can be either +passed by value in the Auth Request, meaning they are present in the request, or passed by reference, meaning +they are hosted by the OP. In the latter case the values have to be retrieved from an https endpoint. The parseAuthorizationRequestURI takes +care of both values and returns the Auth Request Payload for easy access, the resolved signed JWT as well as +the resolved registration metadata of the RP. Please note that the Auth Request Payload that is also returned +is the original payload from the URI, so it will not contain the resolved JWT nor Registration if the OP passed one of +them by reference instead of value. Only the direct access to jwt and registration in the Parsed Auth Request +URI are guaranteed to be resolved. + +--- + +**NOTE** + +Please note that the parsing also automatically happens when calling the verifyAuthorizationRequest method with a URI +as input argument. This method allows for manual parsing if needed. + +--- + +```typescript +const parsedReqURI = op.parseAuthorizationRequestURI(reqURI.encodedUri) + +console.log(parsedReqURI.requestPayload.request) +// ey....... , but could be empty if the OP would have passed the request by reference usiing request_uri! + +console.log(parsedReqURI.jwt) +// ey....... , always resolved even if the OP would have passed the request by reference! +``` + +#### OP Auth Request verification + +The Auth Request from the RP in the form of a URI or JWT string needs to be verified by the OP. The +verifyAuthorizationRequest method of the OP class takes care of this. As input it expects either the URI or the JWT +string. IF a JWT is supplied it will use the JWT directly, if a URI is provided it +will internally parse the URI and extract/resolve the JWT before passing it to the provided verifyJwtCallback. +The jwtVerifier in the verifyJwtCallback is augmented with metadata to simplify jwt verification for each adapter. +The options can contain an optional nonce, which means the +request will be checked against the supplied nonce, otherwise the supplied nonce is only checked for presence. Normally +the OP doesn't know the nonce beforehand, so this option can be left out. + +The verified Auth Request object returned again contains the Auth Request payload, and the issuer. + +--- + +**NOTE** + +In the below example we directly access requestURI.encodedUri, in a real world scenario the RP and OP don't have access +to shared objects. Normally you would have received the openid:// URI as a string, which you can also directly pass into +the verifyAuthorizationRequest or parse methods of the OP class. The method accepts both a JWT or an openid:// URI as +input + +--- + +```typescript +const verifiedReq = op.verifyAuthorizationRequest(reqURI.encodedUri) // When an HTTP endpoint is used this would be the uri found in the body +// const verifiedReq = op.verifyAuthorizationRequest(parsedReqURI.jwt); // If we have parsed the URI using the above optional parsing + +console.log(`RP DID: ${verifiedReq.issuer}`) +// RP DID: did:ethr:ropsten:0x028360fb95417724cb7dd2ff217b15d6f17fc45e0ffc1b3dce6c2b8dd1e704fa98 +``` + +### OP Presentation Exchange + +The Verified Request object created in the previous step contains a `presentationDefinitions` array property in case the +OP wants to receive a Verifiable Presentation according to +the [OpenID Connect for Verifiable Presentations (OIDC4VP)](https://openid.net/specs/openid-connect-4-verifiable-presentations-1_0.html) +specification. If this is the case we need to select credentials and create a Verifiable Presentation. If the OP doesn't +need to receive a Verifiable Presentation, meaning the presentationDefinitions property is undefined or empty, you can +continue to the next chapter and create the Auth Response immediately. + +See the below sub flow for Presentation Exchange to explain the process: + +![PE Flow diagram](https://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/Sphereon-Opensource/did-auth-siop/develop/docs/presentation-exchange.puml) + +#### Create PresentationExchange object + +If the `presentationDefinitions` array property is present it means the op.verifyAuthorizationRequest already has +established that the Presentation Definition(s) itself were valid and present. It has populated the +presentationDefinitions array for you. If the definition was not valid, the verify method would have thrown an error, +which means you should never continue the authentication flow! + +Now we have to create a `PresentationExchange` object and pass in both the available Verifiable Credentials (typically +from your wallet) and the holder DID. + +--- + +**NOTE** + +The verifiable credentials you pass in to the PresentationExchange methods do not get sent to the RP. Only the +submissionFrom method creates a VP, which you should manually add as an option to the createAuthorizationResponse +method. + +--- + +```typescript +import { PresentationExchange } from './PresentationExchange' +import { PresentationDefinition } from '@sphereon/pe-models' + +const verifiableCredentials: VerifiableCredential[] = [VC1, VC2, VC3] // This typically comes from your wallet +const presentationDefs: PresentationDefinition[] = verifiedReq.presentationDefinitions + +if (presentationDefs) { + const pex = new PresentationExchange({ + did: op.authResponseOpts.did, + allVerifiableCredentials: verifiableCredentials, + }) +} +``` + +#### Filter Credentials that match the Presentation Definition + +Now we need to filter the VCs from all the available VCs to an array that matches the Presentation Definition(s) from +the RP. If the OP, or rather the PresentationExchange instance doesn't have all credentials to satisfy the Presentation +Definition from the OP, the method will throw an error. Do not try to authenticate in that case! + +The selectVerifiableCredentialsForSubmission method returns the filtered VCs. These VCs can satisfy the submission +requirements from the Presentation Definition. You have to do a manual selection yourself (see note below). + +--- + +**NOTE** + +You can have multiple VCs that match a single definition. That can be because the OP uses a definition that wants to +receive multiple different VCs as part of the Verifiable Presentation, but it can also be that you have multiple VCs +that match a single constraint from a single definition. Lastly there can be multiple definitions. You always have to do +a final manual selection of VCs from your application (outside of the scope of this library). + +--- + +```typescript +// We are only checking the first definition to not make the example too complex +const checked = await pex.selectVerifiableCredentialsForSubmission(presentationDefs[0]) +// Has errors if the Presentation Definition has requirements we cannot satisfy. +if (checked.errors) { + // error handling here +} +const matches: SubmissionRequirementMatch = checked.matches + +// Returns the filtered credentials that do match +``` + +#### Application specific selection and approval + +The previous step has filtered the VCs for you into the matches constant. But the user really has to acknowledge that +he/she will be sending in a VP containing the VCs. As mentioned above the selected VCs might still need more filtering +by the user. This part is out of the scope of this library as it is application specific. For more info also see +the [PEX library](https://github.com/Sphereon-Opensource/pex). + +In the code examples we will use 'userSelectedCredentials' as variable for the outcome of this process. + +```typescript +// Your application process here, resulting in: +import { IVerifiableCredential } from '@sphereon/pex' + +const userSelectedCredentials: VerifiableCredential[] // Your selected credentials +``` + +#### Create the Verifiable Presentation from the user selected VCs + +Now that we have the final selection of VCs, the Presentation Exchange class will create the Verifiable Presentation for +you. You can optionally sign the Verifiable Presentation, which is out of the scope of this library. As long as the VP +contains VCs which as subject has the same DID as the OP, the RP can know that the VPs are valid, simply by the fact +that withSignature of the resulting Auth Response is signed by the private key belonging to the OP and the VP. + +--- + +**NOTE** + +We do not support signed selective disclosure yet. The VP will only contain attributes that are requested if the +Presentation Definition wanted to limit disclosure. You need BBS+ signatures for instance to sign a VP with selective +disclosure. Unsigned selective disclosure is possible, where the RP relies on the Auth Response being signed +as long as the VP subject DIDs match the OP DID. + +--- + +```typescript +// We are only creating a presentation out of the first definition to keep the example simple +const verifiablePresentation = await pex.submissionFrom(presentationDefs[0], userSelectedCredentials) + +// Optionally sign the verifiable presentation here (outside of SIOP library scope) +``` + +#### End of Presentation Exchange + +Once the VP is returned it means we have gone through the Presentation Exchange process as defined +in [OpenID Connect for Verifiable Presentations (OIDC4VP)](https://openid.net/specs/openid-connect-4-verifiable-presentations-1_0.html) +. We can now continue to the regular flow of creating the Auth Response below, all we have to do is pass the +VP in as an option. + +### OP creates the Auth Response using the Verified Request + +Using the Verified Request object we got back from the op.verifyAuthorizationRequest method, we can now start to create +the Auth Response. If we were in the Presentation Exchange flow because the request contained a Presentation +Definition we now need to pass in the Verifiable Presentations using the vp option. If there was no Presentation +Definition, do not supply a Verifiable Presentation! The method will check for these constraints. + +```typescript +import { PresentationLocation, VerifiablePresentationTypeFormat } from './SIOP.types' + +// Example with Verifiabl Presentation in linked data proof format and as part of the vp_token +const vpOpt = { + format: VerifiablePresentationTypeFormat.LDP_VP, + presentation: verifiablePresentation, + location: PresentationLocation.VP_TOKEN, +} + +const authRespWithJWT = await op.createAuthorizationResponse(verifiedReq, { vp: [vpOpt] }) + +// Without Verifiable Presentation +// const authRespWithJWT = await op.createAuthorizationResponse(verifiedReq); +``` + +### OP submits the Auth Response to the RP + +We are now ready to submit the Auth Response to the RP. The OP class has the submitAuthorizationResponse +method which accepts the response object. It will automatically submit to the correct location as specified by the RP in +its request. It expects a response in the 200 range. You get access to the HTTP response from the fetch API as a return +value. + +```typescript +// Example with Verifiable Presentation +const response = await op.submitAuthorizationResponse(authRespWithJWT) +``` + +### RP verifies the Auth Response + +```typescript +const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponseJwt(authRespWithJWT.jwt, { + audience: EXAMPLE_REDIRECT_URL, +}) + +expect(verifiedAuthResponseWithJWT.jwt).toBeDefined() +expect(verifiedAuthResponseWithJWT.payload.state).toMatch('b32f0087fc9816eb813fd11f') +expect(verifiedAuthResponseWithJWT.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') +``` + +## AuthorizationRequest class + +In the previous chapter we have seen the highlevel OP and RP classes. These classes use the Auth Request and +Response objects explained in this chapter and the next chapter. If you want you can do most interactions using these +classes at a lower level. This however means you will not get automatic resolution of values passed by reference like +for instance request and registration data. + +### createURI + +Create a signed URL encoded URI with a signed SIOP Auth Request + +#### Data Interface + +```typescript +interface AuthorizationRequestURI extends SIOPURI { + jwt?: string; // The JWT when requestBy was set to mode Reference, undefined if the mode is Value + requestOpts: AuthorizationRequestOpts; // The supplied request opts as passed in to the method + requestPayload: AuthorizationRequestPayload; // The json payload that ends up signed in the JWT +} + +export type SIOPURI = { + encodedUri: string; // The encode JWT as URI + encodingFormat: UrlEncodingFormat; // The encoding format used +}; + +// https://openid.net/specs/openid-connect-self-issued-v2-1_0.html#section-8 +export interface AuthorizationRequestOpts { + authorizationEndpoint?: string; + redirectUri: string; // The redirect URI + requestBy: ObjectBy; // Whether the request is returned by value in the URI or retrieved by reference at the provided URL + signature: InternalSignature | ExternalSignature | NoSignature; // Whether no withSignature is being used, internal (access to private key), or external (hosted using authentication) + checkLinkedDomain?: CheckLinkedDomain; // determines how we'll handle the linked domains for this RP + responseMode?: ResponseMode; // How the URI should be returned. This is not being used by the library itself, allows an implementor to make a decision + responseContext?: ResponseContext; // Defines the context of these opts. Either RP side or OP side + responseTypesSupported?: ResponseType[]; + claims?: ClaimOpts; // The claims, uncluding presentation definitions + registration: RequestRegistrationOpts; // Registration metadata options + nonce?: string; // An optional nonce, will be generated if not provided + state?: string; // An optional state, will be generated if not provided + scopesSupported?: Scope[]; + subjectTypesSupported?: SubjectType[]; + requestObjectSigningAlgValuesSupported?: SigningAlgo[]; + revocationVerificationCallback?: RevocationVerificationCallback; + // slint-disable-next-line @typescript-eslint/no-explicit-any + // [x: string]: any; +} + +static async createURI(opts: SIOP.AuthorizationRequestOpts): Promise +``` + +#### Usage + +```typescript +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1' + +const opts: AuthorizationRequestOpts = { + checkLinkedDomain: CheckLinkedDomain.NEVER, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + redirectUri: EXAMPLE_REDIRECT_URL, + requestBy: { + type: PassBy.VALUE, + }, + signature: { + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + }, + registration: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectSyntaxTypesSupported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + registrationBy: { + type: PassBy.VALUE, + }, + }, +} + +AuthorizationRequest.createURI(opts).then((uri) => console.log(uri.encodedUri)) + +// Output: +// openid:// +// ?response_type=id_token +// &scope=openid +// &client_id=did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0 +// &redirect_uri=https://acme.com/hello&iss=did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0 +// &response_mode=post +// &response_context=rp +// &nonce=HxhBU9jBRVP51Z6J0eQ5AxeKoWK9ChApWRrumIqnixc +// &state=cbde3cdc5389f3be94063be3 +// ®istration={ +// "id_token_signing_alg_values_supported":["EdDSA","ES256"], +// "request_object_signing_alg_values_supported":["EdDSA","ES256"], +// "response_types_supported":["id_token"], +// "scopes_supported":["openid did_authn","openid"], +// "subject_types_supported":["pairwise"], +// "subject_syntax_types_supported":["did:ethr:","did"], +// "vp_formats":{ +// "ldp_vc":{ +// "proof_type":["EcdsaSecp256k1Signature2019","EcdsaSecp256k1Signature2019"] +// } +// } +// } +// &request=eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjoweDAxMDZhMmU5ODViMUUxRGU5QjVkZGI0YUY2ZEM5ZTkyOEY0ZTk5RDAja2V5cy0xIiwidHlwIjoiSldUIn0.eyJpYXQiOjE2NjQ0Mzk3MzMsImV4cCI6MTY2NDQ0MDMzMywicmVzcG9uc2VfdHlwZSI6ImlkX3Rva2VuIiwic2NvcGUiOiJvcGVuaWQiLCJjbGllbnRfaWQiOiJkaWQ6ZXRocjoweDAxMDZhMmU5ODViMUUxRGU5QjVkZGI0YUY2ZEM5ZTkyOEY0ZTk5RDAiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL2FjbWUuY29tL2hlbGxvIiwiaXNzIjoiZGlkOmV0aHI6MHgwMTA2YTJlOTg1YjFFMURlOUI1ZGRiNGFGNmRDOWU5MjhGNGU5OUQwIiwicmVzcG9uc2VfbW9kZSI6InBvc3QiLCJyZXNwb25zZV9jb250ZXh0IjoicnAiLCJub25jZSI6Ikh4aEJVOWpCUlZQNTFaNkowZVE1QXhlS29XSzlDaEFwV1JydW1JcW5peGMiLCJzdGF0ZSI6ImNiZGUzY2RjNTM4OWYzYmU5NDA2M2JlMyIsInJlZ2lzdHJhdGlvbiI6eyJpZF90b2tlbl9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVkRFNBIiwiRVMyNTYiXSwicmVxdWVzdF9vYmplY3Rfc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCI6WyJFZERTQSIsIkVTMjU2Il0sInJlc3BvbnNlX3R5cGVzX3N1cHBvcnRlZCI6WyJpZF90b2tlbiJdLCJzY29wZXNfc3VwcG9ydGVkIjpbIm9wZW5pZCBkaWRfYXV0aG4iLCJvcGVuaWQiXSwic3ViamVjdF90eXBlc19zdXBwb3J0ZWQiOlsicGFpcndpc2UiXSwic3ViamVjdF9zeW50YXhfdHlwZXNfc3VwcG9ydGVkIjpbImRpZDpldGhyOiIsImRpZCJdLCJ2cF9mb3JtYXRzIjp7ImxkcF92YyI6eyJwcm9vZl90eXBlIjpbIkVjZHNhU2VjcDI1NmsxU2lnbmF0dXJlMjAxOSIsIkVjZHNhU2VjcDI1NmsxU2lnbmF0dXJlMjAxOSJdfX19fQ.owSdQP3ZfOyHryCIO86zB5qenzd5l2AUcEZhA3TvlUWNDJyhhzIgZmBgzV4OMilczr2AJss5HGqxHPmBRTaHcQ +``` + +### verifyJWT + +Verifies a SIOP Auth Request JWT. Throws an error if the verifation fails. Returns the verified JWT and +metadata if the verification succeeds + +#### Data Interface + +```typescript +export interface VerifiedAuthorizationRequestWithJWT extends VerifiedJWT { + payload: AuthorizationRequestPayload; // The unsigned Auth Request payload + presentationDefinitions?: PresentationDefinitionWithLocation[]; // The optional presentation definition objects that the RP requests + verifyOpts: VerifyAuthorizationRequestOpts; // The verification options for the Auth Request +} + +export interface VerifiedJWT { + payload: Partial; // The JWT payload + didResolutionResult: DIDResolutionResult;// DID resolution result including DID document + issuer: string; // The issuer (did) of the JWT + signer: VerificationMethod; // The matching verification method from the DID that was used to sign + jwt: string; // The JWT +} + +export interface VerifyAuthorizationRequestOpts { + verification: Verification + nonce?: string; // If provided the nonce in the request needs to match + verifyCallback?: VerifyCallback; +} + +export interface DIDResolutionResult { + didResolutionMetadata: DIDResolutionMetadata // Did resolver metadata + didDocument: DIDDocument // The DID document + didDocumentMetadata: DIDDocumentMetadata // DID document metadata +} + +export interface DIDDocument { // Standard DID Document, see DID spec for explanation + '@context'?: 'https://www.w3.org/ns/did/v1' | string | string[] + id: string + alsoKnownAs?: string[] + controller?: string | string[] + verificationMethod?: VerificationMethod[] + authentication?: (string | VerificationMethod)[] + assertionMethod?: (string | VerificationMethod)[] + keyAgreement?: (string | VerificationMethod)[] + capabilityInvocation?: (string | VerificationMethod)[] + capabilityDelegation?: (string | VerificationMethod)[] + service?: ServiceEndpoint[] +} + +static async verifyJWT(jwt:string, opts: SIOP.VerifyAuthorizationRequestOpts): Promise +``` + +#### Usage + +```typescript +const verifyOpts: VerifyAuthorizationRequestOpts = { + verification: { + resolveOpts: { + subjectSyntaxTypesSupported: ['did:ethr'], + }, + }, +} +const jwt = 'ey..........' // JWT created by RP +AuthorizationRequest.verifyJWT(jwt).then((req) => { + console.log(`issuer: ${req.issuer}`) + console.log(JSON.stringify(req.signer)) +}) +// issuer: "did:ethr:0x56C4b92D4a6083Fcee825893A29023cDdfff5c66" +// "signer": { +// "id": "did:ethr:0x56C4b92D4a6083Fcee825893A29023cDdfff5c66#controller", +// "type": "EcdsaSecp256k1RecoveryMethod2020", +// "controller": "did:ethr:0x56C4b92D4a6083Fcee825893A29023cDdfff5c66", +// "blockchainAccountId": "0x56C4b92D4a6083Fcee825893A29023cDdfff5c66@eip155:1" +// } +``` + +## AuthorizationResponse class + +### createJwtFromRequestJWT + +Creates an AuthorizationResponse object from the OP side, using the AuthorizationRequest of the RP and its +verification as input together with settings from the OP. The Auth Response contains the ID token as well as +optional Verifiable Presentations conforming to the Submission Requirements sent by the RP. + +#### Data interface + +```typescript +export interface AuthorizationResponseOpts { + redirectUri?: string; // It's typically comes from the request opts as a measure to prevent hijacking. + registration: ResponseRegistrationOpts; // Registration options + checkLinkedDomain?: CheckLinkedDomain; // When the link domain should be checked + presentationVerificationCallback?: PresentationVerificationCallback; // Callback function to verify the presentations + signature: InternalSignature | ExternalSignature; // Using an internal/private key withSignature, or hosted withSignature + nonce?: string; // Allows to override the nonce, otherwise the nonce of the request will be used + state?: string; // Allows to override the state, otherwise the state of the request will be used + responseMode?: ResponseMode; // Response mode should be form in case a mobile device is being used together with a browser + did: string; // The DID of the OP + vp?: VerifiablePresentationResponseOpts[]; // Verifiable Presentations with location and format + expiresIn?: number; // Expiration +} + +export interface VerifiablePresentationResponseOpts extends VerifiablePresentationPayload { + location: PresentationLocation; +} + +export enum PresentationLocation { + VP_TOKEN = 'vp_token', // VP will be the toplevel vp_token + ID_TOKEN = 'id_token', // VP will be part of the id_token in the verifiable_presentations location +} + +export interface VerifyAuthorizationRequestOpts { + verification: Verification + nonce?: string; // If provided the nonce in the request needs to match + verifyCallback?: VerifyCallback // Callback function to verify the domain linkage credential +} + +export interface AuthorizationResponsePayload extends JWTPayload { + iss: ResponseIss.SELF_ISSUED_V2 | string; // The SIOP V2 spec mentions this is required + sub: string; // did (or thumbprint of sub_jwk key when type is jkt) + sub_jwk?: JWK; // JWK containing DID key if subtype is did, or thumbprint if it is JKT + aud: string; // redirect_uri from request + exp: number; // expiration time + iat: number; // issued at + state: string; // The state which should match the AuthRequest state + nonce: string; // The nonce which should match the AuthRequest nonce + did: string; // The DID of the OP + registration?: DiscoveryMetadataPayload; // The registration metadata from the OP + registration_uri?: string; // The URI of the registration metadata if it is returned by reference/URL + verifiable_presentations?: VerifiablePresentationPayload[]; // Verifiable Presentations + vp_token?: VerifiablePresentationPayload; +} + +export interface AuthorizationResponseWithJWT { + jwt: string; // The signed Response JWT + nonce: string; // The nonce which should match the nonce from the request + state: string; // The state which should match the state from the request + payload: AuthorizationResponsePayload; // The unsigned payload object + verifyOpts?: VerifyAuthorizationRequestOpts;// The Auth Request verification parameters that were used + responseOpts: AuthorizationResponseOpts; // The Auth Response options used during generation of the Response +} + +static async createJWTFromRequestJWT(requestJwt: string, responseOpts: SIOP.AuthorizationResponseOpts, verifyOpts: SIOP.VerifyAuthorizationRequestOpts): Promise +``` + +#### Usage + +```typescript +const responseOpts: AuthorizationResponseOpts = { + checkLinkedDomain: CheckLinkedDomain.NEVER, + redirectUri: 'https://acme.com/hello', + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + issuer: ResponseIss.SELF_ISSUED_V2, + responseTypesSupported: [ResponseType.ID_TOKEN], + subjectSyntaxTypesSupported: ['did:ethr:'], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + registrationBy: { + type: PassBy.REFERENCE, + referenceUri: 'https://rp.acme.com/siop/jwts', + }, + }, + signature: { + did: 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0', + hexPrivateKey: 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f', + kid: 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#controller', + }, + did: 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0', + responseMode: ResponseMode.POST, +} +``` + +#### Usage + +```typescript +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const NONCE = '5c1d29c1-cf7d-4e14-9305-9db46d8c1916' +const verifyOpts: VerifyAuthorizationResponseOpts = { + audience: 'https://rp.acme.com/siop/jwts', + nonce: NONCE, +} + +verifyJWT('ey......', verifyOpts).then((jwt) => { + console.log(`nonce: ${jwt.payload.nonce}`) + // output: nonce: 5c1d29c1-cf7d-4e14-9305-9db46d8c1916 +}) +``` + +### Verify Revocation + +Verifies whether a verifiable credential contained verifiable presentation is revoked + +#### Data Interface + +```typescript +export type RevocationVerificationCallback = ( + vc: W3CVerifiableCredential, // The Verifiable Credential to be checked + type: VerifiableCredentialTypeFormat, // Whether it is a LDP or JWT Verifiable Credential +) => Promise +``` + +```typescript +export interface IRevocationVerificationStatus { + status: RevocationStatus // Valid or invalid + error?: string +} +``` + +```typescript +export enum RevocationVerification { + NEVER = 'never', // We don't want to verify revocation + IF_PRESENT = 'if_present', // If credentialStatus is present, did-auth-siop will verify revocation. If present and not valid an exception is thrown + ALWAYS = 'always', // We'll always check the revocation, if not present or not valid, throws an exception +} +``` + +#### Usage + +```typescript + const verifyRevocation = async ( + vc: W3CVerifiableCredential, + type: VerifiableCredentialTypeFormat +):Promise => { + // Logic to verify the credential status + ... + return { status, error } +}; +``` + +```typescript +import { verifyRevocation } from './Revocation' + +const rp = RP.builder() + .withRevocationVerification(RevocationVerification.ALWAYS) + .withRevocationVerificationCallback((vc, type) => verifyRevocation(vc, type)) +``` + +### Verify Presentation Callback + +The callback function to verify the verifiable presentation + +#### Data interface + +```typescript +export type PresentationVerificationCallback = (args: IVerifiablePresentation) => Promise +``` + +```typescript +export type IVerifiablePresentation = IPresentation & IHasProof +``` + +```typescript +export type PresentationVerificationResult = { verified: boolean } +``` + +#### Usage + +JsonLD + +```typescript +import { PresentationVerificationResult } from './SIOP.types' + +const verifyPresentation = async (vp: IVerifiablePresentation): Promise => { + const keyPair = await Ed25519VerificationKey2020.from(VC_KEY_PAIR) + const suite = new Ed25519Signature2020({ key: keyPair }) + suite.verificationMethod = keyPair.id + // If the credentials are not verified individually by the library, + // it needs to be implemented. In this example, the library does it. + const { verified } = await vc.verify({ presentation: vp, suite, challenge: 'challenge', documentLoader: new DocumentLoader().getLoader() }) + return Promise.resolve({ verified }) +} +``` + +or + +JWT + +```typescript +import { IVerifiablePresentation } from '@sphereon/ssi-types' + +const verifyPresentation = async (vp: IVerifiablePresentation): Promise => { + // If the credentials are not verified individually by the library, + // it needs to be implemented. In this example, the library does it. + await verifyCredentialJWT(jwtVc, getResolver({ subjectSyntaxTypesSupported: ['did:key:'] })) + return Promise.resolve({ verified: true }) +} +``` + +```typescript +const rp = RP.builder() + .withPresentationVerification((args) => verifyPresentation(args)) + ... +``` + +## Class and Flow diagram of the interactions + +Services and objects: + +[![](./docs/services-class-diagram.svg)](https://mermaid-js.github.io/mermaid-live-editor/edit#eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5cbmNsYXNzIFJQIHtcbiAgICA8PHNlcnZpY2U-PlxuICAgIGNyZWF0ZUF1dGhlbnRpY2F0aW9uUmVxdWVzdChvcHRzPykgUHJvbWlzZShBdXRoZW50aWNhdGlvblJlcXVlc3RVUkkpXG4gICAgdmVyaWZ5QXV0aGVudGljYXRpb25SZXNwb25zZUp3dChqd3Q6IHN0cmluZywgb3B0cz8pIFByb21pc2UoVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlc3BvbnNlV2l0aEpXVClcbn1cblJQIC0tPiBBdXRoZW50aWNhdGlvblJlcXVlc3RVUklcblJQIC0tPiBWZXJpZmllZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUXG5SUCAtLT4gQXV0aGVudGljYXRpb25SZXF1ZXN0XG5SUCAtLT4gQXV0aGVudGljYXRpb25SZXNwb25zZVxuXG5jbGFzcyBPUCB7XG4gICAgPDxzZXJ2aWNlPj5cbiAgICBjcmVhdGVBdXRoZW50aWNhdGlvblJlc3BvbnNlKGp3dE9yVXJpOiBzdHJpbmcsIG9wdHM_KSBQcm9taXNlKEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUKVxuICAgIHZlcmlmeUF1dGhlbnRpY2F0aW9uUmVxdWVzdChqd3Q6IHN0cmluZywgb3B0cz8pIFByb21pc2UoVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUKVxufVxuT1AgLS0-IEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUXG5PUCAtLT4gVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUXG5PUCAtLT4gQXV0aGVudGljYXRpb25SZXF1ZXN0XG5PUCAtLT4gQXV0aGVudGljYXRpb25SZXNwb25zZVxuXG5cbmNsYXNzIEF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHMge1xuICA8PGludGVyZmFjZT4-XG4gIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIHJlcXVlc3RCeTogT2JqZWN0Qnk7XG4gIHNpZ25hdHVyZVR5cGU6IEludGVybmFsU2lnbmF0dXJlIHwgRXh0ZXJuYWxTaWduYXR1cmUgfCBOb1NpZ25hdHVyZTtcbiAgcmVzcG9uc2VNb2RlPzogUmVzcG9uc2VNb2RlO1xuICBjbGFpbXM_OiBPaWRjQ2xhaW07XG4gIHJlZ2lzdHJhdGlvbjogUmVxdWVzdFJlZ2lzdHJhdGlvbk9wdHM7XG4gIG5vbmNlPzogc3RyaW5nO1xuICBzdGF0ZT86IHN0cmluZztcbn1cbkF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHMgLS0-IFJlc3BvbnNlTW9kZVxuQXV0aGVudGljYXRpb25SZXF1ZXN0T3B0cyAtLT4gUlBSZWdpc3RyYXRpb25NZXRhZGF0YU9wdHNcblxuXG5cbmNsYXNzIFJQUmVnaXN0cmF0aW9uTWV0YWRhdGFPcHRzIHtcbiAgPDxpbnRlcmZhY2U-PlxuICBzdWJqZWN0SWRlbnRpZmllcnNTdXBwb3J0ZWQ6IFN1YmplY3RJZGVudGlmaWVyVHlwZVtdIHwgU3ViamVjdElkZW50aWZpZXJUeXBlO1xuICBkaWRNZXRob2RzU3VwcG9ydGVkPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIGNyZWRlbnRpYWxGb3JtYXRzU3VwcG9ydGVkOiBDcmVkZW50aWFsRm9ybWF0W10gfCBDcmVkZW50aWFsRm9ybWF0O1xufVxuXG5jbGFzcyBSZXF1ZXN0UmVnaXN0cmF0aW9uT3B0cyB7XG4gIDw8aW50ZXJmYWNlPj5cbiAgcmVnaXN0cmF0aW9uQnk6IFJlZ2lzdHJhdGlvblR5cGU7XG59XG5SZXF1ZXN0UmVnaXN0cmF0aW9uT3B0cyAtLXw-IFJQUmVnaXN0cmF0aW9uTWV0YWRhdGFPcHRzXG5cblxuY2xhc3MgVmVyaWZ5QXV0aGVudGljYXRpb25SZXF1ZXN0T3B0cyB7XG4gIDw8aW50ZXJmYWNlPj5cbiAgdmVyaWZpY2F0aW9uOiBJbnRlcm5hbFZlcmlmaWNhdGlvbiB8IEV4dGVybmFsVmVyaWZpY2F0aW9uO1xuICBub25jZT86IHN0cmluZztcbn1cblxuY2xhc3MgQXV0aGVudGljYXRpb25SZXF1ZXN0IHtcbiAgICA8PHNlcnZpY2U-PlxuICAgIGNyZWF0ZVVSSShvcHRzOiBBdXRoZW50aWNhdGlvblJlcXVlc3RPcHRzKSBQcm9taXNlKEF1dGhlbnRpY2F0aW9uUmVxdWVzdFVSSSlcbiAgICBjcmVhdGVKV1Qob3B0czogQXV0aGVudGljYXRpb25SZXF1ZXN0T3B0cykgUHJvbWlzZShBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUKTtcbiAgICB2ZXJpZnlKV1Qoand0OiBzdHJpbmcsIG9wdHM6IFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHMpIFByb21pc2UoVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUKVxufVxuQXV0aGVudGljYXRpb25SZXF1ZXN0IDwtLSBBdXRoZW50aWNhdGlvblJlcXVlc3RPcHRzXG5BdXRoZW50aWNhdGlvblJlcXVlc3QgPC0tIFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHNcbkF1dGhlbnRpY2F0aW9uUmVxdWVzdCAtLT4gQXV0aGVudGljYXRpb25SZXF1ZXN0VVJJXG5BdXRoZW50aWNhdGlvblJlcXVlc3QgLS0-IEF1dGhlbnRpY2F0aW9uUmVxdWVzdFdpdGhKV1RcbkF1dGhlbnRpY2F0aW9uUmVxdWVzdCAtLT4gVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUXG5cbmNsYXNzIEF1dGhlbnRpY2F0aW9uUmVzcG9uc2Uge1xuICA8PGludGVyZmFjZT4-XG4gIGNyZWF0ZUpXVEZyb21SZXF1ZXN0SldUKGp3dDogc3RyaW5nLCByZXNwb25zZU9wdHM6IEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VPcHRzLCB2ZXJpZnlPcHRzOiBWZXJpZnlBdXRoZW50aWNhdGlvblJlcXVlc3RPcHRzKSBQcm9taXNlKEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUKVxuICB2ZXJpZnlKV1Qoand0OiBzdHJpbmcsIHZlcmlmeU9wdHM6IFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VPcHRzKSBQcm9taXNlKFZlcmlmaWVkQXV0aGVudGljYXRpb25SZXNwb25zZVdpdGhKV1QpXG59XG5BdXRoZW50aWNhdGlvblJlc3BvbnNlIDwtLSBBdXRoZW50aWNhdGlvblJlc3BvbnNlT3B0c1xuQXV0aGVudGljYXRpb25SZXNwb25zZSA8LS0gVmVyaWZ5QXV0aGVudGljYXRpb25SZXF1ZXN0T3B0c1xuQXV0aGVudGljYXRpb25SZXNwb25zZSAtLT4gQXV0aGVudGljYXRpb25SZXNwb25zZVdpdGhKV1RcbkF1dGhlbnRpY2F0aW9uUmVzcG9uc2UgPC0tIFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVzcG9uc2VPcHRzXG5BdXRoZW50aWNhdGlvblJlc3BvbnNlIC0tPiBWZXJpZmllZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUXG5cbmNsYXNzIEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VPcHRzIHtcbiAgPDxpbnRlcmZhY2U-PlxuICBzaWduYXR1cmVUeXBlOiBJbnRlcm5hbFNpZ25hdHVyZSB8IEV4dGVybmFsU2lnbmF0dXJlO1xuICBub25jZT86IHN0cmluZztcbiAgc3RhdGU_OiBzdHJpbmc7XG4gIHJlZ2lzdHJhdGlvbjogUmVzcG9uc2VSZWdpc3RyYXRpb25PcHRzO1xuICByZXNwb25zZU1vZGU_OiBSZXNwb25zZU1vZGU7XG4gIGRpZDogc3RyaW5nO1xuICB2cD86IFZlcmlmaWFibGVQcmVzZW50YXRpb247XG4gIGV4cGlyZXNJbj86IG51bWJlcjtcbn1cbkF1dGhlbnRpY2F0aW9uUmVzcG9uc2VPcHRzIC0tPiBSZXNwb25zZU1vZGVcblxuY2xhc3MgQXV0aGVudGljYXRpb25SZXNwb25zZVdpdGhKV1Qge1xuICA8PGludGVyZmFjZT4-XG4gIGp3dDogc3RyaW5nO1xuICBub25jZTogc3RyaW5nO1xuICBzdGF0ZTogc3RyaW5nO1xuICBwYXlsb2FkOiBBdXRoZW50aWNhdGlvblJlc3BvbnNlUGF5bG9hZDtcbiAgdmVyaWZ5T3B0cz86IFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHM7XG4gIHJlc3BvbnNlT3B0czogQXV0aGVudGljYXRpb25SZXNwb25zZU9wdHM7XG59XG5BdXRoZW50aWNhdGlvblJlc3BvbnNlV2l0aEpXVCAtLT4gQXV0aGVudGljYXRpb25SZXNwb25zZVBheWxvYWRcbkF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUIC0tPiBWZXJpZnlBdXRoZW50aWNhdGlvblJlcXVlc3RPcHRzXG5BdXRoZW50aWNhdGlvblJlc3BvbnNlV2l0aEpXVCAtLT4gQXV0aGVudGljYXRpb25SZXNwb25zZU9wdHNcblxuXG5jbGFzcyBWZXJpZnlBdXRoZW50aWNhdGlvblJlc3BvbnNlT3B0cyB7XG4gIDw8aW50ZXJmYWNlPj5cbiAgdmVyaWZpY2F0aW9uOiBJbnRlcm5hbFZlcmlmaWNhdGlvbiB8IEV4dGVybmFsVmVyaWZpY2F0aW9uO1xuICBub25jZT86IHN0cmluZztcbiAgc3RhdGU_OiBzdHJpbmc7XG4gIGF1ZGllbmNlOiBzdHJpbmc7XG59XG5cbmNsYXNzIFJlc3BvbnNlTW9kZSB7XG4gICAgPDxlbnVtPj5cbn1cblxuIGNsYXNzIFVyaVJlc3BvbnNlIHtcbiAgICA8PGludGVyZmFjZT4-XG4gICAgcmVzcG9uc2VNb2RlPzogUmVzcG9uc2VNb2RlO1xuICAgIGJvZHlFbmNvZGVkPzogc3RyaW5nO1xufVxuVXJpUmVzcG9uc2UgLS0-IFJlc3BvbnNlTW9kZVxuVXJpUmVzcG9uc2UgPHwtLSBTSU9QVVJJXG5cbmNsYXNzIFNJT1BVUkkge1xuICAgIDw8aW50ZXJmYWNlPj5cbiAgICBlbmNvZGVkVXJpOiBzdHJpbmc7XG4gICAgZW5jb2RpbmdGb3JtYXQ6IFVybEVuY29kaW5nRm9ybWF0O1xufVxuU0lPUFVSSSAtLT4gVXJsRW5jb2RpbmdGb3JtYXRcblNJT1BVUkkgPHwtLSBBdXRoZW50aWNhdGlvblJlcXVlc3RVUklcblxuY2xhc3MgQXV0aGVudGljYXRpb25SZXF1ZXN0VVJJIHtcbiAgPDxpbnRlcmZhY2U-PlxuICBqd3Q_OiBzdHJpbmc7IFxuICByZXF1ZXN0T3B0czogQXV0aGVudGljYXRpb25SZXF1ZXN0T3B0cztcbiAgcmVxdWVzdFBheWxvYWQ6IEF1dGhlbnRpY2F0aW9uUmVxdWVzdFBheWxvYWQ7XG59XG5BdXRoZW50aWNhdGlvblJlcXVlc3RVUkkgLS0-IEF1dGhlbnRpY2F0aW9uUmVxdWVzdFBheWxvYWRcblxuY2xhc3MgVXJsRW5jb2RpbmdGb3JtYXQge1xuICAgIDw8ZW51bT4-XG59XG5cbmNsYXNzIFJlc3BvbnNlTW9kZSB7XG4gIDw8ZW51bT4-XG59XG5cbmNsYXNzIEF1dGhlbnRpY2F0aW9uUmVxdWVzdFBheWxvYWQge1xuICAgIDw8aW50ZXJmYWNlPj5cbiAgICBzY29wZTogU2NvcGU7XG4gICAgcmVzcG9uc2VfdHlwZTogUmVzcG9uc2VUeXBlO1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xuICAgIHJlc3BvbnNlX21vZGU6IFJlc3BvbnNlTW9kZTtcbiAgICByZXF1ZXN0OiBzdHJpbmc7XG4gICAgcmVxdWVzdF91cmk6IHN0cmluZztcbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICBub25jZTogc3RyaW5nO1xuICAgIGRpZF9kb2M_OiBESUREb2N1bWVudDtcbiAgICBjbGFpbXM_OiBSZXF1ZXN0Q2xhaW1zO1xufVxuQXV0aGVudGljYXRpb25SZXF1ZXN0UGF5bG9hZCAtLXw-IEpXVFBheWxvYWRcblxuY2xhc3MgIEpXVFBheWxvYWQge1xuICBpc3M_OiBzdHJpbmdcbiAgc3ViPzogc3RyaW5nXG4gIGF1ZD86IHN0cmluZyB8IHN0cmluZ1tdXG4gIGlhdD86IG51bWJlclxuICBuYmY_OiBudW1iZXJcbiAgZXhwPzogbnVtYmVyXG4gIHJleHA_OiBudW1iZXJcbiAgW3g6IHN0cmluZ106IGFueVxufVxuXG5cbmNsYXNzIFZlcmlmaWVkQXV0aGVudGljYXRpb25SZXF1ZXN0V2l0aEpXVCB7XG4gIDw8aW50ZXJmYWNlPj5cbiAgcGF5bG9hZDogQXV0aGVudGljYXRpb25SZXF1ZXN0UGF5bG9hZDsgXG4gIHZlcmlmeU9wdHM6IFZlcmlmeUF1dGhlbnRpY2F0aW9uUmVxdWVzdE9wdHM7IFxufVxuVmVyaWZpZWRKV1QgPHwtLSBWZXJpZmllZEF1dGhlbnRpY2F0aW9uUmVxdWVzdFdpdGhKV1RcblZlcmlmaWVkQXV0aGVudGljYXRpb25SZXF1ZXN0V2l0aEpXVCAtLT4gVmVyaWZ5QXV0aGVudGljYXRpb25SZXF1ZXN0T3B0c1xuVmVyaWZpZWRBdXRoZW50aWNhdGlvblJlcXVlc3RXaXRoSldUIC0tPiBBdXRoZW50aWNhdGlvblJlcXVlc3RQYXlsb2FkXG5cbmNsYXNzIFZlcmlmaWVkQXV0aGVudGljYXRpb25SZXNwb25zZVdpdGhKV1Qge1xuICA8PGludGVyZmFjZT4-XG4gIHBheWxvYWQ6IEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VQYXlsb2FkO1xuICB2ZXJpZnlPcHRzOiBWZXJpZnlBdXRoZW50aWNhdGlvblJlc3BvbnNlT3B0cztcbn1cblZlcmlmaWVkQXV0aGVudGljYXRpb25SZXNwb25zZVdpdGhKV1QgLS0-IEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VQYXlsb2FkXG5WZXJpZmllZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUIC0tPiBWZXJpZnlBdXRoZW50aWNhdGlvblJlc3BvbnNlT3B0c1xuVmVyaWZpZWRKV1QgPHwtLSBWZXJpZmllZEF1dGhlbnRpY2F0aW9uUmVzcG9uc2VXaXRoSldUXG5cbmNsYXNzIFZlcmlmaWVkSldUIHtcbiAgPDxpbnRlcmZhY2U-PlxuICBwYXlsb2FkOiBQYXJ0aWFsPEpXVFBheWxvYWQ-O1xuICBkaWRSZXNvbHV0aW9uUmVzdWx0OiBESURSZXNvbHV0aW9uUmVzdWx0O1xuICBpc3N1ZXI6IHN0cmluZztcbiAgc2lnbmVyOiBWZXJpZmljYXRpb25NZXRob2Q7XG4gIGp3dDogc3RyaW5nO1xufVxuXG5cbiIsIm1lcm1haWQiOiJ7XG4gIFwidGhlbWVcIjogXCJkYXJrXCJcbn0iLCJ1cGRhdGVFZGl0b3IiOmZhbHNlLCJhdXRvU3luYyI6ZmFsc2UsInVwZGF0ZURpYWdyYW0iOmZhbHNlfQ) + +## Acknowledgements + +This library has been partially sponsored by [Gimly](https://www.gimly.io/) as part of the [NGI Ontochain](https://ontochain.ngi.eu/) project. NGI Ontochain has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 957338 + +
Gimly ONTOCHAIN Logo European Union Flag
diff --git a/packages/siop-oid4vp/docs/auth-flow.md b/packages/siop-oid4vp/docs/auth-flow.md new file mode 100644 index 00000000..4fd2d14c --- /dev/null +++ b/packages/siop-oid4vp/docs/auth-flow.md @@ -0,0 +1 @@ +![Diagram](https://www.plantuml.com/plantuml/proxy?cache=no&src=https://raw.githubusercontent.com/Sphereon-Opensource/did-auth-siop/develop/docs/auth-flow-diagram.puml) diff --git a/packages/siop-oid4vp/docs/auth-flow.puml b/packages/siop-oid4vp/docs/auth-flow.puml new file mode 100644 index 00000000..41b56e4d --- /dev/null +++ b/packages/siop-oid4vp/docs/auth-flow.puml @@ -0,0 +1,54 @@ +@startuml +header SIOP flow diagram +title +DID OpenID SIOP Flow +end title + +autonumber + +participant "Client\n(OP)" as CLIENT order 0 +participant "OP\nclass" as OP order 1 #White +participant "RP\nclass" as RP order 2 #White +participant "Web component\n(RP)" as WEB order 3 + +activate WEB +CLIENT -> WEB: HTTPS POST + +WEB -> RP: CreateAuthRequest\n(Request Opts) +activate RP +RP -> WEB: Return\n +deactivate RP +WEB -> CLIENT: 302: Redirect (can include VC request), optionally displays a QR +deactivate WEB + +activate CLIENT +CLIENT-> OP: create Auth Response Process\n(Auth Request,Response Opts, Verify Opts) +activate OP +OP -> OP: verifyAuthRequest\n(Auth Request, Verify Opts) +OP -> OP: Presentation Exchange process (see below) +OP -> OP: createAuthResponse\n(Auth Request, Response Opts) +OP-> CLIENT: Return\n +deactivate OP +CLIENT-> WEB: HTTPS POST (can include Verifiable Credentials) +deactivate CLIENT + + +activate WEB +WEB -> RP: Verify\n(Auth Response, Verify Opts) +activate RP + +RP -> WEB: Return\n +deactivate RP +WEB -> CLIENT: 200 +deactivate WEB + + +== Protected resources == + +CLIENT-> WEB: HTTPS POST \n/protected-resources + +activate WEB +WEB-> WEB: Verify\n +WEB-> CLIENT: 200: +deactivate WEB +@enduml diff --git a/packages/siop-oid4vp/docs/didjwt-class-diagram.md b/packages/siop-oid4vp/docs/didjwt-class-diagram.md new file mode 100644 index 00000000..d233e7c0 --- /dev/null +++ b/packages/siop-oid4vp/docs/didjwt-class-diagram.md @@ -0,0 +1,107 @@ +```mermaid +classDiagram +class DidResolutionOptions { + <> + accept?: string +} +class Resolvable { + <> + resolve(didUrl: string, options: DidResolutionOptions) Promise(DidResolutionResult) +} +DidResolutionOptions --> Resolvable +DIDResolutionResult <-- Resolvable + +class DIDResolutionResult { + <> + didResolutionMetadata: DIDResolutionMetadata + didDocument: DIDDocument | null + didDocumentMetadata: DIDDocumentMetadata +} +DIDDocumentMetadata <-- DIDResolutionResult +DIDDocument <-- DIDResolutionResult + +class DIDDocumentMetadata { + <> + created?: string + updated?: string + deactivated?: boolean + versionId?: string + nextUpdate?: string + nextVersionId?: string + equivalentId?: string + canonicalId?: string +} + +class DIDDocument { + <> + '@context'?: 'https://www.w3.org/ns/did/v1' | string | string[] + id: string + alsoKnownAs?: string[] + controller?: string | string[] + verificationMethod?: VerificationMethod[] + authentication?: (string | VerificationMethod)[] + assertionMethod?: (string | VerificationMethod)[] + keyAgreement?: (string | VerificationMethod)[] + capabilityInvocation?: (string | VerificationMethod)[] + capabilityDelegation?: (string | VerificationMethod)[] + service?: ServiceEndpoint[] +} +VerificationMethod <-- DIDDocument + +class VerificationMethod { + <> + id: string + type: string + controller: string + publicKeyBase58?: string + publicKeyJwk?: JsonWebKey + publicKeyHex?: string + blockchainAccountId?: string + ethereumAddress?: string +} + +class JWTPayload { + <> + iss: string + sub?: string + aud?: string | string[] + iat?: number + nbf?: number + exp?: number + rexp?: number +} +class JWTHeader { // This is a standard JWT header + <> + typ: 'JWT' + alg: string // The JWT signing algorithm to use. Supports: [ES256K, ES256K-R, Ed25519, EdDSA], Defaults to: ES256K + [x: string]: any +} + +JsonWebKey <|-- VerificationMethod +class JsonWebKey { + <> + alg?: string + crv?: string + e?: string + ext?: boolean + key_ops?: string[] + kid?: string + kty: string + n?: string + use?: string + x?: string + y?: string +} + + +class DidJWT { + <> + createDidJWT(payload: JWTPayload, options: JWTOptions, header: JWTJHeader) Promise(string) + verifyDidJWT(JWT: string, resolver: Resolvable) Promise(boolean) +} +JWTPayload --> DidJWT +JWTOptions --> DidJWT +JWTHeader --> DidJWT +Resolvable <-- DidJWT + +``` diff --git a/packages/siop-oid4vp/docs/eosio-dids-testnet.md b/packages/siop-oid4vp/docs/eosio-dids-testnet.md new file mode 100644 index 00000000..fab9b3f5 --- /dev/null +++ b/packages/siop-oid4vp/docs/eosio-dids-testnet.md @@ -0,0 +1,110 @@ +# EOSIO DID creation Walk-through + +--- + +#WARNING + +**DO NOT USE THIS WALK-THROUGH** + +_Currently eosio uses DIDs with a different Verfication Method then all other DIDs (verifiable conditions). This library cannot access/use the public keys in that method yet, so the EOSIO DIDs cannot be used for authentication currently. +The document is still here, because Gimly hopes to make changes to the DID driver, so that we can support EOSIO DIDs as well_ + +--- + +Although this library simply expects DIDs to be present, we provide an example how to create DIDs on the EOSIO Junle testnet. There are 75+ DID methods and creation of DIDs typically happens from code and varies quite a bit. You can use your prefered DID method of choice. + +## Relying Party and SIOP should have keys and DIDs + +Since the library uses DIDs for both the Relying Party and the Self-Issued OpenID Provider, we expect these DIDs to be present on both sides, If you do not have DIDs this walk-through will result in EOSIO dids for the Relying Party and the OpenID Provider respectively. If you use another DID method the creation might vary, and hopefully is a bit more automated. + +### Generate EOS keypairs + +Go to: [Jungle3.0 - EOS Test Network Monitor - create keys](https://monitor3.jungletestnet.io/#createKey). You will see a popup/modal that give you a public EOS key and a private EOS key. + +- Save these values for the RP, for example: + - Public Key: EOS6kKhHvCuWkJDAoNb35qxHnyGCmFQpe1eBYBj9W18iKEQ82vsKZ + - Private key: 5JoQQVRYuXfEMBMjY9T96bvsHGfwaXMygnwFNA1enLA5coWQKSi +- Repeat for the OP, for example: + - Public Key: EOS8ZcT5JhRUuLwdQt6j4f2b8opJH1guPrQefTpo9Fqd4fLbKCpyw + - Private key: 5Japr2nKKCzfZQHXupqm9hWmhMnifsuePRKgCHHwW4cQsLs4wvu + +### Create EOS accounts + +Go to : [Jungle3.0 - EOS Test Network Monitor - create account](https://monitor3.jungletestnet.io/#account). You will see a popup/modal in which you have to specify an account name and submit an owner and active public key. Lastly the reCaptcha needs to be checked after which the Create button can be used. Important: Only submit the public keys, never submit private keys! Use the public keys from the above respective steps. + +- Create an account for the RP: + - Account name example: sioprptest11 (needs to be unique and exactly 12 character and only allows a-z and 1-5!) + - Owner Public Key: EOS6kKhHvCuWkJDAoNb35qxHnyGCmFQpe1eBYBj9W18iKEQ82vsKZ (RP key from above step) + - Active Public Key: EOS6kKhHvCuWkJDAoNb35qxHnyGCmFQpe1eBYBj9W18iKEQ82vsKZ (RP key from above step) + +You will see debug output and red text, which might look like an error at first, but actually this means it succeeded + +- Create an account for the OP: + - Account name example: siopoptest11 (needs to be unique and exactly 12 character and only allows a-z and 1-5!) + - Owner Public Key: EOS8ZcT5JhRUuLwdQt6j4f2b8opJH1guPrQefTpo9Fqd4fLbKCpyw (RP key from above step) + - Active Public Key: EOS8ZcT5JhRUuLwdQt6j4f2b8opJH1guPrQefTpo9Fqd4fLbKCpyw (RP key from above step) + +You will see debug output and red text, which might look like an error at first, but actually this means it succeeded + +### Add balances using a Faucet + +Go to : [Jungle3.0 - EOS Test Network Monitor - faucet](https://monitor3.jungletestnet.io/#faucet) + +- For the RP: + - Fill in the “account name”, eg "sioprptest11", confirm you are not a robot and click “send coins“. + - This should result in a balance of 100 EOS and 100 JUNGLE +- For the OP: + - Fill in the “account name”, eg "siopoptest11", confirm you are not a robot and click “send coins“. + - This should result in a balance of 100 EOS and 100 JUNGLE + +### Increase CPU usage limit + +To execute transactions we need the correct CPU limit. +Go to [Jungle3.0 - EOS Test Network Monitor - powerup](https://monitor3.jungletestnet.io/#powerup) + +- For the RP: + - Fill in the “account name”, eg "sioprptest11", confirm you are not a robot and click “send coins“ (Don't be alarmed by the button reading 'Send Coins'. That is a mistake in the site as it should read Powerup) + - This should result in a transaction with a powerup +- For the OP: + - Fill in the “account name”, eg "siopoptest11", confirm you are not a robot and click “send coins“ (Don't be alarmed by the button reading 'Send Coins'. That is a mistake in the site as it should read Powerup) + - This should result in a transaction with a powerup + +### Test resolution of the DIDs. + +- Go to : https://dev.uniresolver.io +- In the did-url input box past the below dids and click on the Resolve button. You should get back results: + - did:eosio:eos:testnet:jungle:, eg: + - did:eosio:eos:testnet:jungle:sioprptest11 + - did:eosio:eos:testnet:jungle:siopoptest11 + +### Install/use eosio-did typescript library if you want to create additional DIDs + +We want to use the [Gimly-Blockchain/eosio-did](https://github.com/Gimly-Blockchain/eosio-did) typescript library to create eosio did’s. We expect the user to know its way around a development IDE and have npm installed on the computer. + +- git checkout https://github.com/Gimly-Blockchain/eosio-did.git +- cd eosio-git +- npm install +- This project has a test to create those did’s, “create.test.ts“. This test requires that a jungleTestKeys.json is present in the root of the project. The content looks like: + +```json +{ + "name": "[ACCOUNT_NAME]", + "private": "[PRIV_KEY]", + "public": "[PUB_KEY]" +} +``` + +For the RP: + +- Create a rp.json in the root of the project: + +```json +{ + "name": "sioprptest11", + "private": "5JoQQVRYuXfEMBMjY9T96bvsHGfwaXMygnwFNA1enLA5coWQKSi", + "public": "EOS6kKhHvCuWkJDAoNb35qxHnyGCmFQpe1eBYBj9W18iKEQ82vsKZ" +} +``` + +- Adjust line 6 of create-test.ts to read `const jungleTestKeys = require('../rp.json');` +- Execute the test diff --git a/packages/siop-oid4vp/docs/gimly-logo.png b/packages/siop-oid4vp/docs/gimly-logo.png new file mode 100644 index 00000000..6504e9c5 Binary files /dev/null and b/packages/siop-oid4vp/docs/gimly-logo.png differ diff --git a/packages/siop-oid4vp/docs/presentation-exchange.puml b/packages/siop-oid4vp/docs/presentation-exchange.puml new file mode 100644 index 00000000..03979d80 --- /dev/null +++ b/packages/siop-oid4vp/docs/presentation-exchange.puml @@ -0,0 +1,38 @@ +@startuml +header Presentation Exchange flow diagram +title +Presentation Exchange Flow +end title + +autonumber + +participant "Client\n(OP)" as CLIENT order 0 +participant "OP\n<>" as OP order 1 #White +participant "Presentation Exchange\n<>" as PE order 2 #Gray + +activate OP +OP -> OP: verifyAuthRequest\n(Auth Request, Verify Opts) +== START: Presentation Definition from RP is present == + +OP -> CLIENT: if presentationDefinition is present +deactivate OP +activate CLIENT +CLIENT -> PE: Construct PE with DID and Verifiable Credentials +deactivate CLIENT + +activate PE +PE -> PE: selectVerifiableCredentialsForSubmission(Presentation Definition) +PE -> CLIENT: Return matching VCs or an error +activate CLIENT +CLIENT -> CLIENT: Show UI to confirm and optionally subselect VCs from matches\n(NOTE: Not in scope of this library) +CLIENT -> PE: selected VCs +deactivate CLIENT +PE -> PE: submissionFrom(Presentation Definition, selected VCs) +PE -> OP: Return Verifiable Presentation (VP) +deactivate PE +== END: Presentation Definition from RP is present == +activate OP +OP -> OP: createAuthResponse(Verified Auth request, opts and VP) + + +@enduml diff --git a/packages/siop-oid4vp/docs/services-class-diagram.md b/packages/siop-oid4vp/docs/services-class-diagram.md new file mode 100644 index 00000000..f9369fe8 --- /dev/null +++ b/packages/siop-oid4vp/docs/services-class-diagram.md @@ -0,0 +1,209 @@ +```mermaid +classDiagram + +class RP { + <> + createAuthenticationRequest(opts?) Promise(AuthenticationRequestURI) + verifyAuthenticationResponseJwt(jwt: string, opts?) Promise(VerifiedAuthenticationResponseWithJWT) +} +RP --> AuthenticationRequestURI +RP --> VerifiedAuthenticationResponseWithJWT +RP --> AuthorizationRequest +RP --> AuthenticationResponse + +class OP { + <> + createAuthenticationResponse(jwtOrUri: string, opts?) Promise(AuthenticationResponseWithJWT) + verifyAuthenticationRequest(jwt: string, opts?) Promise(VerifiedAuthenticationRequestWithJWT) +} +OP --> AuthenticationResponseWithJWT +OP --> VerifiedAuthenticationRequestWithJWT +OP --> AuthorizationRequest +OP --> AuthenticationResponse + + +class AuthenticationRequestOpts { + <> + redirectUri: string; + requestBy: ObjectBy; + signature: InternalSignature | ExternalSignature | NoSignature; + responseMode?: ResponseMode; + claims?: ClaimPayload; + registration: RequestRegistrationOpts; + nonce?: string; + state?: string; +} +AuthenticationRequestOpts --> ResponseMode +AuthenticationRequestOpts --> RPRegistrationMetadataOpts + + + +class RPRegistrationMetadataOpts { + <> + subjectIdentifiersSupported: SubjectIdentifierType[] | SubjectIdentifierType; + didMethodsSupported?: string[] | string; + credentialFormatsSupported: CredentialFormat[] | CredentialFormat; +} + +class RequestRegistrationOpts { + <> + registrationBy: RegistrationType; +} +RequestRegistrationOpts --|> RPRegistrationMetadataOpts + + +class VerifyAuthenticationRequestOpts { + <> + verification: Verification + nonce?: string; +} + +class AuthorizationRequest { + <> + createURI(opts: AuthenticationRequestOpts) Promise(AuthenticationRequestURI) + createJWT(opts: AuthenticationRequestOpts) Promise(AuthenticationRequestWithJWT); + verifyJWT(jwt: string, opts: VerifyAuthenticationRequestOpts) Promise(VerifiedAuthenticationRequestWithJWT) +} +AuthorizationRequest <-- AuthenticationRequestOpts +AuthorizationRequest <-- VerifyAuthenticationRequestOpts +AuthorizationRequest --> AuthenticationRequestURI +AuthorizationRequest --> AuthenticationRequestWithJWT +AuthorizationRequest --> VerifiedAuthenticationRequestWithJWT + +class AuthenticationResponse { + <> + createJWTFromRequestJWT(jwt: string, responseOpts: AuthenticationResponseOpts, verifyOpts: VerifyAuthenticationRequestOpts) Promise(AuthenticationResponseWithJWT) + verifyJWT(jwt: string, verifyOpts: VerifyAuthenticationResponseOpts) Promise(VerifiedAuthenticationResponseWithJWT) +} +AuthenticationResponse <-- AuthenticationResponseOpts +AuthenticationResponse <-- VerifyAuthenticationRequestOpts +AuthenticationResponse --> AuthenticationResponseWithJWT +AuthenticationResponse <-- VerifyAuthenticationResponseOpts +AuthenticationResponse --> VerifiedAuthenticationResponseWithJWT + +class AuthenticationResponseOpts { + <> + signature: InternalSignature | ExternalSignature; + nonce?: string; + state?: string; + registration: ResponseRegistrationOpts; + responseMode?: ResponseMode; + did: string; + vp?: VerifiablePresentation; + expiresIn?: number; +} +AuthenticationResponseOpts --> ResponseMode + +class AuthenticationResponseWithJWT { + <> + jwt: string; + nonce: string; + state: string; + payload: AuthenticationResponsePayload; + verifyOpts?: VerifyAuthenticationRequestOpts; + responseOpts: AuthenticationResponseOpts; +} +AuthenticationResponseWithJWT --> AuthenticationResponsePayload +AuthenticationResponseWithJWT --> VerifyAuthenticationRequestOpts +AuthenticationResponseWithJWT --> AuthenticationResponseOpts + + +class VerifyAuthenticationResponseOpts { + <> + verification: Verification + nonce?: string; + state?: string; + audience: string; +} + +class ResponseMode { + <> +} + + class UriResponse { + <> + responseMode?: ResponseMode; + bodyEncoded?: string; +} +UriResponse --> ResponseMode +UriResponse <|-- SIOPURI + +class SIOPURI { + <> + encodedUri: string; + encodingFormat: UrlEncodingFormat; +} +SIOPURI --> UrlEncodingFormat +SIOPURI <|-- AuthenticationRequestURI + +class AuthenticationRequestURI { + <> + jwt?: string; + requestOpts: AuthenticationRequestOpts; + requestPayload: AuthenticationRequestPayload; +} +AuthenticationRequestURI --> AuthenticationRequestPayload + +class UrlEncodingFormat { + <> +} + +class ResponseMode { + <> +} + +class AuthenticationRequestPayload { + <> + scope: Scope; + response_type: ResponseType; + client_id: string; + redirect_uri: string; + response_mode: ResponseMode; + request: string; + request_uri: string; + state?: string; + nonce: string; + did_doc?: DIDDocument; + claims?: RequestClaims; +} +AuthenticationRequestPayload --|> JWTPayload + +class JWTPayload { + iss?: string + sub?: string + aud?: string | string[] + iat?: number + nbf?: number + exp?: number + rexp?: number + [x: string]: any +} + + +class VerifiedAuthenticationRequestWithJWT { + <> + payload: AuthenticationRequestPayload; + verifyOpts: VerifyAuthenticationRequestOpts; +} +VerifiedJWT <|-- VerifiedAuthenticationRequestWithJWT +VerifiedAuthenticationRequestWithJWT --> VerifyAuthenticationRequestOpts +VerifiedAuthenticationRequestWithJWT --> AuthenticationRequestPayload + +class VerifiedAuthenticationResponseWithJWT { + <> + payload: AuthenticationResponsePayload; + verifyOpts: VerifyAuthenticationResponseOpts; +} +VerifiedAuthenticationResponseWithJWT --> AuthenticationResponsePayload +VerifiedAuthenticationResponseWithJWT --> VerifyAuthenticationResponseOpts +VerifiedJWT <|-- VerifiedAuthenticationResponseWithJWT + +class VerifiedJWT { + <> + payload: Partial; + didResolutionResult: DIDResolutionResult; + issuer: string; + signer: VerificationMethod; + jwt: string; +} +``` diff --git a/packages/siop-oid4vp/docs/services-class-diagram.svg b/packages/siop-oid4vp/docs/services-class-diagram.svg new file mode 100644 index 00000000..a4c8112b --- /dev/null +++ b/packages/siop-oid4vp/docs/services-class-diagram.svg @@ -0,0 +1 @@ +
«service»
RP
createAuthenticationRequest(opts?) Promise(AuthenticationRequestURI)
verifyAuthenticationResponseJwt(jwt: string, opts?) Promise(VerifiedAuthenticationResponseWithJWT)
«interface»
AuthenticationRequestURI
jwt?: string;
requestOpts: AuthenticationRequestOpts;
requestPayload: AuthenticationRequestPayload;
«interface»
VerifiedAuthenticationResponseWithJWT
payload: AuthenticationResponsePayload;
verifyOpts: VerifyAuthenticationResponseOpts;
«service»
AuthorizationRequest
createURI(opts: AuthenticationRequestOpts) Promise(AuthenticationRequestURI)
createJWT(opts: AuthenticationRequestOpts)
verifyJWT(jwt: string, opts: VerifyAuthenticationRequestOpts) Promise(VerifiedAuthenticationRequestWithJWT)
«interface»
AuthenticationResponse
createJWTFromRequestJWT(jwt: string, responseOpts: AuthenticationResponseOpts, verifyOpts: VerifyAuthenticationRequestOpts) Promise(AuthenticationResponseWithJWT)
verifyJWT(jwt: string, verifyOpts: VerifyAuthenticationResponseOpts) Promise(VerifiedAuthenticationResponseWithJWT)
«service»
OP
createAuthenticationResponse(jwtOrUri: string, opts?) Promise(AuthenticationResponseWithJWT)
verifyAuthenticationRequest(jwt: string, opts?) Promise(VerifiedAuthenticationRequestWithJWT)
«interface»
AuthenticationResponseWithJWT
jwt: string;
nonce: string;
state: string;
payload: AuthenticationResponsePayload;
verifyOpts?: VerifyAuthenticationRequestOpts;
responseOpts: AuthenticationResponseOpts;
«interface»
VerifiedAuthenticationRequestWithJWT
payload: AuthenticationRequestPayload;
verifyOpts: VerifyAuthenticationRequestOpts;
«interface»
AuthenticationRequestOpts
redirectUri: string;
requestBy: ObjectBy;
signature: InternalSignature | ExternalSignature | NoSignature;
responseMode?: ResponseMode;
claims?: ClaimPayload;
registration: RequestRegistrationOpts;
nonce?: string;
state?: string;
«enum»
ResponseMode
«interface»
RPRegistrationMetadataOpts
subjectIdentifiersSupported: SubjectIdentifierType[] | SubjectIdentifierType;
didMethodsSupported?: string[] | string;
credentialFormatsSupported: CredentialFormat[] | CredentialFormat;
«interface»
RequestRegistrationOpts
registrationBy: RegistrationType;
«interface»
VerifyAuthenticationRequestOpts
verification: Verification;
nonce?: string;
AuthenticationRequestWithJWT
«interface»
AuthenticationResponseOpts
signature: InternalSignature | ExternalSignature;
nonce?: string;
state?: string;
registration: ResponseRegistrationOpts;
responseMode?: ResponseMode;
did: string;
vp?: VerifiablePresentation;
expiresIn?: number;
«interface»
VerifyAuthenticationResponseOpts
verification: Verification;
nonce?: string;
state?: string;
audience: string;
AuthenticationResponsePayload
«interface»
UriResponse
responseMode?: ResponseMode;
bodyEncoded?: string;
«interface»
SIOPURI
encodedUri: string;
encodingFormat: UrlEncodingFormat;
«enum»
UrlEncodingFormat
«interface»
AuthenticationRequestPayload
scope: Scope;
response_type: ResponseType;
client_id: string;
redirect_uri: string;
response_mode: ResponseMode;
request: string;
request_uri: string;
state?: string;
nonce: string;
did_doc?: DIDDocument;
claims?: RequestClaims;
JWTPayload
iss?: string
sub?: string
aud?: string | string[]
iat?: number
nbf?: number
exp?: number
rexp?: number
[x: string]: any
«interface»
VerifiedJWT
payload: Partial<JWTPayload>;
didResolutionResult: DIDResolutionResult;
issuer: string;
signer: VerificationMethod;
jwt: string;
diff --git a/packages/siop-oid4vp/docs/walk-through.md b/packages/siop-oid4vp/docs/walk-through.md new file mode 100644 index 00000000..e69de29b diff --git a/packages/siop-oid4vp/generator/schemaGenerator.ts b/packages/siop-oid4vp/generator/schemaGenerator.ts new file mode 100644 index 00000000..617da825 --- /dev/null +++ b/packages/siop-oid4vp/generator/schemaGenerator.ts @@ -0,0 +1,204 @@ +import fs from 'fs' +import path from 'path' + +import Ajv from 'ajv' +import standaloneCode from 'ajv/dist/standalone' +import { + BaseType, + createFormatter, + createParser, + createProgram, + Definition, + FunctionType, + MutableTypeFormatter, + SchemaGenerator, + SubTypeFormatter, +} from 'ts-json-schema-generator' +import { Schema } from 'ts-json-schema-generator/dist/src/Schema/Schema' + +class CustomTypeFormatter implements SubTypeFormatter { + public supportsType(type: FunctionType): boolean { + return type instanceof FunctionType + } + + public getDefinition(): Definition { + // Return a custom schema for the function property. + return { + properties: { + isFunction: { + type: 'boolean', + const: true, + }, + }, + } + } + + public getChildren(): BaseType[] { + return [] + } +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function writeSchema(config: any): Schema { + const formatter = createFormatter(config, (fmt: MutableTypeFormatter) => { + fmt.addTypeFormatter(new CustomTypeFormatter()) + }) + + const program = createProgram(config) + const schema = new SchemaGenerator(program, createParser(program, config), formatter, config).createSchema(config.type) + + let schemaString = JSON.stringify(schema, null, 2) + schemaString = correctSchema(schemaString) + + fs.writeFile(config.outputPath, `export const ${config.schemaId}Obj = ${schemaString};`, (err) => { + if (err) { + throw err + } + }) + return schema +} + +function generateValidationCode(schemas: Schema[]) { + const ajv = new Ajv({ schemas, code: { source: true, lines: true, esm: false }, allowUnionTypes: true, strict: false }) + const moduleCode = standaloneCode(ajv) + fs.writeFileSync(path.join(__dirname, '../lib/schemas/validation/schemaValidation.js'), moduleCode) +} + +function correctSchema(schemaString: string) { + return schemaString.replace( + '"SuppliedSignature": {\n' + + ' "type": "object",\n' + + ' "properties": {\n' + + ' "withSignature": {\n' + + ' "properties": {\n' + + ' "isFunction": {\n' + + ' "type": "boolean",\n' + + ' "const": true\n' + + ' }\n' + + ' }\n' + + ' },\n' + + ' "did": {\n' + + ' "type": "string"\n' + + ' },\n' + + ' "kid": {\n' + + ' "type": "string"\n' + + ' }\n' + + ' },\n' + + ' "required": [\n' + + ' "withSignature",\n' + + ' "did",\n' + + ' "kid"\n' + + ' ],\n' + + ' "additionalProperties": false\n' + + ' },', + '"SuppliedSignature": {\n' + + ' "type": "object",\n' + + ' "properties": {\n' + + ' "did": {\n' + + ' "type": "string"\n' + + ' },\n' + + ' "kid": {\n' + + ' "type": "string"\n' + + ' }\n' + + ' },\n' + + ' "required": [\n' + + ' "did",\n' + + ' "kid"\n' + + ' ],\n' + + ' "additionalProperties": true\n' + + ' },', + ) +} +/* +const requestOptsConf = { + path: '../lib/authorization-request/types.ts', + tsconfig: 'tsconfig.json', + type: 'CreateAuthorizationRequestOpts', // Or if you want to generate schema for that one type only + schemaId: 'CreateAuthorizationRequestOptsSchema', + outputPath: 'lib/schemas/AuthorizationRequestOpts.schema.ts', + // outputConstName: 'AuthorizationRequestOptsSchema', + skipTypeCheck: true +};*/ + +const responseOptsConf = { + path: '../lib/authorization-response/types.ts', + tsconfig: 'tsconfig.json', + type: 'AuthorizationResponseOpts', // Or if you want to generate schema for that one type only + schemaId: 'AuthorizationResponseOptsSchema', + outputPath: 'lib/schemas/AuthorizationResponseOpts.schema.ts', + // outputConstName: 'AuthorizationResponseOptsSchema', + skipTypeCheck: true, +} + +const rPRegistrationMetadataPayload = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'RPRegistrationMetadataPayload', + schemaId: 'RPRegistrationMetadataPayloadSchema', + outputPath: 'lib/schemas/RPRegistrationMetadataPayload.schema.ts', + // outputConstName: 'RPRegistrationMetadataPayloadSchema', + skipTypeCheck: true, +} + +const discoveryMetadataPayload = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'DiscoveryMetadataPayload', + schemaId: 'DiscoveryMetadataPayloadSchema', + outputPath: 'lib/schemas/DiscoveryMetadataPayload.schema.ts', + // outputConstName: 'DiscoveryMetadataPayloadSchema', + skipTypeCheck: true, +} + +const authorizationRequestPayloadVID1 = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'AuthorizationRequestPayloadVID1', // Or if you want to generate schema for that one type only + schemaId: 'AuthorizationRequestPayloadVID1Schema', + outputPath: 'lib/schemas/AuthorizationRequestPayloadVID1.schema.ts', + // outputConstName: 'AuthorizationRequestPayloadSchemaVID1', + skipTypeCheck: true, +} + +const authorizationRequestPayloadVD11 = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'AuthorizationRequestPayloadVD11', // Or if you want to generate schema for that one type only + schemaId: 'AuthorizationRequestPayloadVD11Schema', + outputPath: 'lib/schemas/AuthorizationRequestPayloadVD11.schema.ts', + // outputConstName: 'AuthorizationRequestPayloadSchemaVD11', + skipTypeCheck: true, +} + +const authorizationRequestPayloadVD12OID4VPD18 = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'AuthorizationRequestPayloadVD12OID4VPD18', // Or if you want to generate schema for that one type only + schemaId: 'AuthorizationRequestPayloadVD12OID4VPD18Schema', + outputPath: 'lib/schemas/AuthorizationRequestPayloadVD12OID4VPD18.schema.ts', + // outputConstName: 'AuthorizationRequestPayloadSchemaVD11', + skipTypeCheck: true, +} + +const authorizationRequestPayloadVD12OID4VPD20 = { + path: '../lib/types/SIOP.types.ts', + tsconfig: 'tsconfig.json', + type: 'AuthorizationRequestPayloadVD12OID4VPD20', // Or if you want to generate schema for that one type only + schemaId: 'AuthorizationRequestPayloadVD12OID4VPD20Schema', + outputPath: 'lib/schemas/AuthorizationRequestPayloadVD12OID4VPD20.schema.ts', + // outputConstName: 'AuthorizationRequestPayloadSchemaVD11', + skipTypeCheck: true, +} + +const schemas: Schema[] = [ + writeSchema(authorizationRequestPayloadVID1), + writeSchema(authorizationRequestPayloadVD11), + writeSchema(authorizationRequestPayloadVD12OID4VPD18), + writeSchema(authorizationRequestPayloadVD12OID4VPD20), + // writeSchema(requestOptsConf), + writeSchema(responseOptsConf), + writeSchema(rPRegistrationMetadataPayload), + writeSchema(discoveryMetadataPayload), +] + +generateValidationCode(schemas) diff --git a/packages/siop-oid4vp/jest.json b/packages/siop-oid4vp/jest.json new file mode 100644 index 00000000..2a13352f --- /dev/null +++ b/packages/siop-oid4vp/jest.json @@ -0,0 +1,28 @@ +{ + "preset": "ts-jest", + "moduleFileExtensions": ["ts", "tsx", "js", "jsx"], + "collectCoverage": true, + "collectCoverageFrom": [ + "packages/**/src/**/*.ts", + "packages/**/lib/**/*.ts", + "!**/examples/**", + "!packages/cli/**", + "!**/types/**", + "!**/dist/**", + "!**/coverage/**", + "!**/node_modules/**/__tests__/**", + "!**/node_modules/**/*.test.ts", + "!**/node_modules/**", + "!**/packages/**/index.ts" + ], + "coverageReporters": ["text", "lcov", "json"], + "coverageDirectory": "./coverage", + "transform": { + "\\.jsx?$": "babel-jest", + "\\.tsx?$": ["ts-jest", { "tsconfig": "./packages/siop-oid4vp/tsconfig.json" }] + }, + "testMatch": ["**/__tests__/**/*.spec.*", "**/tests/**/*.spec.*"], + "testEnvironment": "node", + "automock": false, + "verbose": true +} diff --git a/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.request.spec.ts b/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.request.spec.ts new file mode 100644 index 00000000..47fbce65 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.request.spec.ts @@ -0,0 +1,691 @@ +import { parse } from 'querystring' + +import { IPresentationDefinition } from '@sphereon/pex' +import { IProofType } from '@sphereon/ssi-types' + +import { + CreateAuthorizationRequestOpts, + PassBy, + RequestObject, + ResponseType, + Scope, + SigningAlgo, + SubjectIdentifierType, + SubjectType, + SupportedVersion, + URI, +} from '..' +import SIOPErrors from '../types/Errors' + +import { getCreateJwtCallback } from './DidJwtTestUtils' +import { WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1' + +describe('create Request Uri should', () => { + it('throw BAD_PARAMS when no responseOpts is passed', async () => { + expect.assertions(1) + await expect(URI.fromOpts(undefined as never)).rejects.toThrow(SIOPErrors.BAD_PARAMS) + }) + + it('throw BAD_PARAMS when no responseOpts.redirectUri is passed', async () => { + expect.assertions(1) + const opts = {} + await expect(URI.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.BAD_PARAMS) + }) + + it('throw BAD_PARAMS when no responseOpts.requestObject is passed', async () => { + expect.assertions(1) + const opts = { payload: { redirect_uri: EXAMPLE_REDIRECT_URL } } + await expect(URI.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.BAD_PARAMS) + }) + + it('throw BAD_PARAMS when no responseOpts.requestBy is passed', async () => { + expect.assertions(1) + const opts = { + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: {}, + } + await expect(URI.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.REQUEST_OBJECT_TYPE_NOT_SET) + }) + + it('throw REQUEST_OBJECT_TYPE_NOT_SET when responseOpts.requestBy type is different from REFERENCE or VALUE', async () => { + expect.assertions(1) + const opts = { + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + passBy: 'other type', + }, + } + await expect(URI.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.REQUEST_OBJECT_TYPE_NOT_SET) + }) + + it('throw NO_REFERENCE_URI when responseOpts.requestBy type is REFERENCE and no referenceUri is passed', async () => { + expect.assertions(1) + const opts = { + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + passBy: PassBy.REFERENCE, + }, + } + await expect(URI.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.NO_REFERENCE_URI) + }) + + it('return a reference url', async () => { + expect.assertions(12) + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'openid', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: KID, + alg: SigningAlgo.ES256, + }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + alg: SigningAlgo.ES256, + did: DID, + kid: KID, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'openid', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100300', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const uriRequest = await URI.fromOpts(opts) + expect(uriRequest).toBeDefined() + expect(uriRequest).toHaveProperty('encodedUri') + expect(uriRequest).toHaveProperty('encodingFormat') + expect(uriRequest).toHaveProperty('requestObjectJwt') + expect(uriRequest).toHaveProperty('authorizationRequestPayload') + expect(uriRequest.authorizationRequestPayload).toBeDefined() + + const uriDecoded = decodeURIComponent(uriRequest.encodedUri) + expect(uriDecoded).toContain(`openid://`) + expect(uriDecoded).toContain(`response_type=${ResponseType.ID_TOKEN}`) + expect(uriDecoded).toContain(`&redirect_uri=${opts.payload?.redirect_uri}`) + expect(uriDecoded).toContain(`&scope=${Scope.OPENID}`) + expect(uriDecoded).toContain(`&request_uri=`) + + const data = parse(uriDecoded) + expect(data.request_uri).toStrictEqual(opts.requestObject.reference_uri) + // expect(data.registration).toContain('client_purpose#nl-NL'); + }) + + it('return a reference url when using did:key', async () => { + expect.assertions(4) + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + requestObject: { + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256 }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: + 'd474ffdb3ea75fbb3f07673e67e52002a3b7eb42767f709f4100acf493c7fc8743017577997b72e7a8b4bce8c32c8e78fd75c1441e95d6aaa888056d1200beb3', + did: 'did:key:z6MkixpejjET5qJK4ebN5m3UcdUPmYV4DPSCs1ALH8x2UCfc', + kid: 'did:key:z6MkixpejjET5qJK4ebN5m3UcdUPmYV4DPSCs1ALH8x2UCfc#z6MkixpejjET5qJK4ebN5m3UcdUPmYV4DPSCs1ALH8x2UCfc', + alg: SigningAlgo.EDDSA, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.ES256, SigningAlgo.EDDSA], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100301', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const uriRequest = await URI.fromOpts(opts) + const uriDecoded = decodeURIComponent(uriRequest.encodedUri) + + const data = URI.parse(uriDecoded) + expect(uriRequest).toHaveProperty('requestObjectJwt') + expect(uriRequest.authorizationRequestPayload).toBeDefined() + expect(data.authorizationRequestPayload.request_uri).toEqual(opts.requestObject.reference_uri) + expect(uriRequest.authorizationRequestPayload.request_uri).toEqual(EXAMPLE_REFERENCE_URL) + }) + + it('return an url with an embedded token value', async () => { + expect.assertions(3) + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + requestObject: { + passBy: PassBy.VALUE, + jwtIssuer: { + method: 'did', + didUrl: KID, + alg: SigningAlgo.ES256K, + }, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100302', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const uriRequest = await URI.fromOpts(opts) + + const uriDecoded = decodeURIComponent(uriRequest.encodedUri) + expect(uriDecoded).toContain(`openid://?request=eyJhbGciOi`) + + const data = URI.parse(uriDecoded) + expect(data.scheme).toEqual('openid://') + expect(data.authorizationRequestPayload.request).toContain(`eyJhbGciOi`) + }) +}) + +describe('create Request JWT should', () => { + it('throw REQUEST_OBJECT_TYPE_NOT_SET when requestBy type is different from REFERENCE and VALUE', async () => { + expect.assertions(1) + const opts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + passBy: 'other type' as never, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + }, + registration: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + }, + } + await expect(RequestObject.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.REQUEST_OBJECT_TYPE_NOT_SET) + }) + + it('throw NO_REFERENCE_URI when no referenceUri is passed with REFERENCE requestBy type is set', async () => { + expect.assertions(1) + const opts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + passBy: PassBy.REFERENCE, + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + }, + registration: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + }, + } + await expect(RequestObject.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.NO_REFERENCE_URI) + }) + + it('throw REGISTRATION_OBJECT_TYPE_NOT_SET when registrationBy type is neither REFERENCE nor VALUE', async () => { + expect.assertions(1) + const opts = { + requestObject: { + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + signature: { + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + }, + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + registration: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + type: 'FAILURE', + }, + } + await expect(RequestObject.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.REGISTRATION_OBJECT_TYPE_NOT_SET) + }) + + it('throw NO_REFERENCE_URI when registrationBy type is REFERENCE and no referenceUri is passed', async () => { + expect.assertions(1) + const opts = { + version: SupportedVersion.SIOPv2_ID1, + + requestObject: { + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + signature: { + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + }, + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + registration: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.REFERENCE, + }, + } + await expect(RequestObject.fromOpts(opts as never)).rejects.toThrow(SIOPErrors.NO_REFERENCE_URI) + }) + + it('succeed when all params are set', async () => { + // expect.assertions(1); + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: 'test_client_id', + scope: 'test', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.ES256, SigningAlgo.EDDSA], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + + requestObject: { + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: 'test_client_id', + scope: 'test', + response_type: 'id_token', + request_object_signing_alg_values_supported: [SigningAlgo.ES256, SigningAlgo.EDDSA], + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: 'test_client_id', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + + passBy: PassBy.VALUE, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100303', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const expected = { + response_type: 'id_token', + scope: 'test', + client_id: 'test_client_id', + redirect_uri: 'https://acme.com/hello', + registration: { + id_token_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_types_supported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr:', 'did'], + vp_formats: { + ldp_vc: { + proof_type: ['EcdsaSecp256k1Signature2019', 'EcdsaSecp256k1Signature2019'], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + client_name: VERIFIER_NAME_FOR_CLIENT, + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100303', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + + /*opts: { + redirectUri: 'https://acme.com/hello', + requestBy: { + type: 'REFERENCE', + reference_uri: 'https://rp.acme.com/siop/jwts', + }, + withSignature: { + hexPrivateKey: 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f', + did: 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0', + kid: 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1', + }, + registration: { + idTokenSigningAlgValuesSupported: ['EdDSA', 'ES256'], + subjectSyntaxTypesSupported: ['did:ethr:', 'did'], + vpFormatsSupported: { + ldp_vc: { + proof_type: ['EcdsaSecp256k1Signature2019', 'EcdsaSecp256k1Signature2019'], + }, + }, + registrationBy: { + type: 'VALUE', + }, + }, + },*/ + } + + // await URI.fromOpts(opts).then((uri) => console.log(uri.encodedUri)); + await expect((await RequestObject.fromOpts(opts)).getPayload()).resolves.toMatchObject(expected) + }) + + it('succeed when requesting with a valid PD', async () => { + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + /*payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + claims: { + vp_token: { + presentation_definition: { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + }, + }, + }, + },*/ + requestObject: { + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + claims: { + vp_token: { + presentation_definition: { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + }, + }, + }, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + + passBy: PassBy.VALUE, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100305', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const uriRequest = await URI.fromOpts(opts) + + const uriDecoded = decodeURIComponent(uriRequest.encodedUri) + expect(uriDecoded).toEqual(`openid://?request_uri=https://rp.acme.com/siop/jwts`) + expect((await (await uriRequest.toAuthorizationRequest())?.requestObject?.getPayload())?.claims.vp_token).toBeDefined() + }) + + it('should throw error if presentation definition object is not valid', async () => { + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: 'test_client_id', + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + claims: { + vp_token: { + presentation_definition: { + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + } as IPresentationDefinition, + }, + }, + }, + + requestObject: { + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: 'test_client_id', + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + claims: { + vp_token: { + presentation_definition: { + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + } as IPresentationDefinition, + }, + }, + }, + }, + clientMetadata: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + + passBy: PassBy.VALUE, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100306', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + await expect(URI.fromOpts(opts)).rejects.toThrow(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.verify.spec.ts b/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.verify.spec.ts new file mode 100644 index 00000000..56f07fa2 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/AuthenticationRequest.verify.spec.ts @@ -0,0 +1,440 @@ +import { IProofType } from '@sphereon/ssi-types' +import Ajv from 'ajv' +import * as dotenv from 'dotenv' + +import { + AuthorizationRequest, + CreateAuthorizationRequestOpts, + PassBy, + RequestObject, + ResponseType, + Scope, + SigningAlgo, + SubjectType, + SupportedVersion, + VerifyAuthorizationRequestOpts, +} from '..' +import { RPRegistrationMetadataPayloadSchemaObj } from '../schemas' +import SIOPErrors from '../types/Errors' + +import { getCreateJwtCallback, getVerifyJwtCallback } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { metadata, mockedGetEnterpriseAuthToken, WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + UNIT_TEST_TIMEOUT, + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +dotenv.config() + +describe('verifyJWT should', () => { + it('should compile schema', async () => { + const schema = { + $schema: 'http://json-schema.org/draft-07/schema#', + $ref: '#/definitions/RPRegistrationMetadataPayload', + definitions: { + RPRegistrationMetadataPayload: { + type: 'object', + properties: { + client_id: { + anyOf: [ + { + type: 'string', + }, + {}, + ], + }, + id_token_signing_alg_values_supported: { + anyOf: [ + { + type: 'array', + items: { + $ref: '#/definitions/SigningAlgo', + }, + }, + { + $ref: '#/definitions/SigningAlgo', + }, + ], + }, + request_object_signing_alg_values_supported: { + anyOf: [ + { + type: 'array', + items: { + $ref: '#/definitions/SigningAlgo', + }, + }, + { + $ref: '#/definitions/SigningAlgo', + }, + ], + }, + response_types_supported: { + anyOf: [ + { + type: 'array', + items: { + $ref: '#/definitions/ResponseType', + }, + }, + { + $ref: '#/definitions/ResponseType', + }, + ], + }, + scopes_supported: { + anyOf: [ + { + type: 'array', + items: { + $ref: '#/definitions/Scope', + }, + }, + { + $ref: '#/definitions/Scope', + }, + ], + }, + subject_types_supported: { + anyOf: [ + { + type: 'array', + items: { + $ref: '#/definitions/SubjectType', + }, + }, + { + $ref: '#/definitions/SubjectType', + }, + ], + }, + subject_syntax_types_supported: { + type: 'array', + items: { + type: 'string', + }, + }, + vp_formats: { + anyOf: [ + { + $ref: '#/definitions/Format', + }, + {}, + ], + }, + client_name: { + anyOf: [ + { + type: 'string', + }, + {}, + ], + }, + logo_uri: { + anyOf: [ + {}, + { + type: 'string', + }, + ], + }, + client_purpose: { + anyOf: [ + {}, + { + type: 'string', + }, + ], + }, + }, + }, + SigningAlgo: { + type: 'string', + enum: ['EdDSA', 'RS256', 'ES256', 'ES256K'], + }, + ResponseType: { + type: 'string', + enum: ['id_token', 'vp_token'], + }, + Scope: { + type: 'string', + enum: ['openid', 'openid did_authn', 'profile', 'email', 'address', 'phone'], + }, + SubjectType: { + type: 'string', + enum: ['public', 'pairwise'], + }, + Format: { + type: 'object', + properties: { + jwt: { + $ref: '#/definitions/JwtObject', + }, + jwt_vc: { + $ref: '#/definitions/JwtObject', + }, + jwt_vp: { + $ref: '#/definitions/JwtObject', + }, + ldp: { + $ref: '#/definitions/LdpObject', + }, + ldp_vc: { + $ref: '#/definitions/LdpObject', + }, + ldp_vp: { + $ref: '#/definitions/LdpObject', + }, + }, + additionalProperties: false, + }, + JwtObject: { + type: 'object', + properties: { + alg: { + type: 'array', + items: { + type: 'string', + }, + }, + }, + required: ['alg'], + additionalProperties: false, + }, + LdpObject: { + type: 'object', + properties: { + proof_type: { + type: 'array', + items: { + type: 'string', + }, + }, + }, + required: ['proof_type'], + additionalProperties: false, + }, + }, + } + const ajv = new Ajv({ allowUnionTypes: true, strict: false }) + ajv.compile(RPRegistrationMetadataPayloadSchemaObj) + ajv.compile(schema) + }) + it('throw VERIFY_BAD_PARAMETERS when no JWT is passed', async () => { + expect.assertions(1) + await expect(AuthorizationRequest.verify(undefined as never, undefined as never)).rejects.toThrow(SIOPErrors.VERIFY_BAD_PARAMS) + }) + + it('throw VERIFY_BAD_PARAMETERS when no responseOpts is passed', async () => { + expect.assertions(1) + await expect(AuthorizationRequest.verify('an invalid JWT bypassing the undefined check', undefined as never)).rejects.toThrow( + SIOPErrors.VERIFY_BAD_PARAMS, + ) + }) + + it('throw VERIFY_BAD_PARAMETERS when no responseOpts.verification is passed', async () => { + expect.assertions(1) + await expect(AuthorizationRequest.verify('an invalid JWT bypassing the undefined check', {} as never)).rejects.toThrow( + SIOPErrors.VERIFY_BAD_PARAMS, + ) + }) + + it('throw BAD_NONCE when a different nonce is supplied during verification', async () => { + expect.assertions(1) + + const mockEntity = await mockedGetEnterpriseAuthToken('COMPANY AA INC') + + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }, + passBy: PassBy.REFERENCE, + reference_uri: 'https://my-request.com/here', + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockEntity.hexPrivateKey, + did: mockEntity.did, + kid: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + state: '12345', + nonce: '12345', + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + authorization_endpoint: '', + redirect_uri: 'https://acme.com/hello', + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID, Scope.OPENID_DIDAUTHN], + subjectTypesSupported: [SubjectType.PAIRWISE], + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256K], + subject_syntax_types_supported: ['did:ethr:'], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100309', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const requestObject = await RequestObject.fromOpts(requestOpts) + + const resolver = getResolver('ethr') + const verifyOpts: VerifyAuthorizationRequestOpts = { + verifyJwtCallback: getVerifyJwtCallback(resolver, { checkLinkedDomain: 'if_present' }), + verification: {}, + supportedVersions: [SupportedVersion.SIOPv2_ID1], + correlationId: '1234', + nonce: 'invalid_nonce', + } + + const jwt = await requestObject.toJwt() + await expect(AuthorizationRequest.verify(jwt as string, verifyOpts)).rejects.toThrow(SIOPErrors.BAD_NONCE) + }) + + it( + 'succeed if a valid JWT is passed', + async () => { + const mockEntity = await mockedGetEnterpriseAuthToken('COMPANY AA INC') + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }, + passBy: PassBy.REFERENCE, + reference_uri: 'https://my-request.com/here', + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockEntity.hexPrivateKey, + did: mockEntity.did, + kid: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + state: '12345', + nonce: '12345', + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + authorization_endpoint: '', + redirect_uri: 'https://acme.com/hello', + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID, Scope.OPENID_DIDAUTHN], + subjectTypesSupported: [SubjectType.PAIRWISE], + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256K], + subject_syntax_types_supported: ['did:ethr:'], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100309', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const requestObject = await RequestObject.fromOpts(requestOpts) + + const resolver = getResolver('ethr') + const verifyOpts: VerifyAuthorizationRequestOpts = { + verifyJwtCallback: getVerifyJwtCallback(resolver, { checkLinkedDomain: 'if_present' }), + verification: {}, + supportedVersions: [SupportedVersion.SIOPv2_ID1], + correlationId: '1234', + } + + const verifyJWT = await AuthorizationRequest.verify((await requestObject.toJwt()) as string, verifyOpts) + expect(verifyJWT.jwt).toMatch(/^eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjowe.*$/) + }, + UNIT_TEST_TIMEOUT, + ) +}) + +describe('OP and RP communication should', () => { + it('work if both support the same did methods', () => { + const actualResult = metadata.verify() + const expectedResult = { + vp_formats: { + jwt_vc: { alg: [SigningAlgo.ES256, SigningAlgo.ES256K] }, + ldp_vc: { + proof_type: ['EcdsaSecp256k1Signature2019', 'EcdsaSecp256k1Signature2019'], + }, + }, + subject_syntax_types_supported: ['did:web'], + } + expect(actualResult).toEqual(expectedResult) + }) + + it('work if RP supports any OP did methods', () => { + metadata.opMetadata.vp_formats = { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + } + metadata.rpMetadata.subject_syntax_types_supported = ['did:web'] + expect(metadata.verify()).toEqual({ + subject_syntax_types_supported: ['did:web'], + vp_formats: { + ldp_vc: { + proof_type: ['EcdsaSecp256k1Signature2019', 'EcdsaSecp256k1Signature2019'], + }, + }, + }) + }) + + it('work if RP supports any OP credential formats', () => { + metadata.opMetadata.vp_formats = { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + } + const result = metadata.verify() as Record + expect(result['subject_syntax_types_supported']).toContain('did:web') + expect(result['vp_formats']).toStrictEqual({ + ldp_vc: { + proof_type: ['EcdsaSecp256k1Signature2019', 'EcdsaSecp256k1Signature2019'], + }, + }) + }) + + it('not work if RP does not support any OP did method', () => { + metadata.rpMetadata.subject_syntax_types_supported = ['did:notsupported'] + expect(() => metadata.verify()).toThrowError(SIOPErrors.DID_METHODS_NOT_SUPORTED) + }) + + it('not work if RP does not support any OP credentials', () => { + metadata.rpMetadata.vp_formats = undefined + expect(() => metadata.verify()).toThrowError(SIOPErrors.CREDENTIALS_FORMATS_NOT_PROVIDED) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.response.spec.ts b/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.response.spec.ts new file mode 100644 index 00000000..f178b0b2 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.response.spec.ts @@ -0,0 +1,653 @@ +import { IPresentationDefinition } from '@sphereon/pex' +import { + ICredential, + IPresentation, + IProofType, + IVerifiableCredential, + IVerifiablePresentation, + OriginalVerifiableCredential, +} from '@sphereon/ssi-types' + +import { + AuthorizationResponse, + AuthorizationResponseOpts, + CreateAuthorizationRequestOpts, + PassBy, + PresentationExchange, + PresentationSignCallback, + RequestObject, + ResponseIss, + ResponseMode, + ResponseType, + Scope, + SigningAlgo, + SubjectIdentifierType, + SubjectType, + SupportedVersion, + VerifyAuthorizationRequestOpts, + VPTokenLocation, +} from '..' +import { createPresentationSubmission } from '../authorization-response/OpenID4VP' +import SIOPErrors from '../types/Errors' + +import { getCreateJwtCallback, getVerifyJwtCallback } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { mockedGetEnterpriseAuthToken, WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + UNIT_TEST_TIMEOUT, + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +jest.setTimeout(30000) + +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1' + +const validButExpiredJWT = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NjEzNTEyOTAsImV4cCI6MTU2MTM1MTg5MCwicmVzcG9uc2VfdHlwZSI6ImlkX3Rva2VuIiwic2NvcGUiOiJvcGVuaWQiLCJjbGllbnRfaWQiOiJkaWQ6ZXRocjoweDQ4NzNFQzc0MUQ4RDFiMjU4YUYxQjUyNDczOEIzNjNhQTIxOTk5MjAiLCJyZWRpcmVjdF91cmkiOiJodHRwczovL2FjbWUuY29tL2hlbGxvIiwiaXNzIjoiZGlkOmV0aHI6MHg0ODczRUM3NDFEOEQxYjI1OGFGMUI1MjQ3MzhCMzYzYUEyMTk5OTIwIiwicmVzcG9uc2VfbW9kZSI6InBvc3QiLCJyZXNwb25zZV9jb250ZXh0IjoicnAiLCJub25jZSI6IlVTLU9wY1FHLXlXS3lWUTRlTU53UFB3Um10UVVGdmpkOHJXeTViRC10MXciLCJzdGF0ZSI6IjdmMjcxYzZjYjk2ZThmOThhMzkxYWU5ZCIsInJlZ2lzdHJhdGlvbiI6eyJpZF90b2tlbl9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVkRFNBIiwiRVMyNTYiXSwicmVxdWVzdF9vYmplY3Rfc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCI6WyJFZERTQSIsIkVTMjU2Il0sInJlc3BvbnNlX3R5cGVzX3N1cHBvcnRlZCI6WyJpZF90b2tlbiJdLCJzY29wZXNfc3VwcG9ydGVkIjpbIm9wZW5pZCBkaWRfYXV0aG4iLCJvcGVuaWQiXSwic3ViamVjdF90eXBlc19zdXBwb3J0ZWQiOlsicGFpcndpc2UiXSwic3ViamVjdF9zeW50YXhfdHlwZXNfc3VwcG9ydGVkIjpbImRpZDpldGhyOiIsImRpZCJdLCJ2cF9mb3JtYXRzIjp7ImxkcF92YyI6eyJwcm9vZl90eXBlIjpbIkVjZHNhU2VjcDI1NmsxU2lnbmF0dXJlMjAxOSIsIkVjZHNhU2VjcDI1NmsxU2lnbmF0dXJlMjAxOSJdfX19fQ.Wd6I7BT7fWZSuYozUwHnyEsEoAe6OjdyzEEKXnWk8bY' + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' + +describe('create JWT from Request JWT should', () => { + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + responseMode: ResponseMode.POST, + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + responseTypesSupported: [ResponseType.ID_TOKEN], + subject_syntax_types_supported: ['did:web'], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + issuer: ResponseIss.SELF_ISSUED_V2, + + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100310', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + createJwtCallback: getCreateJwtCallback({ + did: DID, + hexPrivateKey: HEX_KEY, + kid: KID, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + } + + const resolver = getResolver('ethr') + const verifyOpts: VerifyAuthorizationRequestOpts = { + verifyJwtCallback: getVerifyJwtCallback(resolver), + verification: {}, + supportedVersions: [SupportedVersion.SIOPv2_ID1], + correlationId: '1234', + } + + it('throw NO_JWT when no jwt is passed', async () => { + expect.assertions(1) + await expect(AuthorizationResponse.fromRequestObject(undefined as never, responseOpts, verifyOpts)).rejects.toThrow(SIOPErrors.NO_JWT) + }) + it('throw BAD_PARAMS when no responseOpts is passed', async () => { + expect.assertions(1) + await expect(AuthorizationResponse.fromRequestObject(validButExpiredJWT, undefined as never, verifyOpts)).rejects.toThrow(SIOPErrors.BAD_PARAMS) + }) + it('throw VERIFY_BAD_PARAMS when no verifyOpts is passed', async () => { + expect.assertions(1) + await expect(AuthorizationResponse.fromRequestObject(validButExpiredJWT, responseOpts, undefined as never)).rejects.toThrow( + SIOPErrors.VERIFY_BAD_PARAMS, + ) + }) + + it('throw JWT_ERROR when expired but valid JWT is passed in', async () => { + expect.assertions(1) + const mockReqEntity = await mockedGetEnterpriseAuthToken('REQ COMPANY') + const mockResEntity = await mockedGetEnterpriseAuthToken('RES COMPANY') + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + /*payload: { + nonce: '12345', + state: '12345', + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + },*/ + requestObject: { + passBy: PassBy.REFERENCE, + jwtIssuer: { method: 'did', didUrl: `${mockReqEntity.did}#controller`, alg: SigningAlgo.ES256K }, + reference_uri: 'https://my-request.com/here', + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockReqEntity.hexPrivateKey, + did: mockReqEntity.did, + kid: `${mockReqEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + nonce: '12345', + state: '12345', + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100311', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + issuer: ResponseIss.SELF_ISSUED_V2, + responseTypesSupported: [ResponseType.ID_TOKEN], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100312', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + createJwtCallback: getCreateJwtCallback({ + did: mockResEntity.did, + hexPrivateKey: mockResEntity.hexPrivateKey, + kid: `${mockResEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: `${mockResEntity.did}#controller`, alg: SigningAlgo.ES256K }, + responseMode: ResponseMode.POST, + } + + jest.useFakeTimers().setSystemTime(new Date('2020-01-01')) + jest.useFakeTimers().setSystemTime(new Date('2020-01-01')) + + const requestObject = await RequestObject.fromOpts(requestOpts) + const jwt = await requestObject.toJwt() + if (!jwt) throw new Error('JWT is undefined') + jest.useRealTimers() + await expect(AuthorizationResponse.fromRequestObject(jwt, responseOpts, verifyOpts)).rejects.toThrow(/invalid_jwt: JWT has expired: exp: /) + }) + + it( + 'succeed when valid JWT is passed in', + async () => { + expect.assertions(1) + + const mockReqEntity = await mockedGetEnterpriseAuthToken('REQ COMPANY') + const mockResEntity = await mockedGetEnterpriseAuthToken('RES COMPANY') + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + + requestObject: { + passBy: PassBy.REFERENCE, + reference_uri: 'https://my-request.com/here', + jwtIssuer: { method: 'did', didUrl: `${mockReqEntity.did}#controller`, alg: SigningAlgo.ES256K }, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockReqEntity.hexPrivateKey, + did: mockReqEntity.did, + kid: `${mockReqEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100313', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + issuer: ResponseIss.SELF_ISSUED_V2, + responseTypesSupported: [ResponseType.ID_TOKEN], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100314', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + createJwtCallback: getCreateJwtCallback({ + did: mockResEntity.did, + hexPrivateKey: mockResEntity.hexPrivateKey, + kid: `${mockResEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: `${mockResEntity.did}#controller`, alg: SigningAlgo.ES256K }, + responseMode: ResponseMode.POST, + } + + const requestObject = await RequestObject.fromOpts(requestOpts) + // console.log(JSON.stringify(await AuthorizationResponse.fromRequestObject(await requestObject.toJwt(), responseOpts, verifyOpts))); + const jwt = await requestObject.toJwt() + if (!jwt) throw new Error('JWT is undefined') + const response = await AuthorizationResponse.fromRequestObject(jwt, responseOpts, verifyOpts) + await expect(response).toBeDefined() + }, + UNIT_TEST_TIMEOUT, + ) + + it('succeed when valid JWT with PD is passed in', async () => { + expect.assertions(1) + + const mockReqEntity = await mockedGetEnterpriseAuthToken('REQ COMPANY') + const mockResEntity = await mockedGetEnterpriseAuthToken('RES COMPANY') + const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, + }) + const definition: IPresentationDefinition = { + id: 'Credentials', + input_descriptors: [ + { + id: 'ID Card Credential', + schema: [ + { + uri: 'https://www.w3.org/2018/credentials/examples/v1/IDCardCredential', + }, + ], + constraints: { + limit_disclosure: 'required', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + } + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + requestObject: { + passBy: PassBy.REFERENCE, + reference_uri: 'https://my-request.com/here', + jwtIssuer: { method: 'did', didUrl: mockReqEntity.did, alg: SigningAlgo.ES256K }, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockReqEntity.hexPrivateKey, + did: mockReqEntity.did, + kid: `${mockReqEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token vp_token', + redirect_uri: EXAMPLE_REDIRECT_URL, + claims: { + vp_token: { + presentation_definition: definition, + }, + }, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100315', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const vc: ICredential = { + id: 'https://example.com/credentials/1872', + type: ['VerifiableCredential', 'IDCardCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1/IDCardCredential'], + issuer: { + id: 'did:example:issuer', + }, + issuanceDate: '2010-01-01T19:23:24Z', + credentialSubject: { + given_name: 'Fredrik', + family_name: 'Stremberg', + birthdate: '1949-01-22', + }, + } + const presentation: IVerifiablePresentation = { + '@context': ['https://www.w3.org/2018/credentials/v1'], + presentation_submission: undefined, + type: ['verifiablePresentation'], + holder: 'did:example:holder', + verifiableCredential: [vc as IVerifiableCredential], + proof: undefined as any, + } + + const pex = new PresentationExchange({ + allDIDs: ['did:example:holder'], + allVerifiableCredentials: presentation.verifiableCredential as OriginalVerifiableCredential[], + }) + await pex.selectVerifiableCredentialsForSubmission(definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation( + definition, + presentation.verifiableCredential as OriginalVerifiableCredential[], + presentationSignCallback, + {}, + ) + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + issuer: ResponseIss.SELF_ISSUED_V2, + responseTypesSupported: [ResponseType.ID_TOKEN], + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100316', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + createJwtCallback: getCreateJwtCallback({ + did: mockResEntity.did, + hexPrivateKey: mockResEntity.hexPrivateKey, + kid: `${mockResEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: `${mockResEntity.did}#controller`, alg: SigningAlgo.ES256K }, + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + vpTokenLocation: VPTokenLocation.ID_TOKEN, + presentationSubmission: await createPresentationSubmission([verifiablePresentationResult.verifiablePresentation], { + presentationDefinitions: [definition], + }), + }, + responseMode: ResponseMode.POST, + } + + const requestObject = await RequestObject.fromOpts(requestOpts) + /* console.log( + JSON.stringify(await AuthenticationResponse.createJWTFromRequestJWT(requestWithJWT.jwt, responseOpts, verifyOpts)) + );*/ + const jwt = await requestObject.toJwt() + if (!jwt) throw new Error('JWT is undefined') + const authorizationRequest = await AuthorizationResponse.fromRequestObject(jwt, responseOpts, verifyOpts) + await expect(authorizationRequest).toBeDefined() + }) + + it('succeed when valid JWT with PD is passed in for id_token', async () => { + const mockReqEntity = await mockedGetEnterpriseAuthToken('REQ COMPANY') + const mockResEntity = await mockedGetEnterpriseAuthToken('RES COMPANY') + const definition: IPresentationDefinition = { + id: 'Credentials', + input_descriptors: [ + { + id: 'ID Card Credential', + schema: [ + { + uri: 'https://www.w3.org/2018/credentials/examples/v1/IDCardCredential', + }, + ], + constraints: { + limit_disclosure: 'required', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + } + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + /*scope: 'test', + response_type: 'token_id', + redirect_uri: EXAMPLE_REDIRECT_URL, + claims: { + vp_token: { + presentation_definition: definition, + }, + },*/ + }, + requestObject: { + jwtIssuer: { method: 'did', didUrl: `${mockReqEntity.did}#controller`, alg: SigningAlgo.ES256K }, + passBy: PassBy.REFERENCE, + reference_uri: 'https://my-request.com/here', + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockReqEntity.hexPrivateKey, + did: mockReqEntity.did, + kid: `${mockReqEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: ResponseType.ID_TOKEN, + redirect_uri: EXAMPLE_REDIRECT_URL, + claims: { + vp_token: { + presentation_definition: definition, + }, + }, + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL, + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + const vc: ICredential = { + id: 'https://example.com/credentials/1872', + type: ['VerifiableCredential', 'IDCardCredential'], + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1/IDCardCredential'], + issuer: { + id: 'did:example:issuer', + }, + issuanceDate: '2010-01-01T19:23:24Z', + credentialSubject: { + given_name: 'Fredrik', + family_name: 'Stremberg', + birthdate: '1949-01-22', + }, + } + const presentation: IVerifiablePresentation = { + '@context': ['https://www.w3.org/2018/credentials/v1'], + presentation_submission: undefined, + type: ['verifiablePresentation'], + holder: 'did:example:holder', + verifiableCredential: [vc as IVerifiableCredential], + proof: undefined as any, + } + + const pex = new PresentationExchange({ + allDIDs: ['did:example:holder'], + allVerifiableCredentials: presentation.verifiableCredential as OriginalVerifiableCredential[], + }) + await pex.selectVerifiableCredentialsForSubmission(definition) + const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, + }) + const verifiablePresentationResult = await pex.createVerifiablePresentation( + definition, + presentation.verifiableCredential as OriginalVerifiableCredential[], + presentationSignCallback, + {}, + ) + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + issuer: ResponseIss.SELF_ISSUED_V2, + responseTypesSupported: [ResponseType.ID_TOKEN], + + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL, + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + createJwtCallback: getCreateJwtCallback({ + did: mockResEntity.did, + hexPrivateKey: mockResEntity.hexPrivateKey, + kid: `${mockResEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: `${mockResEntity.did}#controller`, alg: SigningAlgo.ES256K }, + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: await createPresentationSubmission([verifiablePresentationResult.verifiablePresentation], { + presentationDefinitions: [definition], + }), + vpTokenLocation: VPTokenLocation.ID_TOKEN, + }, + + responseMode: ResponseMode.POST, + } + + const requestObject = await RequestObject.fromOpts(requestOpts) + const jwt = await requestObject.toJwt() + if (!jwt) throw new Error('JWT is undefined') + const authResponse = AuthorizationResponse.fromRequestObject(jwt, responseOpts, verifyOpts) + await expect(authResponse).toBeDefined() + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.verify.spec.ts b/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.verify.spec.ts new file mode 100644 index 00000000..02573bca --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/AuthenticationResponse.verify.spec.ts @@ -0,0 +1,45 @@ +import { IDToken, VerifyAuthorizationResponseOpts } from '..' +import SIOPErrors from '../types/Errors' + +import { getVerifyJwtCallback } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' + +// const EXAMPLE_REDIRECT_URL = "https://acme.com/hello"; +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' + +const validButExpiredResJWT = + 'eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjoweDk3NTgzNmREM0Y1RTk4QzE5RjBmM2I4N0Y5OWFGMzA1MDAyNkREQzIjY29udHJvbGxlciIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE2MzIyNzE4MDMuMjEyLCJleHAiOjE2MzIyNzI0MDMuMjEyLCJpc3MiOiJodHRwczovL3NlbGYtaXNzdWVkLm1lL3YyIiwic3ViIjoiZGlkOmV0aHI6MHg5NzU4MzZkRDNGNUU5OEMxOUYwZjNiODdGOTlhRjMwNTAwMjZEREMyIiwiYXVkIjoiaHR0cHM6Ly9hY21lLmNvbS9oZWxsbyIsImRpZCI6ImRpZDpldGhyOjB4OTc1ODM2ZEQzRjVFOThDMTlGMGYzYjg3Rjk5YUYzMDUwMDI2RERDMiIsInN1Yl90eXBlIjoiZGlkIiwic3ViX2p3ayI6eyJraWQiOiJkaWQ6ZXRocjoweDk3NTgzNmREM0Y1RTk4QzE5RjBmM2I4N0Y5OWFGMzA1MDAyNkREQzIjY29udHJvbGxlciIsImt0eSI6IkVDIiwiY3J2Ijoic2VjcDI1NmsxIiwieCI6IkloUXVEek5BY1dvczVXeDd4U1NHMks2Zkp6MnBobU1nbUZ4UE1xaEU4XzgiLCJ5IjoiOTlreGpCMVgzaUtkRXZkbVFDbllqVm5PWEJyc2VwRGdlMFJrek1aUDN1TSJ9LCJzdGF0ZSI6ImQ2NzkzYjQ2YWIyMzdkMzczYWRkNzQwMCIsIm5vbmNlIjoiU1JXSzltSVpFd1F6S3dsZlZoMkE5SV9weUtBT0tnNDAtWDJqbk5aZEN0byIsInJlZ2lzdHJhdGlvbiI6eyJpc3N1ZXIiOiJodHRwczovL3NlbGYtaXNzdWVkLm1lL3YyIiwicmVzcG9uc2VfdHlwZXNfc3VwcG9ydGVkIjoiaWRfdG9rZW4iLCJhdXRob3JpemF0aW9uX2VuZHBvaW50Ijoib3BlbmlkOiIsInNjb3Blc19zdXBwb3J0ZWQiOiJvcGVuaWQiLCJpZF90b2tlbl9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2SyIsIkVkRFNBIl0sInJlcXVlc3Rfb2JqZWN0X3NpZ25pbmdfYWxnX3ZhbHVlc19zdXBwb3J0ZWQiOlsiRVMyNTZLIiwiRWREU0EiXSwic3ViamVjdF90eXBlc19zdXBwb3J0ZWQiOiJwYWlyd2lzZSJ9fQ.coLQr2hQuMwEfYUd3HdFt-ixhsaicc37cC9cwmQ2U5hfxRhAb871s9G1GAo3qhsa9v3t0G1bTX2J9WhLaC5J_Q' + +describe('verify JWT from Request JWT should', () => { + const verifyOpts: VerifyAuthorizationResponseOpts = { + correlationId: '1234', + audience: DID, + verifyJwtCallback: getVerifyJwtCallback(getResolver('ethr'), { + checkLinkedDomain: 'if_present', + }), + verification: {}, + } + + it('throw NO_JWT when no jwt is passed', async () => { + expect.assertions(1) + await expect(IDToken.verify(undefined as never, verifyOpts)).rejects.toThrow(SIOPErrors.NO_JWT) + }) + it('throw VERIFY_BAD_PARAMS when no verifyOpts is passed', async () => { + expect.assertions(1) + await expect(IDToken.verify(validButExpiredResJWT, undefined as never)).rejects.toThrow(SIOPErrors.VERIFY_BAD_PARAMS) + }) + + it('throw JWT_ERROR when expired but valid JWT is passed in', async () => { + expect.assertions(1) + await expect(IDToken.verify(validButExpiredResJWT, { ...verifyOpts, audience: 'https://acme.com/hello' })).rejects.toThrow( + /invalid_jwt: JWT has expired: exp: 1632272403/, + ) + }) + + it('throw JWT_ERROR when expired but valid JWT is passed in', async () => { + expect.assertions(1) + await expect(IDToken.verify(validButExpiredResJWT, { ...verifyOpts, audience: 'https://acme.com/hello' })).rejects.toThrow( + /invalid_jwt: JWT has expired: exp: 1632272403/, + ) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/DidJwtTestUtils.ts b/packages/siop-oid4vp/lib/__tests__/DidJwtTestUtils.ts new file mode 100644 index 00000000..c034c439 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/DidJwtTestUtils.ts @@ -0,0 +1,168 @@ +import { VerifyCallback } from '@sphereon/wellknown-dids-client' +import { createJWT, EdDSASigner, ES256KSigner, ES256Signer, hexToBytes, JWTOptions, JWTVerifyOptions, Signer, verifyJWT } from 'did-jwt' +import { Resolvable } from 'did-resolver' + +import { parseJWT } from '../helpers/jwtUtils' +import { DEFAULT_EXPIRATION_TIME, JwtPayload, ResponseIss, SigningAlgo, SIOPErrors, VerifiedJWT, VerifyJwtCallback } from '../types' +import { CreateJwtCallback } from '../types/JwtIssuer' + +import { getResolver } from './ResolverTestUtils' + +export async function verifyDidJWT(jwt: string, resolver: Resolvable, options: JWTVerifyOptions): Promise { + return verifyJWT(jwt, { ...options, resolver }) +} + +/** + * Creates a signed JWT given an address which becomes the issuer, a signer function, and a payload for which the withSignature is over. + * + * @example + * const signer = ES256KSigner(process.env.PRIVATE_KEY) + * createJWT({address: '5A8bRWU3F7j3REx3vkJ...', signer}, {key1: 'value', key2: ..., ... }).then(JWT => { + * ... + * }) + * + * @param {Object} payload payload object + * @param {Object} [options] an unsigned credential object + * @param {String} options.issuer The DID of the issuer (signer) of JWT + * @param {Signer} options.signer a `Signer` function, Please see `ES256KSigner` or `EdDSASigner` + * @param {boolean} options.canonicalize optional flag to canonicalize header and payload before signing + * @param {Object} header optional object to specify or customize the JWT header + * @return {Promise} a promise which resolves with a signed JSON Web Token or rejects with an error + */ +export async function createDidJWT( + payload: Partial, + { issuer, signer, expiresIn, canonicalize }: JWTOptions, + header: Partial, +): Promise { + return createJWT(payload, { issuer, signer, expiresIn, canonicalize }, header) +} +export interface InternalSignature { + hexPrivateKey: string // hex private key Only secp256k1 format + did: string + + alg: SigningAlgo + kid?: string // Optional: key identifier + + customJwtSigner?: Signer +} + +export function getAudience(jwt: string) { + const { payload } = parseJWT(jwt) + if (!payload) { + throw new Error(SIOPErrors.NO_AUDIENCE) + } else if (!payload.aud) { + return undefined + } else if (Array.isArray(payload.aud)) { + throw new Error(SIOPErrors.INVALID_AUDIENCE) + } + + return payload.aud +} + +export const internalSignature = (hexPrivateKey: string, did: string, didUrl: string, alg: SigningAlgo) => { + return getCreateJwtCallback({ + hexPrivateKey, + kid: didUrl, + alg, + did, + }) +} + +export function getCreateJwtCallback(signature: InternalSignature): CreateJwtCallback { + return (jwtIssuer, jwt) => { + if (jwtIssuer.method === 'did') { + const issuer = jwtIssuer.didUrl.split('#')[0] + if (!signature.kid) throw new Error('Missing kid') + return signDidJwtInternal(jwt.payload, issuer, signature.hexPrivateKey, signature.alg, signature.kid, signature.customJwtSigner) + } else if (jwtIssuer.method === 'custom') { + if (jwtIssuer.type === 'request-object') { + const did = signature.did + jwt.payload.iss = jwt.payload.iss ?? did + jwt.payload.sub = jwt.payload.sub ?? did + jwt.payload.client_id = jwt.payload.client_id ?? did + } + + if (!signature.kid) throw new Error('Missing kid') + if (jwtIssuer.type === 'id-token') { + if (!jwt.payload.sub) jwt.payload.sub = signature.did + + const issuer = jwtIssuer.authorizationResponseOpts.registration?.issuer || this._payload.iss + if (!issuer || !(issuer.includes(ResponseIss.SELF_ISSUED_V2) || issuer === this._payload.sub)) { + throw new Error(SIOPErrors.NO_SELF_ISSUED_ISS) + } + if (!jwt.payload.iss) { + jwt.payload.iss = issuer + } + return signDidJwtInternal(jwt.payload, issuer, signature.hexPrivateKey, signature.alg, signature.kid, signature.customJwtSigner) + } + + return signDidJwtInternal(jwt.payload, signature.did, signature.hexPrivateKey, signature.alg, signature.kid, signature.customJwtSigner) + } + throw new Error('Not implemented yet') + } +} + +export function getVerifyJwtCallback( + resolver?: Resolvable, + verifyOpts?: JWTVerifyOptions & { + checkLinkedDomain: 'never' | 'if_present' | 'always' + wellknownDIDVerifyCallback?: VerifyCallback + }, +): VerifyJwtCallback { + return async (jwtVerifier, jwt) => { + resolver = resolver ?? getResolver(['ethr', 'ion']) + const audience = + jwtVerifier.type === 'request-object' + ? verifyOpts?.audience ?? getAudience(jwt.raw) + : jwtVerifier.type === 'id-token' + ? verifyOpts?.audience ?? getAudience(jwt.raw) + : undefined + + await verifyDidJWT(jwt.raw, resolver, { audience, ...verifyOpts }) + // we can always because the verifyDidJWT will throw an error if the JWT is invalid + return true + } +} + +async function signDidJwtInternal( + payload: JwtPayload, + issuer: string, + hexPrivateKey: string, + alg: SigningAlgo, + kid: string, + customJwtSigner?: Signer, +): Promise { + const signer = determineSigner(alg, hexPrivateKey, customJwtSigner) + const header = { + alg, + kid, + } + const options = { + issuer, + signer, + expiresIn: DEFAULT_EXPIRATION_TIME, + } + + return await createDidJWT({ ...payload }, options, header) +} + +const determineSigner = (alg: SigningAlgo, hexPrivateKey?: string, customSigner?: Signer): Signer => { + if (customSigner) { + return customSigner + } else if (!hexPrivateKey) { + throw new Error('no private key provided') + } + const privateKey = hexToBytes(hexPrivateKey.replace('0x', '')) + switch (alg) { + case SigningAlgo.EDDSA: + return EdDSASigner(privateKey) + case SigningAlgo.ES256: + return ES256Signer(privateKey) + case SigningAlgo.ES256K: + return ES256KSigner(privateKey) + case SigningAlgo.PS256: + throw Error('PS256 is not supported yet. Please provide a custom signer') + case SigningAlgo.RS256: + throw Error('RS256 is not supported yet. Please provide a custom signer') + } +} diff --git a/packages/siop-oid4vp/lib/__tests__/DocumentLoader.ts b/packages/siop-oid4vp/lib/__tests__/DocumentLoader.ts new file mode 100644 index 00000000..225daf24 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/DocumentLoader.ts @@ -0,0 +1,48 @@ +import { extendContextLoader } from '@digitalcredentials/jsonld-signatures' +import vc from '@digitalcredentials/vc' +import fetch from 'cross-fetch' + +export class DocumentLoader { + getLoader() { + return extendContextLoader(async (url: string) => { + if (url === 'https://identity.foundation/.well-known/did-configuration/v1') { + // Not sure what is happening, but this URL is failing in Github. Probably, cloudflare getting in the way, which might have impact in production settings to + return { + document: { + documentUrl: url, + '@context': [ + { + '@version': 1.1, + '@protected': true, + LinkedDomains: 'https://identity.foundation/.well-known/resources/did-configuration/#LinkedDomains', + DomainLinkageCredential: 'https://identity.foundation/.well-known/resources/did-configuration/#DomainLinkageCredential', + origin: 'https://identity.foundation/.well-known/resources/did-configuration/#origin', + linked_dids: 'https://identity.foundation/.well-known/resources/did-configuration/#linked_dids', + }, + ], + }, + } + } + try { + const response = await fetch(url) + if (response.status >= 200 && response.status < 300) { + const document = await response.json() + return { + contextUrl: null, + documentUrl: url, + document, + } + } else { + console.log(`ERROR: ${url}`) + console.log(`url: ${url}, status: ${response.status}: ${response.statusText}`) + console.log(`response: ${await response.text()}`) + } + } catch (error) { + console.log(`ERROR:::::::: ${url}: ${JSON.stringify(error.message)}`) + } + + const { nodeDocumentLoader } = vc + return nodeDocumentLoader(url) + }) + } +} diff --git a/packages/siop-oid4vp/lib/__tests__/HttpUtils.fetch.spec.ts b/packages/siop-oid4vp/lib/__tests__/HttpUtils.fetch.spec.ts new file mode 100644 index 00000000..681b9821 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/HttpUtils.fetch.spec.ts @@ -0,0 +1,40 @@ +import nock from 'nock' + +import { post } from '..' + +const URL = 'https://example.com' +nock(URL) + .post('/404', { iss: 'mock' }, { reqheaders: { Authorization: 'Bearer bearerToken' } }) + .reply(404, 'Not found') +nock(URL) + .post('/200', { iss: 'mock' }, { reqheaders: { Authorization: 'Bearer bearerToken' } }) + .reply(200, '{"status": "ok"}') +nock(URL) + .post('/201', { iss: 'mock' }, { reqheaders: { Authorization: 'Bearer bearerToken' } }) + .reply(201, '{"status": "ok"}') + +describe('HttpUtils should', () => { + it('have an error body when response is not 200 or 201', async () => { + expect.assertions(1) + await expect( + post(`${URL}/404`, JSON.stringify({ iss: 'mock' }), { bearerToken: 'bearerToken' }).then((value) => value.errorBody), + ).resolves.toMatch('Not found') + }) + + it('return response when response HTTP status is 200', async () => { + expect.assertions(1) + await expect( + post(`${URL}/200`, JSON.stringify({ iss: 'mock' }), { bearerToken: 'bearerToken' }).then((value) => value.successBody), + ).resolves.toMatchObject({ + status: 'ok', + }) + }) + it('return response when response HTTP status is 201', async () => { + expect.assertions(1) + await expect( + post(`${URL}/201`, JSON.stringify({ iss: 'mock' }), { bearerToken: 'bearerToken' }).then((value) => value.successBody), + ).resolves.toMatchObject({ + status: 'ok', + }) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/IT.spec.ts b/packages/siop-oid4vp/lib/__tests__/IT.spec.ts new file mode 100644 index 00000000..3c28184d --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/IT.spec.ts @@ -0,0 +1,1833 @@ +import { EventEmitter } from 'events' + +import { IPresentationDefinition } from '@sphereon/pex' +import { CredentialMapper, IPresentation, IProofType, IVerifiableCredential, W3CVerifiablePresentation } from '@sphereon/ssi-types' +import nock from 'nock' + +import { InMemoryRPSessionManager } from '..' +import { + OP, + PassBy, + PresentationDefinitionWithLocation, + PresentationExchange, + PresentationSignCallback, + PresentationVerificationCallback, + PropertyTarget, + ResponseIss, + ResponseType, + RevocationStatus, + RevocationVerification, + RP, + Scope, + SigningAlgo, + SubjectType, + SupportedVersion, + verifyRevocation, + VPTokenLocation, +} from '../' +import { checkSIOPSpecVersionSupported } from '../helpers/SIOPSpecVersion' + +import { getVerifyJwtCallback, internalSignature } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { mockedGetEnterpriseAuthToken, WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + UNIT_TEST_TIMEOUT, + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +jest.setTimeout(30000) + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' + +const HOLDER_DID = 'did:example:ebfeb1f712ebc6f1c276e12ec21' + +const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, +}) + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const presentationVerificationCallback: PresentationVerificationCallback = async (_args: W3CVerifiablePresentation) => ({ + verified: true, +}) + +function getPresentationDefinition(): IPresentationDefinition { + return { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + { + uri: 'https://www.w3.org/2018/credentials/v1', + }, + ], + constraints: { + limit_disclosure: 'preferred', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + } +} + +function getVCs(): IVerifiableCredential[] { + const vcs: IVerifiableCredential[] = [ + { + identifier: '83627465', + name: 'Permanent Resident Card', + type: ['PermanentResidentCard', 'VerifiableCredential'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465dsdsdsd', + credentialSubject: { + birthCountry: 'Bahamas', + id: 'did:example:b34ca6cd37bbf23', + type: ['PermanentResident', 'Person'], + gender: 'Female', + familyName: 'SMITH', + givenName: 'JANE', + residentSince: '2015-01-01', + lprNumber: '999-999-999', + birthDate: '1958-07-17', + commuterClassification: 'C1', + lprCategory: 'C09', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + }, + expirationDate: '2029-12-03T12:19:52Z', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://w3id.org/citizenship/v1', 'https://w3id.org/security/suites/ed25519-2020/v1'], + issuer: 'did:key:z6MkhfRoL9n7ko9d6LnB5jLB4aejd3ir2q6E2xkuzKUYESig', + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + nonce: '6i3dTz5yFfWJ8zgsamuyZa4yAHPm75tUOOXddR6krCvCYk77sbCOuEVcdBCDd/l6tIY=', + }, + }, + ] + vcs[0]['@context'] = ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'] + vcs[0]['issuer'] = { + id: 'did:example:issuer', + } + return vcs +} + +describe('RP and OP interaction should', () => { + it( + 'succeed when calling each other in the full flow', + async () => { + // expect.assertions(1); + const rpMockEntity = await mockedGetEnterpriseAuthToken('ACME RP') + const opMockEntity = await mockedGetEnterpriseAuthToken('ACME OP') + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver(['ethr']) + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.REFERENCE, EXAMPLE_REFERENCE_URL) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, `${rpMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100317', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, `${opMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + //FIXME: Move payload options to seperate property + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100318', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f' }, + }) + + nock('https://rp.acme.com').get('/siop/jwts').times(3).reply(200, requestURI.requestObjectJwt) + + if (!op.verifyRequestOptions.supportedVersions) throw new Error('Supported versions not set') + await checkSIOPSpecVersionSupported(requestURI.authorizationRequestPayload, op.verifyRequestOptions.supportedVersions) + // The create method also calls the verifyRequest method, so no need to do it manually + const verifiedRequest = await op.verifyAuthorizationRequest(requestURI.encodedUri) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedRequest, {}) + + nock(EXAMPLE_REDIRECT_URL).post(/.*/).times(3).reply(200, { result: 'ok' }) + const response = await op.submitAuthorizationResponse(authenticationResponseWithJWT) + await expect(response.json()).resolves.toMatchObject({ result: 'ok' }) + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + // audience: EXAMPLE_REDIRECT_URL, + }) + + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }, + UNIT_TEST_TIMEOUT, + ) + + it('succeed when calling optional steps in the full flow', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100319', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100320', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f' }, + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + + if (!op.verifyRequestOptions.supportedVersions) throw new Error('Supported versions not set') + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt, { correlationId: '1234' }) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, {}) + expect(authenticationResponseWithJWT).toBeDefined() + expect(authenticationResponseWithJWT.correlationId).toEqual('1234') + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + /*audience: EXAMPLE_REDIRECT_URL,*/ + }) + + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('fail when calling with presentation definitions and without verifiable presentation', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(WELL_KNOWN_OPENID_FEDERATION) + .withScope('test') + .withResponseType([ResponseType.ID_TOKEN, ResponseType.VP_TOKEN]) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withClientMetadata({ + client_id: rpMockEntity.did, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN, ResponseType.VP_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100321', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100321', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f' }, + }) + + //The schema validation needs to be done here otherwise it fails because of JWT properties + if (!op.verifyRequestOptions.supportedVersions) throw new Error('Supported versions not set') + await checkSIOPSpecVersionSupported(requestURI.authorizationRequestPayload, op.verifyRequestOptions.supportedVersions) + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + await expect(op.createAuthorizationResponse(verifiedAuthReqWithJWT, {})).rejects.toThrow( + Error('authentication request expects a verifiable presentation in the response'), + ) + + expect(verifiedAuthReqWithJWT.payload?.['registration'].client_name).toEqual(VERIFIER_NAME_FOR_CLIENT) + expect(verifiedAuthReqWithJWT.payload?.['registration']['client_name#nl-NL']).toEqual(VERIFIER_NAME_FOR_CLIENT_NL + '2022100321') + }) + + it('succeed when calling with presentation definitions and right verifiable presentation', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType([ResponseType.ID_TOKEN, ResponseType.VP_TOKEN]) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100322', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN, ResponseType.VP_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100323', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Supported versions not set') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + presentationSubmission: verifiablePresentationResult.presentationSubmission, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + }, + ],*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + /*audience: EXAMPLE_REDIRECT_URL,*/ + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + }) + + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('succeed when calling with RevocationVerification.ALWAYS with ldp_vp', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType([ResponseType.VP_TOKEN, ResponseType.ID_TOKEN]) + .withRevocationVerification(RevocationVerification.ALWAYS) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerificationCallback(async () => { + return { status: RevocationStatus.VALID } + }) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100330', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withPresentationSignCallback(presentationSignCallback) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100331', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + if (!op.verifyRequestOptions.supportedVersions) throw new Error('Supported versions not set') + await checkSIOPSpecVersionSupported(requestURI.authorizationRequestPayload, op.verifyRequestOptions.supportedVersions) + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) //, rp.authRequestOpts + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + }, + ],*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const DID_CONFIGURATION = { + '@context': 'https://identity.foundation/.well-known/did-configuration/v1', + linked_dids: [ + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwibmJmIjoxNjA3MTEyNzM5LCJzdWIiOiJkaWQ6a2V5Ono2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9pZGVudGl0eS5mb3VuZGF0aW9uLy53ZWxsLWtub3duL2RpZC1jb25maWd1cmF0aW9uL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rb1RIc2dOTnJieThKekNOUTFpUkx5VzVRUTZSOFh1dTZBQThpZ0dyTVZQVU0iLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRvbWFpbkxpbmthZ2VDcmVkZW50aWFsIl19fQ.YZnpPMAW3GdaPXC2YKoJ7Igt1OaVZKq09XZBkptyhxTAyHTkX2Ewtew-JKHKQjyDyabY3HAy1LUPoIQX0jrU0J82pIYT3k2o7nNTdLbxlgb49FcDn4czntt5SbY0m1XwrMaKEvV0bHQsYPxNTqjYsyySccgPfmvN9IT8gRS-M9a6MZQxuB3oEMrVOQ5Vco0bvTODXAdCTHibAk1FlvKz0r1vO5QMhtW4OlRrVTI7ibquf9Nim_ch0KeMMThFjsBDKetuDF71nUcL5sf7PCFErvl8ZVw3UK4NkZ6iM-XIRsLL6rXP2SnDUVovcldhxd_pyKEYviMHBOgBdoNP6fOgRQ', + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6b3RoZXIiLCJuYmYiOjE2MDcxMTI3MzksInN1YiI6ImRpZDprZXk6b3RoZXIiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vaWRlbnRpdHkuZm91bmRhdGlvbi8ud2VsbC1rbm93bi9kaWQtY29uZmlndXJhdGlvbi92MSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6b3RoZXIiLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6b3RoZXIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRG9tYWluTGlua2FnZUNyZWRlbnRpYWwiXX19.rRuc-ojuEgyq8p_tBYK7BayuiNTBeXNyAnC14Rnjs-jsnhae4_E1Q12W99K2NGCGBi5KjNsBcZmdNJPxejiKPrjjcB99poFCgTY8tuRzDjVo0lIeBwfx9qqjKHTRTUR8FGM_imlOpVfBF4AHYxjkHvZn6c9lYvatYcDpB2UfH4BNXkdSVrUXy_kYjpMpAdRtyCAnD_isN1YpEHBqBmnfuVUbYcQK5kk6eiokRFDtWruL1OEeJMYPqjuBSd2m-H54tSM84Oic_pg2zXDjjBlXNelat6MPNT2QxmkwJg7oyewQWX2Ot2yyhSp9WyAQWMlQIe2x84R0lADUmZ1TPQchNw', + ], + } + nock('https://ldtest.sphereon.com').get('/.well-known/did-configuration.json').times(3).reply(200, DID_CONFIGURATION) + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + // audience: EXAMPLE_REDIRECT_URL, + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it( + 'should succeed when calling with CheckLinkedDomain.IF_PRESENT', + async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType([ResponseType.ID_TOKEN, ResponseType.VP_TOKEN]) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'if_present' })) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100328', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [ + PropertyTarget.REQUEST_OBJECT, + PropertyTarget.AUTHORIZATION_REQUEST, + ]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + + .withExpiresIn(1000) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'never' })) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100329', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + }, + ],*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + // audience: EXAMPLE_REDIRECT_URL, + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }, + UNIT_TEST_TIMEOUT, + ) + + it('succeed when calling with RevocationVerification.ALWAYS with ldp_vp', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType([ResponseType.VP_TOKEN, ResponseType.ID_TOKEN]) + .withRevocationVerification(RevocationVerification.ALWAYS) + .withPresentationVerification(presentationVerificationCallback) + + .withRevocationVerificationCallback(async () => { + return { status: RevocationStatus.VALID } + }) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100330', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withPresentationSignCallback(presentationSignCallback) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100331', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + if (!op.verifyRequestOptions.supportedVersions) throw new Error('Supported versions not set') + await checkSIOPSpecVersionSupported(requestURI.authorizationRequestPayload, op.verifyRequestOptions.supportedVersions) + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) //, rp.authRequestOpts + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + }, + ],*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const DID_CONFIGURATION = { + '@context': 'https://identity.foundation/.well-known/did-configuration/v1', + linked_dids: [ + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwibmJmIjoxNjA3MTEyNzM5LCJzdWIiOiJkaWQ6a2V5Ono2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9pZGVudGl0eS5mb3VuZGF0aW9uLy53ZWxsLWtub3duL2RpZC1jb25maWd1cmF0aW9uL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rb1RIc2dOTnJieThKekNOUTFpUkx5VzVRUTZSOFh1dTZBQThpZ0dyTVZQVU0iLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRvbWFpbkxpbmthZ2VDcmVkZW50aWFsIl19fQ.YZnpPMAW3GdaPXC2YKoJ7Igt1OaVZKq09XZBkptyhxTAyHTkX2Ewtew-JKHKQjyDyabY3HAy1LUPoIQX0jrU0J82pIYT3k2o7nNTdLbxlgb49FcDn4czntt5SbY0m1XwrMaKEvV0bHQsYPxNTqjYsyySccgPfmvN9IT8gRS-M9a6MZQxuB3oEMrVOQ5Vco0bvTODXAdCTHibAk1FlvKz0r1vO5QMhtW4OlRrVTI7ibquf9Nim_ch0KeMMThFjsBDKetuDF71nUcL5sf7PCFErvl8ZVw3UK4NkZ6iM-XIRsLL6rXP2SnDUVovcldhxd_pyKEYviMHBOgBdoNP6fOgRQ', + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6b3RoZXIiLCJuYmYiOjE2MDcxMTI3MzksInN1YiI6ImRpZDprZXk6b3RoZXIiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vaWRlbnRpdHkuZm91bmRhdGlvbi8ud2VsbC1rbm93bi9kaWQtY29uZmlndXJhdGlvbi92MSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6b3RoZXIiLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6b3RoZXIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRG9tYWluTGlua2FnZUNyZWRlbnRpYWwiXX19.rRuc-ojuEgyq8p_tBYK7BayuiNTBeXNyAnC14Rnjs-jsnhae4_E1Q12W99K2NGCGBi5KjNsBcZmdNJPxejiKPrjjcB99poFCgTY8tuRzDjVo0lIeBwfx9qqjKHTRTUR8FGM_imlOpVfBF4AHYxjkHvZn6c9lYvatYcDpB2UfH4BNXkdSVrUXy_kYjpMpAdRtyCAnD_isN1YpEHBqBmnfuVUbYcQK5kk6eiokRFDtWruL1OEeJMYPqjuBSd2m-H54tSM84Oic_pg2zXDjjBlXNelat6MPNT2QxmkwJg7oyewQWX2Ot2yyhSp9WyAQWMlQIe2x84R0lADUmZ1TPQchNw', + ], + } + nock('https://ldtest.sphereon.com').get('/.well-known/did-configuration.json').times(3).reply(200, DID_CONFIGURATION) + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + // audience: EXAMPLE_REDIRECT_URL, + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('succeed when calling with CheckLinkedDomain.ALWAYS', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType([ResponseType.ID_TOKEN, ResponseType.VP_TOKEN]) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'always' })) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100326', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'always' })) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100327', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + }, + ],*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + + const DID_CONFIGURATION = { + '@context': 'https://identity.foundation/.well-known/did-configuration/v1', + linked_dids: [ + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwibmJmIjoxNjA3MTEyNzM5LCJzdWIiOiJkaWQ6a2V5Ono2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9pZGVudGl0eS5mb3VuZGF0aW9uLy53ZWxsLWtub3duL2RpZC1jb25maWd1cmF0aW9uL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rb1RIc2dOTnJieThKekNOUTFpUkx5VzVRUTZSOFh1dTZBQThpZ0dyTVZQVU0iLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRvbWFpbkxpbmthZ2VDcmVkZW50aWFsIl19fQ.YZnpPMAW3GdaPXC2YKoJ7Igt1OaVZKq09XZBkptyhxTAyHTkX2Ewtew-JKHKQjyDyabY3HAy1LUPoIQX0jrU0J82pIYT3k2o7nNTdLbxlgb49FcDn4czntt5SbY0m1XwrMaKEvV0bHQsYPxNTqjYsyySccgPfmvN9IT8gRS-M9a6MZQxuB3oEMrVOQ5Vco0bvTODXAdCTHibAk1FlvKz0r1vO5QMhtW4OlRrVTI7ibquf9Nim_ch0KeMMThFjsBDKetuDF71nUcL5sf7PCFErvl8ZVw3UK4NkZ6iM-XIRsLL6rXP2SnDUVovcldhxd_pyKEYviMHBOgBdoNP6fOgRQ', + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6b3RoZXIiLCJuYmYiOjE2MDcxMTI3MzksInN1YiI6ImRpZDprZXk6b3RoZXIiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vaWRlbnRpdHkuZm91bmRhdGlvbi8ud2VsbC1rbm93bi9kaWQtY29uZmlndXJhdGlvbi92MSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6b3RoZXIiLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6b3RoZXIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRG9tYWluTGlua2FnZUNyZWRlbnRpYWwiXX19.rRuc-ojuEgyq8p_tBYK7BayuiNTBeXNyAnC14Rnjs-jsnhae4_E1Q12W99K2NGCGBi5KjNsBcZmdNJPxejiKPrjjcB99poFCgTY8tuRzDjVo0lIeBwfx9qqjKHTRTUR8FGM_imlOpVfBF4AHYxjkHvZn6c9lYvatYcDpB2UfH4BNXkdSVrUXy_kYjpMpAdRtyCAnD_isN1YpEHBqBmnfuVUbYcQK5kk6eiokRFDtWruL1OEeJMYPqjuBSd2m-H54tSM84Oic_pg2zXDjjBlXNelat6MPNT2QxmkwJg7oyewQWX2Ot2yyhSp9WyAQWMlQIe2x84R0lADUmZ1TPQchNw', + ], + } + nock('https://ldtest.sphereon.com').get('/.well-known/did-configuration.json').times(3).reply(200, DID_CONFIGURATION) + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + // audience: EXAMPLE_REDIRECT_URL, + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('should verify revocation ldp_vp with RevocationVerification.ALWAYS', async () => { + const presentation = { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://identity.foundation/presentation-exchange/submission/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + presentation_submission: { + id: 'K7Zu3C6yJv3TGXYCB3B3n', + definition_id: 'Insurance Plans', + descriptor_map: [ + { + id: 'Ontario Health Insurance Plan', + format: 'ldp_vc', + path: '$.verifiableCredential[0]', + }, + ], + }, + verifiableCredential: [ + { + identifier: '83627465', + name: 'Permanent Resident Card', + type: ['PermanentResidentCard', 'VerifiableCredential'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465dsdsdsd', + credentialSubject: { + birthCountry: 'Bahamas', + id: 'did:example:b34ca6cd37bbf23', + type: ['PermanentResident', 'Person'], + gender: 'Female', + familyName: 'SMITH', + givenName: 'JANE', + residentSince: '2015-01-01', + lprNumber: '999-999-999', + birthDate: '1958-07-17', + commuterClassification: 'C1', + lprCategory: 'C09', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + }, + expirationDate: '2029-12-03T12:19:52Z', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'], + issuer: { + id: 'did:example:issuer', + }, + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + nonce: '6i3dTz5yFfWJ8zgsamuyZa4yAHPm75tUOOXddR6krCvCYk77sbCOuEVcdBCDd/l6tIY=', + }, + }, + ], + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + nonce: '6i3dTz5yFfWJ8zgsamuyZa4yAHPm75tUOOXddR6krCvCYk77sbCOuEVcdBCDd/l6tIY=', + }, + } + + await expect( + verifyRevocation( + CredentialMapper.toWrappedVerifiablePresentation(presentation), + async () => { + return { status: RevocationStatus.VALID } + }, + RevocationVerification.ALWAYS, + ), + ).resolves.not.toThrow() + }) + + it('should verify revocation ldp_vp with RevocationVerification.IF_PRESENT', async () => { + const presentation = { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://identity.foundation/presentation-exchange/submission/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + presentation_submission: { + id: 'K7Zu3C6yJv3TGXYCB3B3n', + definition_id: 'Insurance Plans', + descriptor_map: [ + { + id: 'Ontario Health Insurance Plan', + format: 'ldp_vc', + path: '$.verifiableCredential[0]', + }, + ], + }, + verifiableCredential: [ + { + identifier: '83627465', + name: 'Permanent Resident Card', + type: ['PermanentResidentCard', 'VerifiableCredential'], + id: 'https://issuer.oidp.uscis.gov/credentials/83627465dsdsdsd', + credentialSubject: { + birthCountry: 'Bahamas', + id: 'did:example:b34ca6cd37bbf23', + type: ['PermanentResident', 'Person'], + gender: 'Female', + familyName: 'SMITH', + givenName: 'JANE', + residentSince: '2015-01-01', + lprNumber: '999-999-999', + birthDate: '1958-07-17', + commuterClassification: 'C1', + lprCategory: 'C09', + image: 'data:image/png;base64,iVBORw0KGgokJggg==', + }, + credentialStatus: { + id: 'https://example.com/credentials/status/3#94567', + type: 'StatusList2021Entry', + statusPurpose: 'revocation', + statusListIndex: '94567', + statusListCredential: 'https://example.com/credentials/status/3', + }, + expirationDate: '2029-12-03T12:19:52Z', + description: 'Government of Example Permanent Resident Card.', + issuanceDate: '2019-12-03T12:19:52Z', + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'], + issuer: { + id: 'did:example:issuer', + }, + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + nonce: '6i3dTz5yFfWJ8zgsamuyZa4yAHPm75tUOOXddR6krCvCYk77sbCOuEVcdBCDd/l6tIY=', + }, + }, + ], + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + nonce: '6i3dTz5yFfWJ8zgsamuyZa4yAHPm75tUOOXddR6krCvCYk77sbCOuEVcdBCDd/l6tIY=', + }, + } + + await expect( + verifyRevocation( + CredentialMapper.toWrappedVerifiablePresentation(presentation), + async () => { + return { status: RevocationStatus.VALID } + }, + RevocationVerification.ALWAYS, + ), + ).resolves.not.toThrow() + }) + + it('should verify revocation ldp_vp with location id_token', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => ({ verified: true }) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + // expect(parsedAuthReqURI.registration).toBeDefined(); + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('Request object JWT not found') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.ID_TOKEN, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.ID_TOKEN + } + ]*/ + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + audience: 'test_client_id', + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('succeed with nonce verification with ldp_vp', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRevocationVerification(RevocationVerification.NEVER) + .withPresentationVerification(presentationVerificationCallback) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100330', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withPresentationSignCallback(presentationSignCallback) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100331', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('No requestObjectJwt') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: getVCs() }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, {}) + + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + vpTokenLocation: VPTokenLocation.ID_TOKEN, + /*credentialsAndDefinitions: [ + { + presentation: vp, + format: VerifiablePresentationTypeFormat.LDP_VP, + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE + } + ]*/ + }, + }) + + const DID_CONFIGURATION = { + '@context': 'https://identity.foundation/.well-known/did-configuration/v1', + linked_dids: [ + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwibmJmIjoxNjA3MTEyNzM5LCJzdWIiOiJkaWQ6a2V5Ono2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9pZGVudGl0eS5mb3VuZGF0aW9uLy53ZWxsLWtub3duL2RpZC1jb25maWd1cmF0aW9uL3YxIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rb1RIc2dOTnJieThKekNOUTFpUkx5VzVRUTZSOFh1dTZBQThpZ0dyTVZQVU0iLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIkRvbWFpbkxpbmthZ2VDcmVkZW50aWFsIl19fQ.YZnpPMAW3GdaPXC2YKoJ7Igt1OaVZKq09XZBkptyhxTAyHTkX2Ewtew-JKHKQjyDyabY3HAy1LUPoIQX0jrU0J82pIYT3k2o7nNTdLbxlgb49FcDn4czntt5SbY0m1XwrMaKEvV0bHQsYPxNTqjYsyySccgPfmvN9IT8gRS-M9a6MZQxuB3oEMrVOQ5Vco0bvTODXAdCTHibAk1FlvKz0r1vO5QMhtW4OlRrVTI7ibquf9Nim_ch0KeMMThFjsBDKetuDF71nUcL5sf7PCFErvl8ZVw3UK4NkZ6iM-XIRsLL6rXP2SnDUVovcldhxd_pyKEYviMHBOgBdoNP6fOgRQ', + 'eyJhbGciOiJSUzI1NiIsImtpZCI6ImRpZDprZXk6ejZNa29USHNnTk5yYnk4SnpDTlExaVJMeVc1UVE2UjhYdXU2QUE4aWdHck1WUFVNI3o2TWtvVEhzZ05OcmJ5OEp6Q05RMWlSTHlXNVFRNlI4WHV1NkFBOGlnR3JNVlBVTSJ9.eyJleHAiOjE3NjQ4NzkxMzksImlzcyI6ImRpZDprZXk6b3RoZXIiLCJuYmYiOjE2MDcxMTI3MzksInN1YiI6ImRpZDprZXk6b3RoZXIiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vaWRlbnRpdHkuZm91bmRhdGlvbi8ud2VsbC1rbm93bi9kaWQtY29uZmlndXJhdGlvbi92MSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDprZXk6b3RoZXIiLCJvcmlnaW4iOiJodHRwczovL2lkZW50aXR5LmZvdW5kYXRpb24ifSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI1LTEyLTA0VDE0OjEyOjE5LTA2OjAwIiwiaXNzdWFuY2VEYXRlIjoiMjAyMC0xMi0wNFQxNDoxMjoxOS0wNjowMCIsImlzc3VlciI6ImRpZDprZXk6b3RoZXIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRG9tYWluTGlua2FnZUNyZWRlbnRpYWwiXX19.rRuc-ojuEgyq8p_tBYK7BayuiNTBeXNyAnC14Rnjs-jsnhae4_E1Q12W99K2NGCGBi5KjNsBcZmdNJPxejiKPrjjcB99poFCgTY8tuRzDjVo0lIeBwfx9qqjKHTRTUR8FGM_imlOpVfBF4AHYxjkHvZn6c9lYvatYcDpB2UfH4BNXkdSVrUXy_kYjpMpAdRtyCAnD_isN1YpEHBqBmnfuVUbYcQK5kk6eiokRFDtWruL1OEeJMYPqjuBSd2m-H54tSM84Oic_pg2zXDjjBlXNelat6MPNT2QxmkwJg7oyewQWX2Ot2yyhSp9WyAQWMlQIe2x84R0lADUmZ1TPQchNw', + ], + } + nock('https://ldtest.sphereon.com').get('/.well-known/did-configuration.json').times(3).reply(200, DID_CONFIGURATION) + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + audience: 'test_client_id', + }) + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('should register authorization request on create', async () => { + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + const eventEmitter = new EventEmitter() + const replayRegistry = new InMemoryRPSessionManager(eventEmitter) + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRevocationVerification(RevocationVerification.NEVER) + .withPresentationVerification(presentationVerificationCallback) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.ES256K], + requestObjectSigningAlgValuesSupported: [SigningAlgo.ES256K], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA] }, + jwt_vp: { alg: [SigningAlgo.EDDSA] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp_vp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + ldp: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ion'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100330', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withPresentationDefinition({ definition: getPresentationDefinition() }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .withSessionManager(replayRegistry) + .withEventEmitter(eventEmitter) + .build() + + await rp.createAuthorizationRequest({ + correlationId: '1234', + nonce: { propertyValue: 'bcceb347-1374-49b8-ace0-b868162c122d', targets: PropertyTarget.REQUEST_OBJECT }, + state: { propertyValue: '8006b5fb-6e3b-42d1-a2be-55ed2a08073d', targets: PropertyTarget.REQUEST_OBJECT }, + claims: { + propertyValue: { + vp_token: { + presentation_definition: { + input_descriptors: [ + { + schema: [ + { + uri: 'https://VerifiedEmployee', + }, + ], + purpose: 'We need to verify that you have a valid VerifiedEmployee Verifiable Credential.', + name: 'VerifiedEmployeeVC', + id: 'VerifiedEmployeeVC', + }, + ], + id: '8006b5fb-6e3b-42d1-a2be-55ed2a08073d', + }, + }, + }, + targets: PropertyTarget.REQUEST_OBJECT, + }, + }) + + const state = await replayRegistry.getRequestStateByCorrelationId('1234', true) + expect(state?.status).toBe('created') + }) + + it('should register authorization request on create with uri', async () => { + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + const eventEmitter = new EventEmitter() + const replayRegistry = new InMemoryRPSessionManager(eventEmitter) + + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(WELL_KNOWN_OPENID_FEDERATION) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.REFERENCE, EXAMPLE_REFERENCE_URL) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100317', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .withSessionManager(replayRegistry) + .withEventEmitter(eventEmitter) + .build() + + await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f' }, + }) + + const state = await replayRegistry.getRequestStateByCorrelationId('1234') + expect(state?.status).toBe('created') + }) + + it('should register authorization response on successful verification', async () => { + await nock.cleanAll() + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + const eventEmitter = new EventEmitter() + const replayRegistry = new InMemoryRPSessionManager(eventEmitter) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.REFERENCE, EXAMPLE_REFERENCE_URL) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100317', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .withEventEmitter(eventEmitter) + .withSessionManager(replayRegistry) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, opMockEntity.didKey, SigningAlgo.ES256K)) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + //FIXME: Move payload options to seperate property + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100318', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '12345', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f1' }, + }) + const reqStateCreated = await replayRegistry.getRequestStateByState('b32f0087fc9816eb813fd11f1', true) + expect(reqStateCreated?.status).toBe('created') + nock('https://rp.acme.com').get('/siop/jwts').times(3).reply(200, requestURI.requestObjectJwt) + const verifiedRequest = await op.verifyAuthorizationRequest(requestURI.encodedUri) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedRequest, {}) + nock(EXAMPLE_REDIRECT_URL).post(/.*/).times(3).reply(200, { result: 'ok' }) + await op.submitAuthorizationResponse(authenticationResponseWithJWT) + await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + // audience: EXAMPLE_REDIRECT_URL, + }) + const reqStateAfterResponse = await replayRegistry.getRequestStateByState('incorrect', false) + expect(reqStateAfterResponse).toBeUndefined() + + const resStateAfterResponse = await replayRegistry.getResponseStateByState('b32f0087fc9816eb813fd11f1', true) + expect(resStateAfterResponse?.status).toBe('verified') + }) + + it('should set error status on failed authorization response verification', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + const eventEmitter = new EventEmitter() + const replayRegistry = new InMemoryRPSessionManager(eventEmitter) + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.REFERENCE, EXAMPLE_REFERENCE_URL) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, rpMockEntity.didKey, SigningAlgo.ES256K)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100317', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .withSessionManager(replayRegistry) + .withEventEmitter(eventEmitter) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, `${opMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + //FIXME: Move payload options to seperate property + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100318', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: { propertyValue: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg' }, + state: { propertyValue: 'b32f0087fc9816eb813fd11f' }, + }) + const state = await replayRegistry.getRequestStateByCorrelationId('1234', true) + expect(state?.status).toBe('created') + + nock('https://rp.acme.com').get('/siop/jwts').times(3).reply(200, requestURI.requestObjectJwt) + const verifiedRequest = await op.verifyAuthorizationRequest(requestURI.encodedUri) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedRequest, {}) + nock(EXAMPLE_REDIRECT_URL).post(/.*/).reply(200, { result: 'ok' }) + await op.submitAuthorizationResponse(authenticationResponseWithJWT) + authenticationResponseWithJWT.response.payload.state = 'wrong_value' + await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { correlationId: '1234' }).catch(() => { + //swallow this exception; + }) + const reqState = await replayRegistry.getRequestStateByCorrelationId('1234', true) + expect(reqState?.status).toBe('created') + + const resState = await replayRegistry.getResponseStateByCorrelationId('1234', true) + expect(resState?.status).toBe('error') + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/OP.request.spec.ts b/packages/siop-oid4vp/lib/__tests__/OP.request.spec.ts new file mode 100644 index 00000000..ff6d5c48 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/OP.request.spec.ts @@ -0,0 +1,274 @@ +import { IProofType } from '@sphereon/ssi-types' +import nock from 'nock' + +import { + AuthorizationResponseOpts, + CreateAuthorizationRequestOpts, + OP, + PassBy, + ResponseIss, + ResponseMode, + ResponseType, + RP, + Scope, + SigningAlgo, + SubjectIdentifierType, + SubjectType, + SupportedVersion, + VerifyAuthorizationRequestOpts, +} from '..' + +import { getCreateJwtCallback, getVerifyJwtCallback, internalSignature } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { mockedGetEnterpriseAuthToken, WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + UNIT_TEST_TIMEOUT, + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' + +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#controller' + +describe('OP OPBuilder should', () => { + /*it('throw Error when no arguments are passed', async () => { + expect.assertions(1); + await expect(() => new OPBuilder().build()).toThrowError(Error); + });*/ + it('build an OP when all arguments are set', async () => { + expect.assertions(1) + + expect( + OP.builder() + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withResponseMode(ResponseMode.POST) + .withRegistration({ + passBy: PassBy.REFERENCE, + reference_uri: 'https://registration.here', + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100332', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withCreateJwtCallback(internalSignature('myprivatekey', 'did:example:123', 'did:example:123#key', SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(getResolver('ethr'), { checkLinkedDomain: 'never' })) + .withExpiresIn(1000) + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .build(), + ).toBeInstanceOf(OP) + }) +}) + +describe('OP should', () => { + const responseOpts: AuthorizationResponseOpts = { + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + responseTypesSupported: [ResponseType.ID_TOKEN], + subject_syntax_types_supported: ['did:web'], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100333', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + //TODO: fill it up with actual value + issuer: ResponseIss.SELF_ISSUED_V2, + passBy: PassBy.VALUE, + }, + responseMode: ResponseMode.POST, + expiresIn: 2000, + } + + const resolver = getResolver('ethr') + const verifyOpts: VerifyAuthorizationRequestOpts = { + verifyJwtCallback: getVerifyJwtCallback(resolver), + verification: {}, + correlationId: '1234', + supportedVersions: [SupportedVersion.SIOPv2_ID1], + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + } + + /*it('throw Error when build from request opts without enough params', async () => { + expect.assertions(1); + await expect(() => OP.fromOpts({} as never, {} as never)).toThrowError(Error); + });*/ + + it('return an OP when all request arguments are set', async () => { + expect.assertions(1) + + expect(OP.fromOpts(responseOpts, verifyOpts)).toBeInstanceOf(OP) + }) + + it( + 'succeed from request opts when all params are set', + async () => { + const mockEntity = await mockedGetEnterpriseAuthToken('ACME Corp') + const requestOpts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + options: { + kid: '1234', + }, + }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: mockEntity.hexPrivateKey, + did: mockEntity.did, + kid: `${mockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + payload: { + redirect_uri: EXAMPLE_REDIRECT_URL, + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'test', + response_type: 'id_token', + }, + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt_vp: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100334', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + const requestURI = await RP.fromRequestOpts(requestOpts).createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + jwtIssuer: { method: 'did', didUrl: `${mockEntity.did}#controller`, alg: SigningAlgo.ES256K, options: { kid: '1234' } }, + }) + + nock('https://rp.acme.com').get('/siop/jwts').reply(200, requestURI.requestObjectJwt) + + const verifiedRequest = await OP.fromOpts(responseOpts, verifyOpts).verifyAuthorizationRequest(requestURI.encodedUri) + // console.log(JSON.stringify(verifiedRequest)); + expect(verifiedRequest.issuer).toMatch(mockEntity.did) + expect(verifiedRequest.jwt).toBeDefined() + }, + UNIT_TEST_TIMEOUT, + ) + + it('succeed from builder when all params are set', async () => { + const rpMockEntity = await mockedGetEnterpriseAuthToken('ACME RP') + const opMockEntity = await mockedGetEnterpriseAuthToken('ACME OP') + + const requestURI = await RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(WELL_KNOWN_OPENID_FEDERATION) + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withRedirectUri(EXAMPLE_REFERENCE_URL) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback( + getCreateJwtCallback({ + hexPrivateKey: rpMockEntity.hexPrivateKey, + did: rpMockEntity.did, + kid: `${rpMockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + ) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100335', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .build() + + .createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + jwtIssuer: { method: 'did', didUrl: `${rpMockEntity.did}#controller`, alg: SigningAlgo.ES256K }, + }) + + const verifiedRequest = await OP.builder() + .withSupportedVersions([SupportedVersion.SIOPv2_ID1]) + .withExpiresIn(1000) + .withIssuer(ResponseIss.SELF_ISSUED_V2) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'never' })) + .withCreateJwtCallback( + getCreateJwtCallback({ + hexPrivateKey: opMockEntity.hexPrivateKey, + did: opMockEntity.did, + kid: `${opMockEntity.did}#controller`, + alg: SigningAlgo.ES256K, + }), + ) + .withRegistration({ + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormats: { ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100336', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .build() + + .verifyAuthorizationRequest(requestURI.encodedUri) + // console.log(JSON.stringify(verifiedRequest)); + expect(verifiedRequest.issuer).toMatch(rpMockEntity.did) + expect(verifiedRequest.jwt).toBeDefined() + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/PresentationExchange.spec.ts b/packages/siop-oid4vp/lib/__tests__/PresentationExchange.spec.ts new file mode 100644 index 00000000..af90caa9 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/PresentationExchange.spec.ts @@ -0,0 +1,457 @@ +import { PresentationDefinitionV1 } from '@sphereon/pex-models' +import { CredentialMapper, IPresentation, IProofType, IVerifiableCredential } from '@sphereon/ssi-types' +import { W3CVerifiablePresentation } from '@sphereon/ssi-types/src/types/w3c-vc' +import nock from 'nock' + +import { + AuthorizationRequestPayload, + AuthorizationRequestPayloadVID1, + getNonce, + getState, + IdTokenType, + PresentationDefinitionWithLocation, + PresentationExchange, + PresentationSignCallback, + ResponseType, + Scope, + SigningAlgo, + SubjectIdentifierType, + SubjectType, +} from '..' +import { SIOPErrors } from '../types' + +import { mockedGetEnterpriseAuthToken } from './TestUtils' +import { + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +const HOLDER_DID = 'did:example:ebfeb1f712ebc6f1c276e12ec21' +const EXAMPLE_PD_URL = 'http://my_own_pd.com/pd/' + +async function getPayloadVID1Val(): Promise { + const mockEntity = await mockedGetEnterpriseAuthToken('ACME Corp') + const state = getState() + return { + redirect_uri: '', + scope: Scope.OPENID, + response_type: ResponseType.ID_TOKEN, + client_id: mockEntity.did, + state, + nonce: getNonce(state), + registration: { + client_id: mockEntity.did, + id_token_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + id_token_types_supported: [IdTokenType.SUBJECT_SIGNED], + request_object_signing_alg_values_supported: [SigningAlgo.ES256K, SigningAlgo.ES256, SigningAlgo.EDDSA], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID, Scope.OPENID_DIDAUTHN], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + client_name: VERIFIER_NAME_FOR_CLIENT, + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100337', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + claims: { + id_token: { + acr: null, + }, + vp_token: { + presentation_definition: { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + { + uri: 'https://www.w3.org/2018/credentials/v1', + }, + ], + constraints: { + limit_disclosure: 'preferred', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + }, + }, + }, + } +} + +async function getPayloadPdRef(): Promise { + const mockEntity = await mockedGetEnterpriseAuthToken('ACME Corp') + const state = getState() + return { + redirect_uri: '', + scope: Scope.OPENID, + response_type: ResponseType.ID_TOKEN, + client_id: mockEntity.did, + state, + nonce: getNonce(state), + registration: { + id_token_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + id_token_types_supported: [IdTokenType.SUBJECT_SIGNED], + request_object_signing_alg_values_supported: [SigningAlgo.ES256K, SigningAlgo.ES256, SigningAlgo.EDDSA], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID, Scope.OPENID_DIDAUTHN], + subject_syntax_types_supported: ['did:ethr:', SubjectIdentifierType.DID], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + client_name: VERIFIER_NAME_FOR_CLIENT, + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100338', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + claims: { + id_token: { + acr: null, + }, + vp_token: { + presentation_definition: { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + { + uri: 'https://www.w3.org/2018/credentials/v1', + }, + ], + constraints: { + limit_disclosure: 'preferred', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + }, + }, + }, + } +} + +function getVCs(): IVerifiableCredential[] { + return [ + { + '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'], + issuanceDate: '2021-11-01T03:05:06T000z', + id: 'https://example.com/credentials/1872', + type: ['VerifiableCredential', 'IDCardCredential'], + issuer: { + id: 'did:example:issuer', + }, + credentialSubject: { + given_name: 'Fredrik', + family_name: 'Stremberg', + birthdate: '1949-01-22', + }, + proof: { + type: 'BbsBlsSignatureProof2020', + created: '2020-04-25', + verificationMethod: 'did:example:489398593#test', + proofPurpose: 'assertionMethod', + proofValue: + 'kTTbA3pmDa6Qia/JkOnIXDLmoBz3vsi7L5t3DWySI/VLmBqleJ/Tbus5RoyiDERDBEh5rnACXlnOqJ/U8yFQFtcp/mBCc2FtKNPHae9jKIv1dm9K9QK1F3GI1AwyGoUfjLWrkGDObO1ouNAhpEd0+et+qiOf2j8p3MTTtRRx4Hgjcl0jXCq7C7R5/nLpgimHAAAAdAx4ouhMk7v9dXijCIMaG0deicn6fLoq3GcNHuH5X1j22LU/hDu7vvPnk/6JLkZ1xQAAAAIPd1tu598L/K3NSy0zOy6obaojEnaqc1R5Ih/6ZZgfEln2a6tuUp4wePExI1DGHqwj3j2lKg31a/6bSs7SMecHBQdgIYHnBmCYGNQnu/LZ9TFV56tBXY6YOWZgFzgLDrApnrFpixEACM9rwrJ5ORtxAAAAAgE4gUIIC9aHyJNa5TBklMOh6lvQkMVLXa/vEl+3NCLXblxjgpM7UEMqBkE9/QcoD3Tgmy+z0hN+4eky1RnJsEg=', + }, + }, + ] +} + +const presentation_submission = { + id: 'L4tK2DK3rLC9sJhkPgeg_', + definition_id: 'Insurance Plans', + descriptor_map: [ + { + id: 'Ontario Health Insurance Plan', + format: 'ldp_vc', + path: '$.verifiableCredential[0]', + }, + ], +} + +describe('presentation exchange manager tests', () => { + it("validatePresentationAgainstDefinition: should throw error if provided VP doesn't match the PD val", async function () { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const vcs = getVCs() + vcs[0].issuer = { id: 'did:example:totallyDifferentIssuer' } + await expect( + PresentationExchange.validatePresentationAgainstDefinition( + pd[0].definition, + CredentialMapper.toWrappedVerifiablePresentation({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + verifiableCredential: vcs, + presentation_submission, + } as W3CVerifiablePresentation), + ), + ).rejects.toThrow(SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD) + }) + + it("validatePresentationAgainstDefinition: should throw error if provided VP doesn't match the PD ref", async function () { + const payload: AuthorizationRequestPayload = await getPayloadPdRef() + const response = { + id: 'Insurance Plans', + input_descriptors: [ + { + id: 'Ontario Health Insurance Plan', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + { + uri: 'https://www.w3.org/2018/credentials/v1', + }, + ], + constraints: { + limit_disclosure: 'preferred', + fields: [ + { + path: ['$.issuer.id'], + purpose: 'We can only verify bank accounts if they are attested by a source.', + filter: { + type: 'string', + pattern: 'did:example:issuer', + }, + }, + ], + }, + }, + ], + } + nock('http://my_own_pd.com') + .persist() + .get(/pd/) + .reply(200, { ...response }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const vcs = getVCs() + vcs[0].issuer = { id: 'did:example:totallyDifferentIssuer' } + await expect( + PresentationExchange.validatePresentationAgainstDefinition( + pd[0].definition, + CredentialMapper.toWrappedVerifiablePresentation({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + presentation_submission, + verifiableCredential: vcs, + } as W3CVerifiablePresentation), + ), + ).rejects.toThrow(SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD) + }) + + it('validatePresentationAgainstDefinition: should throw error if both pd and pd_ref is present', async function () { + const payload = await getPayloadVID1Val() + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ;(payload.claims?.vp_token as any).presentation_definition_uri = EXAMPLE_PD_URL + await expect(PresentationExchange.findValidPresentationDefinitions(payload)).rejects.toThrow( + SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_BY_REF_AND_VALUE_NON_EXCLUSIVE, + ) + }) + + it('validatePresentationAgainstDefinition: should pass if provided VP match the PD', async function () { + const payload = await getPayloadVID1Val() + const vcs = getVCs() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const result = await PresentationExchange.validatePresentationAgainstDefinition( + pd[0].definition, + CredentialMapper.toWrappedVerifiablePresentation({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + presentation_submission, + verifiableCredential: vcs, + } as W3CVerifiablePresentation), + ) + expect(result.errors?.length).toBe(0) + expect(result.value?.definition_id).toBe('Insurance Plans') + }) + + it('submissionFrom: should pass if a valid presentationSubmission object created', async function () { + const vcs = getVCs() + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: vcs }) + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + await PresentationExchange.validatePresentationAgainstDefinition( + pd[0].definition, + CredentialMapper.toWrappedVerifiablePresentation({ + '@context': ['https://www.w3.org/2018/credentials/v1'], + type: ['VerifiablePresentation', 'PresentationSubmission'], + presentation_submission, + verifiableCredential: vcs, + } as W3CVerifiablePresentation), + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, + }) + const result = await pex.createVerifiablePresentation(pd[0].definition, vcs, presentationSignCallback, {}) + expect(result.presentationSubmission.definition_id).toBe('Insurance Plans') + expect(result.presentationSubmission.descriptor_map.length).toBe(1) + expect(result.presentationSubmission.descriptor_map[0]).toStrictEqual({ + format: 'ldp_vp', + id: 'Ontario Health Insurance Plan', + path: '$', + path_nested: { + format: 'ldp_vc', + id: 'Ontario Health Insurance Plan', + path: '$.verifiableCredential[0]', + }, + }) + }) + + it('selectVerifiableCredentialsForSubmission: should fail if selectResults object contains error', async function () { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const vcs = getVCs() + vcs[0].issuer = undefined as any + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: vcs }) + try { + await expect(pex.selectVerifiableCredentialsForSubmission(pd[0].definition)).rejects.toThrow() + } catch (e) { + expect(e.message).toContain(SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD) + } + }) + + it('selectVerifiableCredentialsForSubmission: should pass if a valid selectResults object created', async function () { + const vcs = getVCs() + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: vcs }) + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const result = await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + expect(result.errors?.length).toBe(0) + expect(result.matches?.length).toBe(1) + expect(result.matches[0].vc_path.length).toBe(1) + expect(result.matches[0].vc_path[0]).toBe('$.verifiableCredential[0]') + }) + + it('pass if no PresentationDefinition is found', async () => { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + payload.claims = undefined + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + expect(pd.length).toBe(0) + }) + + it('pass if findValidPresentationDefinitions finds a valid presentation_definition', async () => { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd = await PresentationExchange.findValidPresentationDefinitions(payload) + const definition = pd[0].definition as PresentationDefinitionV1 + expect(definition['id']).toBe('Insurance Plans') + expect(definition['input_descriptors'][0].schema.length).toBe(2) + }) + + it('should validate a list of VerifiablePresentations against a list of PresentationDefinitions', async () => { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const vcs = getVCs() + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: vcs }) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, + }) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, vcs, presentationSignCallback, {}) + try { + await PresentationExchange.validatePresentationsAgainstDefinitions( + pd, + [CredentialMapper.toWrappedVerifiablePresentation(verifiablePresentationResult.verifiablePresentation)], + undefined, + {}, + ) + } catch (e) { + console.log(e) + } + }) + + it("'validatePresentationsAgainstDefinitions' should fail if provided VP verification callback fails", async () => { + const payload: AuthorizationRequestPayload = await getPayloadVID1Val() + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions(payload) + const vcs = getVCs() + const pex = new PresentationExchange({ allDIDs: [HOLDER_DID], allVerifiableCredentials: vcs }) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const presentationSignCallback: PresentationSignCallback = async (_args) => ({ + ...(_args.presentation as IPresentation), + proof: { + type: 'RsaSignature2018', + created: '2018-09-14T21:19:10Z', + proofPurpose: 'authentication', + verificationMethod: 'did:example:ebfeb1f712ebc6f1c276e12ec21#keys-1', + challenge: '1f44d55f-f161-4938-a659-f8026467f126', + domain: '4jt78h47fh47', + jws: 'eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqsLfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh4vGHSrQyHUGlcTwLtjPAnKb78', + }, + }) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, vcs, presentationSignCallback, {}) + + await expect( + PresentationExchange.validatePresentationsAgainstDefinitions( + pd, + [CredentialMapper.toWrappedVerifiablePresentation(verifiablePresentationResult.verifiablePresentation)], + () => { + throw new Error('Verification failed') + }, + {}, + ), + ).rejects.toThrow(SIOPErrors.VERIFIABLE_PRESENTATION_SIGNATURE_NOT_VALID) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/RP.request.spec.ts b/packages/siop-oid4vp/lib/__tests__/RP.request.spec.ts new file mode 100644 index 00000000..aae56def --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/RP.request.spec.ts @@ -0,0 +1,310 @@ +import { IProofType } from '@sphereon/ssi-types' + +import { + CreateAuthorizationRequestOpts, + PassBy, + PropertyTarget, + ResponseMode, + ResponseType, + RP, + Scope, + SigningAlgo, + SubjectIdentifierType, + SubjectType, + SupportedVersion, +} from '..' + +import { getCreateJwtCallback, getVerifyJwtCallback, internalSignature } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts' +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1' + +const alltargets = [PropertyTarget.AUTHORIZATION_REQUEST, PropertyTarget.REQUEST_OBJECT] + +describe('RP OPBuilder should', () => { + /*it('throw Error when no arguments are passed', async () => { + expect.assertions(1); + await expect(() => new OPBuilder().build()).toThrowError(Error); + });*/ + + it('build an RP when all arguments are set', async () => { + expect.assertions(1) + + const resolver = getResolver('ethr') + expect( + RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId('test_client_id') + .withScope('test') + .withResponseType(ResponseType.ID_TOKEN) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withRedirectUri('https://redirect.me') + .withRequestBy(PassBy.VALUE) + .withResponseMode(ResponseMode.POST) + .withClientMetadata({ + passBy: PassBy.REFERENCE, + reference_uri: 'https://registration.here', + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100339', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + + .withCreateJwtCallback(internalSignature('myprivatekye', 'did:example:123', 'did:example:123#key', SigningAlgo.ES256K)) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build(), + ).toBeInstanceOf(RP) + }) +}) + +describe('RP should', () => { + it('throw Error when build from request opts without enough params', async () => { + expect.assertions(1) + await expect(() => RP.fromRequestOpts({} as never)).toThrowError(Error) + }) + it('return an RP when all request arguments are set', async () => { + expect.assertions(1) + + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: 'test', + scope: 'test', + response_type: 'test', + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: KID, + alg: SigningAlgo.ES256K, + }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + }, + clientMetadata: { + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt_vp: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + }, + + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '202210040', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }, + } + + expect(RP.fromRequestOpts(opts)).toBeInstanceOf(RP) + }) + + it('succeed from request opts when all params are set', async () => { + // expect.assertions(1); + const opts: CreateAuthorizationRequestOpts = { + version: SupportedVersion.SIOPv2_ID1, + payload: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + scope: 'openid', + response_type: 'id_token', + response_mode: ResponseMode.POST, + redirect_uri: EXAMPLE_REDIRECT_URL, + }, + requestObject: { + jwtIssuer: { + method: 'did', + didUrl: KID, + alg: SigningAlgo.ES256K, + }, + passBy: PassBy.REFERENCE, + reference_uri: EXAMPLE_REFERENCE_URL, + + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }), + }, + clientMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + subject_syntax_types_supported: ['did:ethr', SubjectIdentifierType.DID], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + vpFormatsSupported: { + jwt_vc: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt_vp: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + jwt: { alg: [SigningAlgo.EDDSA, SigningAlgo.ES256K, SigningAlgo.ES256] }, + ldp_vc: { proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019] }, + }, + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 00', + clientName: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 00', + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 00', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 00', + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 00', + }, + } + + const expectedPayloadWithoutRequest = { + response_type: 'id_token', + scope: 'openid', + client_id: WELL_KNOWN_OPENID_FEDERATION, + redirect_uri: 'https://acme.com/hello', + // nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + /* registration: { + id_token_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr', 'did'], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + jwt: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + jwt_vc: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 00', + client_name: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 00', + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 00', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 00', + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 00', + },*/ + } + + const expectedUri = + 'openid://?client_id=https%3A%2F%2Fwww.example.com%2F.well-known%2Fopenid-federation&scope=openid&response_type=id_token&response_mode=post&redirect_uri=https%3A%2F%2Facme.com%2Fhello&request_uri=https%3A%2F%2Frp.acme.com%2Fsiop%2Fjwts' + const expectedJwtRegex = + /^eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjoweDAxMDZhMmU5ODViMUUxRGU5QjVkZGI0YUY2ZEM5ZTkyOEY0ZTk5RDAja2V5cy0xIiwidHlwIjoiSldUIn0\.ey.*$/ + + const request = await RP.fromRequestOpts(opts).createAuthorizationRequestURI({ + correlationId: '1234', + state: 'b32f0087fc9816eb813fd11f', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + }) + expect(request.authorizationRequestPayload).toMatchObject(expectedPayloadWithoutRequest) + expect(request.encodedUri).toMatch(expectedUri) + expect(request.requestObjectJwt).toMatch(expectedJwtRegex) + }) + + it('succeed from builder when all params are set', async () => { + const expectedPayloadWithoutRequest = { + client_id: WELL_KNOWN_OPENID_FEDERATION, + // nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + redirect_uri: 'https://acme.com/hello', + registration: { + id_token_signing_alg_values_supported: [SigningAlgo.EDDSA], + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subject_syntax_types_supported: ['did:ethr'], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + jwt: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + jwt_vc: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + jwt_vp: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 01', + client_name: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 01', + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 01', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 01', + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 01', + }, + } + + const expectedUri = + 'openid://?client_id=https%3A%2F%2Fwww.example.com%2F.well-known%2Fopenid-federation&scope=test&response_type=id_token&redirect_uri=https%3A%2F%2Facme.com%2Fhello®istration=%7B%22id_token_signing_alg_values_supported%22%3A%5B%22EdDSA%22%5D%2C%22request_object_signing_alg_values_supported%22%3A%5B%22EdDSA%22%2C%22ES256%22%5D%2C%22response_types_supported%22%3A%5B%22id_token%22%5D%2C%22scopes_supported%22%3A%5B%22openid%20did_authn%22%2C%22openid%22%5D%2C%22subject_types_supported%22%3A%5B%22pairwise%22%5D%2C%22subject_syntax_types_supported%22%3A%5B%22did%3Aethr%22%5D%2C%22vp_formats%22%3A%7B%22jwt%22%3A%7B%22alg%22%3A%5B%22EdDSA%22%2C%22ES256K%22%2C%22ES256%22%5D%7D%2C%22jwt_vc%22%3A%7B%22alg%22%3A%5B%22EdDSA%22%2C%22ES256K%22%2C%22ES256%22%5D%7D%2C%22jwt_vp%22%3A%7B%22alg%22%3A%5B%22EdDSA%22%2C%22ES256K%22%2C%22ES256%22%5D%7D%7D%2C%22client_name%22%3A%22Client%20Verifier%20Relying%20Party%20Sphereon%20INC%202022-09-29%2001%22%2C%22logo_uri%22%3A%22https%3A%2F%2Fsphereon.com%2Fcontent%2Fthemes%2Fsphereon%2Fassets%2Ffavicons%2Fsafari-pinned-tab.svg%202022-09-29%2001%22%2C%22client_purpose%22%3A%22To%20request%2C%20receive%20and%20verify%20your%20credential%20about%20the%20the%20valid%20subject.%202022-09-29%2001%22%2C%22client_id%22%3A%22https%3A%2F%2Fwww.example.com%2F.well-known%2Fopenid-federation%22%2C%22client_name%23nl-NL%22%3A%22%20***%20dutch%20***%20Client%20Verifier%20Relying%20Party%20Sphereon%20B.V.%202022-09-29%2001%22%2C%22client_purpose%23nl-NL%22%3A%22%20***%20Dutch%20***%20To%20request%2C%20receive%20and%20verify%20your%20credential%20about%20the%20the%20valid%20subject.%202022-09-29%2001%22%7D&request_uri=https%3A%2F%2Frp.acme.com%2Fsiop%2Fjwts' + + const expectedJwtRegex = + /^eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXRocjoweDAxMDZhMmU5ODViMUUxRGU5QjVkZGI0YUY2ZEM5ZTkyOEY0ZTk5RDAja2V5cy0xIiwidHlwIjoiSldUIn0\.eyJpYXQiO.*$/ + + const request = await RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(WELL_KNOWN_OPENID_FEDERATION, alltargets) + .withScope('test', alltargets) + .withResponseType(ResponseType.ID_TOKEN, alltargets) + .withVerifyJwtCallback(getVerifyJwtCallback(getResolver('ethr'))) + .withRedirectUri(EXAMPLE_REDIRECT_URL, alltargets) + .withRequestBy(PassBy.REFERENCE, EXAMPLE_REFERENCE_URL) + .withCreateJwtCallback(internalSignature(HEX_KEY, DID, KID, SigningAlgo.ES256K)) + .withClientMetadata( + { + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { + jwt: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + jwt_vc: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + jwt_vp: { + alg: ['EdDSA', 'ES256K', 'ES256'], + }, + }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 01', + clientName: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 01', + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 01', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 01', + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 01', + }, + alltargets, + ) + .withSupportedVersions([SupportedVersion.SIOPv2_D11]) + .build() + + .createAuthorizationRequestURI({ + correlationId: '1234', + state: 'b32f0087fc9816eb813fd11f', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + jwtIssuer: { method: 'did', didUrl: KID, alg: SigningAlgo.ES256K }, + }) + expect(request.authorizationRequestPayload).toMatchObject(expectedPayloadWithoutRequest) + expect(request.encodedUri).toMatch(expectedUri) + expect(request.requestObjectJwt).toMatch(expectedJwtRegex) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/RequestObjectJwtVerifier.test.ts b/packages/siop-oid4vp/lib/__tests__/RequestObjectJwtVerifier.test.ts new file mode 100644 index 00000000..d259498a --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/RequestObjectJwtVerifier.test.ts @@ -0,0 +1,123 @@ +import * as dotenv from 'dotenv' + +import { getJwtVerifierWithContext, getRequestObjectJwtVerifier, JwtVerifier, SIOPErrors } from '..' +import { parseJWT } from '../helpers/jwtUtils' + +dotenv.config() + +const baseJwtPayload = { + nonce: '1234', + scope: 'openid', + state: '1234', + response_type: 'id_token', + client_id: '1234', +} + +describe('requestObjectJwtVerifier', () => { + it('should throw when an invalid schema is passed', async () => { + expect( + getRequestObjectJwtVerifier( + { + header: {}, + payload: { ...baseJwtPayload, client_id_scheme: 'wrong' as never }, + }, + { type: 'request-object', raw: '' }, + ), + ).rejects.toThrow(SIOPErrors.INVALID_CLIENT_ID_SCHEME) + }) + + it('should succeed with a client_id_scheme did', async () => { + const jwtVerifier = await getRequestObjectJwtVerifier( + { + header: { kid: 'did:example.com#1234' }, + payload: { ...baseJwtPayload, client_id_scheme: 'did' }, + }, + { type: 'request-object', raw: '' }, + ) + + const expectedJwtVerifier: JwtVerifier = { type: 'request-object', method: 'did', didUrl: 'did:example.com#1234' } + expect(jwtVerifier).toEqual(expectedJwtVerifier) + }) + + it('should error with a client_id_scheme did and invalid header', async () => { + const jwtVerifier = getRequestObjectJwtVerifier( + { + header: {}, + payload: { ...baseJwtPayload, client_id_scheme: 'did' }, + }, + { type: 'request-object', raw: '' }, + ) + + await expect(jwtVerifier).rejects.toThrow(SIOPErrors.INVALID_REQUEST_OBJECT_DID_SCHEME_JWT) + }) + + it('should succeed with a client_id_scheme pre-registered', async () => { + const jwtVerifier = await getRequestObjectJwtVerifier( + { + header: {}, + payload: { ...baseJwtPayload, client_id_scheme: 'pre-registered' }, + }, + { type: 'request-object', raw: '' }, + ) + + const expectedJwtVerifier: JwtVerifier = { type: 'request-object', method: 'custom' } + expect(jwtVerifier).toEqual(expectedJwtVerifier) + }) + + it('should succeed with a client_id_scheme x509_san_dns', async () => { + const jwtVerifier = await getRequestObjectJwtVerifier( + { + header: { x5c: [''] }, + payload: { ...baseJwtPayload, iss: 'issuer', client_id_scheme: 'x509_san_dns' }, + }, + { type: 'request-object', raw: '' }, + ) + + const expectedJwtVerifier: JwtVerifier = { type: 'request-object', method: 'x5c', x5c: [''], issuer: 'issuer' } + expect(jwtVerifier).toEqual(expectedJwtVerifier) + }) + + it('should error with a client_id_scheme x509_san_dns and invalid header', async () => { + const jwtVerifier = getRequestObjectJwtVerifier( + { + header: {}, + payload: { ...baseJwtPayload, client_id_scheme: 'x509_san_dns' }, + }, + { type: 'request-object', raw: '' }, + ) + + await expect(jwtVerifier).rejects.toThrow(SIOPErrors.INVALID_REQUEST_OBJECT_X509_SCHEME_JWT) + }) + + it('should error with a client_id_scheme verifier_attestation and invalid header', async () => { + const jwtVerifier = getRequestObjectJwtVerifier( + { + header: {}, + payload: { ...baseJwtPayload, client_id_scheme: 'verifier_attestation' }, + }, + { type: 'request-object', raw: '' }, + ) + + await expect(jwtVerifier).rejects.toThrow(SIOPErrors.MISSING_ATTESTATION_JWT) + }) + + it('should succeed with a client_id_scheme verifier_attestation', async () => { + const attestationJwt = + 'eyJ0eXAiOiJ2ZXJpZmllci1hdHRlc3RhdGlvbitqd3QiLCAia2lkIjogImRpZDpleGFtcGxlLmNvbSMxMjM0In0.eyJzdWIiOiAiY2xpZW50X2lkIiwiaXNzIjogImlzc3VlciIsImV4cCI6IDEyMzQsImNuZiI6IHsgImp3ayI6IHt9fX0=' + + const jwtVerifier = await getRequestObjectJwtVerifier( + { + header: { jwt: attestationJwt, typ: 'verifier-attestation+jwt' }, + payload: { ...baseJwtPayload, client_id: 'client_id', client_id_scheme: 'verifier_attestation' }, + }, + { type: 'request-object', raw: '' }, + ) + + const expectedJwtVerifier: JwtVerifier = { type: 'request-object', method: 'jwk', jwk: {} } + expect(jwtVerifier).toEqual(expectedJwtVerifier) + + const expectedAttestationVerifier: JwtVerifier = { type: 'verifier-attestation', method: 'did', didUrl: 'did:example.com#1234' } + const attestationJwtVerifier = await getJwtVerifierWithContext(parseJWT(attestationJwt), { type: 'verifier-attestation' }) + expect(attestationJwtVerifier).toEqual(expectedAttestationVerifier) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/ResolverTestUtils.ts b/packages/siop-oid4vp/lib/__tests__/ResolverTestUtils.ts new file mode 100644 index 00000000..e9b78bcd --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/ResolverTestUtils.ts @@ -0,0 +1,43 @@ +import { getUniResolver } from '@sphereon/did-uni-client' +import { Resolvable, Resolver, ResolverRegistry } from 'did-resolver' +import { DIDDocument as DIFDIDDocument } from 'did-resolver' + +import { SIOPErrors } from '..' + +export interface DIDDocument extends DIFDIDDocument { + owner?: string + created?: string + updated?: string + proof?: LinkedDataProof +} + +export interface LinkedDataProof { + type: string + created: string + creator: string + nonce: string + signatureValue: string +} + +export function getResolver(methods: string | string[]): Resolvable { + function getMethodFromDid(did: string): string { + if (!did) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + const split = did.split(':') + if (split.length == 1 && did.length > 0) { + return did + } else if (!did.startsWith('did:') || split.length < 2) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + + return split[1] + } + + const uniResolvers: ResolverRegistry[] = [] + for (const didMethod of typeof methods === 'string' ? [methods] : methods) { + const uniResolver = getUniResolver(getMethodFromDid(didMethod)) + uniResolvers.push(uniResolver) + } + return new Resolver(...uniResolvers) +} diff --git a/packages/siop-oid4vp/lib/__tests__/SdJwt.spec.ts b/packages/siop-oid4vp/lib/__tests__/SdJwt.spec.ts new file mode 100644 index 00000000..e9e882f1 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/SdJwt.spec.ts @@ -0,0 +1,362 @@ +import { createHash } from 'node:crypto' + +import { IPresentationDefinition, SdJwtDecodedVerifiableCredentialWithKbJwtInput } from '@sphereon/pex' +import { OriginalVerifiableCredential } from '@sphereon/ssi-types' + +import { + OP, + PassBy, + PresentationDefinitionWithLocation, + PresentationExchange, + PresentationSignCallback, + PresentationVerificationCallback, + PropertyTarget, + ResponseIss, + ResponseType, + RevocationVerification, + RP, + Scope, + SigningAlgo, + SubjectType, + SupportedVersion, + VPTokenLocation, +} from '../' + +import { getVerifyJwtCallback, internalSignature } from './DidJwtTestUtils' +import { getResolver } from './ResolverTestUtils' +import { mockedGetEnterpriseAuthToken, WELL_KNOWN_OPENID_FEDERATION } from './TestUtils' +import { + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +const hasher = (data: string) => createHash('sha256').update(data).digest() +jest.setTimeout(30000) + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' + +const HOLDER_DID = 'did:example:ebfeb1f712ebc6f1c276e12ec21' +const SD_JWT_VC = + 'eyJhbGciOiJFZERTQSIsInR5cCI6InZjK3NkLWp3dCJ9.eyJpYXQiOjE3MDA0NjQ3MzYwNzYsImlzcyI6ImRpZDprZXk6c29tZS1yYW5kb20tZGlkLWtleSIsIm5iZiI6MTcwMDQ2NDczNjE3NiwidmN0IjoiaHR0cHM6Ly9oaWdoLWFzc3VyYW5jZS5jb20vU3RhdGVCdXNpbmVzc0xpY2Vuc2UiLCJ1c2VyIjp7Il9zZCI6WyI5QmhOVDVsSG5QVmpqQUp3TnR0NDIzM216MFVVMUd3RmFmLWVNWkFQV0JNIiwiSVl5d1FQZl8tNE9hY2Z2S2l1cjRlSnFMa1ZleWRxcnQ1Y2UwMGJReWNNZyIsIlNoZWM2TUNLakIxeHlCVl91QUtvLURlS3ZvQllYbUdBd2VGTWFsd05xbUEiLCJXTXpiR3BZYmhZMkdoNU9pWTRHc2hRU1dQREtSeGVPZndaNEhaQW5YS1RZIiwiajZ6ZFg1OUJYZHlTNFFaTGJITWJ0MzJpenRzWXdkZzRjNkpzWUxNc3ZaMCIsInhKR3Radm41cFM4VEhqVFlJZ3MwS1N5VC1uR3BSR3hDVnp6c1ZEbmMyWkUiXX0sImxpY2Vuc2UiOnsibnVtYmVyIjoxMH0sImNuZiI6eyJqd2siOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJUQ0FFUjE5WnZ1M09IRjRqNFc0dmZTVm9ISVAxSUxpbERsczd2Q2VHZW1jIiwieSI6Ilp4amlXV2JaTVFHSFZXS1ZRNGhiU0lpcnNWZnVlY0NFNnQ0alQ5RjJIWlEifX0sIl9zZF9hbGciOiJzaGEtMjU2IiwiX3NkIjpbIl90YnpMeHBaeDBQVHVzV2hPOHRUZlVYU2ZzQjVlLUtrbzl3dmZaaFJrYVkiLCJ1WmNQaHdUTmN4LXpNQU1zemlYMkFfOXlJTGpQSEhobDhEd2pvVXJLVVdZIl19.HAcudVInhNpXkTPQGNosjKTFRJWgKj90NpfloRaDQchGd4zxc1ChWTCCPXzUXTBypASKrzgjZCiXlTr0bzmLAg~WyJHeDZHRUZvR2t6WUpWLVNRMWlDREdBIiwiZGF0ZU9mQmlydGgiLCIyMDAwMDEwMSJd~WyJ1LUt3cmJvMkZfTExQekdSZE1XLUtBIiwibmFtZSIsIkpvaG4iXQ~WyJNV1ZieGJqVFZxUXdLS3h2UGVZdWlnIiwibGFzdE5hbWUiLCJEb2UiXQ~' + +const presentationSignCallback: PresentationSignCallback = async (_args) => { + const kbJwt = (_args.presentation as SdJwtDecodedVerifiableCredentialWithKbJwtInput).kbJwt + + // In real life scenario, the KB-JWT must be signed + // As the KB-JWT is a normal JWT, the user does not need an sd-jwt implementation in the presentation sign callback + // NOTE: should the presentation just be the KB-JWT header + payload instead of the whole decoded SD JWT? + expect(kbJwt).toEqual({ + header: { + typ: 'kb+jwt', + }, + payload: { + _sd_hash: expect.any(String), + iat: expect.any(Number), + nonce: expect.any(String), + }, + }) + + const header = { + ...kbJwt.header, + alg: 'ES256K', + } + const payload = { + ...kbJwt.payload, + aud: '123', + } + + const kbJwtCompact = `${Buffer.from(JSON.stringify(header)).toString('base64url')}.${Buffer.from(JSON.stringify(payload)).toString('base64url')}.signature` + return SD_JWT_VC + kbJwtCompact +} + +function getPresentationDefinition(): IPresentationDefinition { + return { + id: '32f54163-7166-48f1-93d8-ff217bdb0653', + name: 'Conference Entry Requirements', + purpose: 'We can only allow people associated with Washington State business representatives into conference areas', + format: { + 'vc+sd-jwt': {}, + }, + input_descriptors: [ + { + id: 'wa_driver_license', + name: 'Washington State Business License', + purpose: 'We can only allow licensed Washington State business representatives into the WA Business Conference', + constraints: { + limit_disclosure: 'required', + fields: [ + { + path: ['$.vct'], + filter: { + type: 'string', + const: 'https://high-assurance.com/StateBusinessLicense', + }, + }, + { + path: ['$.license.number'], + filter: { + type: 'number', + }, + }, + { + path: ['$.user.name'], + filter: { + type: 'string', + }, + }, + ], + }, + }, + ], + } +} + +function getVCs(): OriginalVerifiableCredential[] { + return [SD_JWT_VC] +} + +describe('RP and OP interaction should', () => { + it('succeed when calling with presentation definitions and right verifiable presentation', async () => { + const opMock = await mockedGetEnterpriseAuthToken('OP') + const opMockEntity = { + ...opMock, + didKey: `${opMock.did}#controller`, + } + const rpMock = await mockedGetEnterpriseAuthToken('RP') + const rpMockEntity = { + ...rpMock, + didKey: `${rpMock.did}#controller`, + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => { + return { verified: true } + } + + const resolver = getResolver('ethr') + const rp = RP.builder({ requestVersion: SupportedVersion.SIOPv2_ID1 }) + .withClientId(rpMockEntity.did) + .withScope('test') + .withHasher(hasher) + .withResponseType([ResponseType.ID_TOKEN, ResponseType.VP_TOKEN]) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, `${rpMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:key'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100322', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withHasher(hasher) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, `${opMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN, ResponseType.VP_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100323', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('requestObjectJwt is undefined') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ + allDIDs: [HOLDER_DID], + allVerifiableCredentials: getVCs(), + hasher, + }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, { + proofOptions: { + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + }, + }) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + presentationSubmission: verifiablePresentationResult.presentationSubmission, + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeDefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + }) + + expect(verifiedAuthResponseWithJWT.idToken?.jwt).toBeDefined() + expect(verifiedAuthResponseWithJWT.idToken?.payload.nonce).toMatch('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + }) + + it('succeed when calling with presentation definitions and right verifiable presentation without id token', async () => { + const opMockEntity = await mockedGetEnterpriseAuthToken('OP') + const rpMockEntity = await mockedGetEnterpriseAuthToken('RP') + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const presentationVerificationCallback: PresentationVerificationCallback = async (_args) => { + return { verified: true } + } + + const resolver = getResolver('ethr') + const rp = RP.builder({ + requestVersion: SupportedVersion.SIOPv2_D12_OID4VP_D18, + }) + .withClientId(rpMockEntity.did) + .withHasher(hasher) + .withResponseType([ResponseType.VP_TOKEN]) + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withPresentationDefinition({ definition: getPresentationDefinition() }, [PropertyTarget.REQUEST_OBJECT, PropertyTarget.AUTHORIZATION_REQUEST]) + .withPresentationVerification(presentationVerificationCallback) + .withRevocationVerification(RevocationVerification.NEVER) + .withRequestBy(PassBy.VALUE) + .withCreateJwtCallback(internalSignature(rpMockEntity.hexPrivateKey, rpMockEntity.did, `${rpMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withAuthorizationEndpoint('www.myauthorizationendpoint.com') + .withClientMetadata({ + client_id: WELL_KNOWN_OPENID_FEDERATION, + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.VP_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did', 'did:key'], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100322', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + const op = OP.builder() + .withPresentationSignCallback(presentationSignCallback) + .withExpiresIn(1000) + .withHasher(hasher) + .withCreateJwtCallback(internalSignature(opMockEntity.hexPrivateKey, opMockEntity.did, `${opMockEntity.did}#controller`, SigningAlgo.ES256K)) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver)) + .withRegistration({ + authorizationEndpoint: 'www.myauthorizationendpoint.com', + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + issuer: ResponseIss.SELF_ISSUED_V2, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN, ResponseType.VP_TOKEN], + vpFormats: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: [], + passBy: PassBy.VALUE, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100323', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + }) + .withSupportedVersions(SupportedVersion.SIOPv2_ID1) + .build() + + const requestURI = await rp.createAuthorizationRequestURI({ + correlationId: '1234', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + jwtIssuer: { method: 'did', alg: SigningAlgo.ES256K, didUrl: `${rpMockEntity.did}#controller` }, + }) + + // Let's test the parsing + const parsedAuthReqURI = await op.parseAuthorizationRequestURI(requestURI.encodedUri) + expect(parsedAuthReqURI.authorizationRequestPayload).toBeDefined() + expect(parsedAuthReqURI.requestObjectJwt).toBeDefined() + + if (!parsedAuthReqURI.requestObjectJwt) throw new Error('requestObjectJwt is undefined') + const verifiedAuthReqWithJWT = await op.verifyAuthorizationRequest(parsedAuthReqURI.requestObjectJwt) + expect(verifiedAuthReqWithJWT.issuer).toMatch(rpMockEntity.did) + const pex = new PresentationExchange({ + allDIDs: [HOLDER_DID], + allVerifiableCredentials: getVCs(), + hasher, + }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + parsedAuthReqURI.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, getVCs(), presentationSignCallback, { + proofOptions: { + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + }, + }) + const authenticationResponseWithJWT = await op.createAuthorizationResponse(verifiedAuthReqWithJWT, { + jwtIssuer: { + method: 'did', + alg: SigningAlgo.ES256K, + didUrl: `${rpMockEntity.did}#controller`, + }, + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + vpTokenLocation: VPTokenLocation.AUTHORIZATION_RESPONSE, + presentationSubmission: verifiablePresentationResult.presentationSubmission, + }, + }) + expect(authenticationResponseWithJWT.response.payload).toBeDefined() + expect(authenticationResponseWithJWT.response.idToken).toBeUndefined() + + const verifiedAuthResponseWithJWT = await rp.verifyAuthorizationResponse(authenticationResponseWithJWT.response.payload, { + presentationDefinitions: [{ definition: pd[0].definition, location: pd[0].location }], + }) + + expect(verifiedAuthResponseWithJWT.oid4vpSubmission?.nonce).toEqual('qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg') + expect(verifiedAuthResponseWithJWT.idToken).toBeUndefined() + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/TestUtils.ts b/packages/siop-oid4vp/lib/__tests__/TestUtils.ts new file mode 100644 index 00000000..2d2384b6 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/TestUtils.ts @@ -0,0 +1,280 @@ +import crypto from 'crypto' + +import { IProofType } from '@sphereon/ssi-types' +import base58 from 'bs58' +import { ethers } from 'ethers' +import { exportJWK, importJWK, JWK, SignJWT } from 'jose' +import moment from 'moment' +import { v4 as uuidv4 } from 'uuid' + +import { + assertValidMetadata, + base64ToHexString, + DiscoveryMetadataPayload, + JwtPayload, + KeyCurve, + KeyType, + ResponseIss, + ResponseType, + RPRegistrationMetadataPayload, + Scope, + SigningAlgo, + SubjectSyntaxTypesSupportedValues, + SubjectType, +} from '../' +import { parseJWT } from '../helpers/jwtUtils' +import SIOPErrors from '../types/Errors' + +import { DIDDocument } from './ResolverTestUtils' +import { + DID_DOCUMENT_PUBKEY_B58, + DID_DOCUMENT_PUBKEY_JWK, + VERIFIER_LOGO_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT, + VERIFIER_NAME_FOR_CLIENT_NL, + VERIFIERZ_PURPOSE_TO_VERIFY, + VERIFIERZ_PURPOSE_TO_VERIFY_NL, +} from './data/mockedData' + +export interface TESTKEY { + key: JWK + did: string + didDoc?: DIDDocument +} + +export async function generateTestKey(kty: string): Promise { + if (kty !== KeyType.EC) throw new Error(SIOPErrors.NO_ALG_SUPPORTED) + const key = crypto.generateKeyPairSync('ec', { + namedCurve: KeyCurve.SECP256k1, + }) + const privateJwk = await exportJWK(key.privateKey) + + const did = getDIDFromKey(privateJwk) + + return { + key: privateJwk, + did, + } +} + +function getDIDFromKey(key: JWK): string { + return `did:ethr:${getEthAddress(key)}` +} + +function getEthAddress(key: JWK): string { + return getEthWallet(key).address +} + +function getEthWallet(key: JWK): ethers.Wallet { + return new ethers.Wallet(prefixWith0x(base64ToHexString(key.d as string))) +} + +export const prefixWith0x = (key: string): string => (key.startsWith('0x') ? key : `0x${key}`) + +export interface IEnterpriseAuthZToken extends JwtPayload { + sub?: string + did: string + aud: string + nonce: string +} + +export interface LegalEntityTestAuthN { + iss: string // legal entity name identifier + aud: string // RP Application Name. + iat: number + exp: number + nonce: string + callbackUrl?: string // Entity url to send notifications + image?: string // base64 encoded image data + icon?: string // base64 encoded image icon data +} + +export const mockedKeyAndDid = async (): Promise<{ + hexPrivateKey: string + did: string + jwk: JWK + hexPublicKey: string +}> => { + // generate a new keypair + const key = crypto.generateKeyPairSync('ec', { + namedCurve: KeyCurve.SECP256k1, + }) + const privateJwk = await exportJWK(key.privateKey) + const hexPrivateKey = base64ToHexString(privateJwk.d as string) + const wallet: ethers.Wallet = new ethers.Wallet(prefixWith0x(hexPrivateKey)) + const did = `did:ethr:${wallet.address}` + const hexPublicKey = wallet.signingKey.publicKey + + return { + hexPrivateKey, + did, + jwk: privateJwk, + hexPublicKey, + } +} + +const mockedEntityAuthNToken = async ( + enterpiseName?: string, +): Promise<{ + jwt: string + jwk: JWK + did: string + hexPrivateKey: string + hexPublicKey: string +}> => { + // generate a new keypair + const { did, jwk, hexPrivateKey, hexPublicKey } = await mockedKeyAndDid() + + const payload: LegalEntityTestAuthN = { + iss: enterpiseName || 'Test Entity', + aud: 'test', + iat: moment().unix(), + exp: moment().add(15, 'minutes').unix(), + nonce: uuidv4(), + } + + const privateKey = await importJWK(jwk, SigningAlgo.ES256K) + const jwt = await new SignJWT(payload as unknown as JwtPayload) + .setProtectedHeader({ + alg: 'ES256K', + typ: 'JWT', + }) + .sign(privateKey) + return { jwt, jwk, did, hexPrivateKey, hexPublicKey } +} + +export async function mockedGetEnterpriseAuthToken(enterpriseName?: string): Promise<{ + jwt: string + did: string + jwk: JWK + hexPrivateKey: string + hexPublicKey: string +}> { + const testAuth = await mockedEntityAuthNToken(enterpriseName) + const { payload: _payload } = parseJWT(testAuth.jwt) + + const payload = _payload as JwtPayload + const inputPayload: IEnterpriseAuthZToken = { + did: testAuth.did, + + aud: payload?.iss ? payload.iss : 'Test Entity', + nonce: (payload as IEnterpriseAuthZToken).nonce, + } + + const testApiPayload = { + ...inputPayload, + ...{ + sub: (payload as JwtPayload).iss, // Should be the id of the app that is requesting the token + iat: moment().unix(), + exp: moment().add(15, 'minutes').unix(), + aud: 'test', + }, + } + + const privateKey = await importJWK(testAuth.jwk, SigningAlgo.ES256K) + const jwt = await new SignJWT(testApiPayload) + .setProtectedHeader({ + alg: 'ES256K', + typ: 'JWT', + }) + .sign(privateKey) + + return { + jwt, + did: testAuth.did, + jwk: testAuth.jwk, + hexPrivateKey: testAuth.hexPrivateKey, + hexPublicKey: testAuth.hexPublicKey, + } +} + +export interface DidKey { + did: string + publicKeyHex?: string + jwk?: JWK +} + +interface FixJwk extends JWK { + kty: string +} + +export const getParsedDidDocument = (didKey: DidKey): DIDDocument => { + if (didKey.publicKeyHex) { + const didDocB58 = DID_DOCUMENT_PUBKEY_B58 + if (!didDocB58 || !didDocB58.verificationMethod?.[0]) throw new Error('Invalid DID Document') + didDocB58.id = didKey.did + didDocB58.controller = didKey.did + didDocB58.verificationMethod[0].id = `${didKey.did}#keys-1` + didDocB58.verificationMethod[0].controller = didKey.did + didDocB58.verificationMethod[0].publicKeyBase58 = base58.encode(Buffer.from(didKey.publicKeyHex.replace('0x', ''), 'hex')) + return didDocB58 + } + // then didKey jws public key + const didDocJwk = DID_DOCUMENT_PUBKEY_JWK + if (!didDocJwk || !didDocJwk.verificationMethod?.[0]) throw new Error('Invalid DID Document') + const { jwk } = didKey + if (!jwk) throw new Error('Invalid didKey') + jwk.kty = didKey?.jwk?.kty || 'EC' + didDocJwk.id = didKey.did + didDocJwk.controller = didKey.did + didDocJwk.verificationMethod[0].id = `${didKey.did}#keys-1` + didDocJwk.verificationMethod[0].controller = didKey.did + didDocJwk.verificationMethod[0].publicKeyJwk = jwk as FixJwk + return didDocJwk +} + +export const WELL_KNOWN_OPENID_FEDERATION = 'https://www.example.com/.well-known/openid-federation' +export const metadata: { + opMetadata: DiscoveryMetadataPayload + rpMetadata: RPRegistrationMetadataPayload + verify(): unknown +} = { + opMetadata: { + issuer: ResponseIss.SELF_ISSUED_V2, + authorization_endpoint: 'http://test.com', + subject_syntax_types_supported: ['did:web'], + id_token_signing_alg_values_supported: undefined, + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA], + response_types_supported: ResponseType.ID_TOKEN, + scopes_supported: [Scope.OPENID_DIDAUTHN], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 02', + client_name: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 02', + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 02', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 02', + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 02', + }, + rpMetadata: { + client_id: WELL_KNOWN_OPENID_FEDERATION, + id_token_signing_alg_values_supported: [], + request_object_signing_alg_values_supported: [SigningAlgo.EDDSA], + response_types_supported: [ResponseType.ID_TOKEN], + scopes_supported: [Scope.OPENID, Scope.OPENID_DIDAUTHN], + subject_syntax_types_supported: [SubjectSyntaxTypesSupportedValues.DID.valueOf(), 'did:web', 'did:key'], + subject_types_supported: [SubjectType.PAIRWISE], + vp_formats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT + ' 2022-09-29 03', + client_name: VERIFIER_NAME_FOR_CLIENT + ' 2022-09-29 03', + 'client_name#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + ' 2022-09-29 03', + client_purpose: VERIFIERZ_PURPOSE_TO_VERIFY + ' 2022-09-29 03', + 'client_purpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL + ' 2022-09-29 03', + }, + verify() { + return assertValidMetadata(this.opMetadata, this.rpMetadata) + }, +} diff --git a/packages/siop-oid4vp/lib/__tests__/data/mockedData.ts b/packages/siop-oid4vp/lib/__tests__/data/mockedData.ts new file mode 100644 index 00000000..fdc442ac --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/data/mockedData.ts @@ -0,0 +1,141 @@ +import { ServiceTypesEnum } from '@sphereon/wellknown-dids-client' + +import { DIDDocument } from '../ResolverTestUtils' + +export const UNIT_TEST_TIMEOUT = 90000 + +export const VERIFIER_LOGO_FOR_CLIENT = 'https://sphereon.com/content/themes/sphereon/assets/favicons/safari-pinned-tab.svg' + +export const VERIFIER_NAME_FOR_CLIENT = 'Client Verifier Relying Party Sphereon INC' +export const VERIFIER_NAME_FOR_CLIENT_NL = ' *** dutch *** Client Verifier Relying Party Sphereon B.V.' + +export const VERIFIERZ_PURPOSE_TO_VERIFY = 'To request, receive and verify your credential about the the valid subject.' +export const VERIFIERZ_PURPOSE_TO_VERIFY_NL = ' *** Dutch *** To request, receive and verify your credential about the the valid subject.' + +export const DID_DOCUMENT_PUBKEY_B58: DIDDocument = { + assertionMethod: [], + capabilityDelegation: [], + capabilityInvocation: [], + keyAgreement: [], + '@context': 'https://w3id.org/did/v1', + id: 'did:ethr:0xE3f80bcbb360F04865AfA795B7507d384154216C', + controller: 'did:ethr:0xE3f80bcbb360F04865AfA795B7507d384154216C', + authentication: ['did:ethr:0xE3f80bcbb360F04865AfA795B7507d384154216C#key-1'], + verificationMethod: [ + { + id: 'did:ethr:0xE3f80bcbb360F04865AfA795B7507d384154216C#key-1', + type: 'EcdsaSecp256k1VerificationKey2019', + controller: 'did:ethr:0xE3f80bcbb360F04865AfA795B7507d384154216C', + publicKeyBase58: 'PSPfR29Snu5yxJcLHf2t6SyJ9mttet19ECkDHr4HY3FD5YC8ZenjvspPSAGSpaQ8B8kXADV97WSd7JqaNAUTn8YG', + }, + ], +} + +export const DID_DOCUMENT_PUBKEY_JWK: DIDDocument = { + assertionMethod: [], + capabilityDelegation: [], + capabilityInvocation: [], + keyAgreement: [], + '@context': 'https://w3id.org/did/v1', + id: 'did:ethr:0x96e9A346905a8F8D5ee0e6BA5D13456965e74513', + controller: 'did:ethr:0x96e9A346905a8F8D5ee0e6BA5D13456965e74513', + authentication: ['did:ethr:0x96e9A346905a8F8D5ee0e6BA5D13456965e74513#JTa8+HgHPyId90xmMFw6KRD4YUYLosBuWJw33nAuRS0='], + verificationMethod: [ + { + id: 'did:ethr:0x96e9A346905a8F8D5ee0e6BA5D13456965e74513#JTa8+HgHPyId90xmMFw6KRD4YUYLosBuWJw33nAuRS0=', + type: 'EcdsaSecp256k1VerificationKey2019', + controller: 'did:ethr:0x96e9A346905a8F8D5ee0e6BA5D13456965e74513', + publicKeyJwk: { + kty: 'EC', + crv: 'secp256k1', + x: '62451c7a3e0c6e2276960834b79ae491ba0a366cd6a1dd814571212ffaeaaf5a', + y: '1ede3d754090437db67eca78c1659498c9cf275d2becc19cdc8f1ef76b9d8159', + kid: 'JTa8+HgHPyId90xmMFw6KRD4YUYLosBuWJw33nAuRS0=', + }, + }, + ], +} + +export const DID_KEY = 'did:key:z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS' + +export const DID_KEY_ORIGIN = 'https://example.com' + +export const DID_KEY_DOCUMENT = { + '@context': [ + 'https://www.w3.org/ns/did/v1', + { + Ed25519VerificationKey2018: 'https://w3id.org/security#Ed25519VerificationKey2018', + publicKeyJwk: { + '@id': 'https://w3id.org/security#publicKeyJwk', + '@type': '@json', + }, + }, + ], + id: DID_KEY, + verificationMethod: [ + { + id: `${DID_KEY}#z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS`, + type: 'Ed25519VerificationKey2018', + controller: DID_KEY, + publicKeyJwk: { + kty: 'OKP', + crv: 'Ed25519', + x: '1ztBkC3x-8Eu8uPNTkTgH1Q0tkuO8v8RJDqfqWFl1N8', + }, + }, + ], + authentication: [`${DID_KEY}#z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS`], + assertionMethod: [`${DID_KEY}#z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS`], + service: [ + { + id: `${DID_KEY}#z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS`, + type: ServiceTypesEnum.LINKED_DOMAINS, + serviceEndpoint: DID_KEY_ORIGIN, + }, + ], +} as DIDDocument + +export const VC_KEY_PAIR = { + type: 'Ed25519VerificationKey2020', + id: `${DID_KEY}#z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS`, + controller: `${DID_KEY_ORIGIN}/1234`, + publicKeyMultibase: 'z6MktwS79rvBjzRX8a8PPiURqG7HMJAfACTiozFkPJeJHRxS', + privateKeyMultibase: 'zrv4UTisGEUxoZr1enXeC7NMVapzq48KkS1rLSpBvpTyg1v3cLo7g5SnprD1eD4bdKdYHHMu5feATzatSAkbhgXgtZU', +} + +export const DID_ION = + 'did:ion:EiCMvVdXv6iL3W8i4n-LmqUhE614kX4TYxVR5kTY2QGOjg:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXkxIiwicHVibGljS2V5SndrIjp7ImNydiI6InNlY3AyNTZrMSIsImt0eSI6IkVDIiwieCI6Ii1MbHNpQVk5b3JmMXpKQlJOV0NuN0RpNUpoYl8tY2xhNlY5R3pHa3FmSFUiLCJ5IjoiRXBIU25GZHQ2ZU5lRkJEZzNVNVFIVDE0TVRsNHZIc0h5NWRpWU9DWEs1TSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiIsImFzc2VydGlvbk1ldGhvZCJdLCJ0eXBlIjoiRWNkc2FTZWNwMjU2azFWZXJpZmljYXRpb25LZXkyMDE5In1dLCJzZXJ2aWNlcyI6W3siaWQiOiJsZCIsInNlcnZpY2VFbmRwb2ludCI6Imh0dHBzOi8vbGR0ZXN0LnNwaGVyZW9uLmNvbSIsInR5cGUiOiJMaW5rZWREb21haW5zIn1dfX1dLCJ1cGRhdGVDb21taXRtZW50IjoiRWlBem8wTVVZUW5HNWM0VFJKZVFsNFR5WVRrSmRyeTJoeXlQUlpENzdFQm1CdyJ9LCJzdWZmaXhEYXRhIjp7ImRlbHRhSGFzaCI6IkVpQUwtaEtrLUVsODNsRVJiZkFDUk1kSWNQVjRXWGJqZ3dsZ1ZDWTNwbDhhMGciLCJyZWNvdmVyeUNvbW1pdG1lbnQiOiJFaUItT2NSbTlTNXdhU3QxbU4zSG4zM2RnMzJKN25MOEdBVHpGQ2ZXaWdIXzh3In19' + +export const DID_ION_ORIGIN = 'https://ldtest.sphereon.com' + +export const DID_ION_DOCUMENT = { + id: DID_ION, + '@context': [ + 'https://www.w3.org/ns/did/v1', + { + '@base': DID_ION, + }, + ], + service: [ + { + id: '#ld', + type: 'LinkedDomains', + serviceEndpoint: DID_ION_ORIGIN, + }, + ], + verificationMethod: [ + { + id: '#key1', + controller: DID_ION, + type: 'EcdsaSecp256k1VerificationKey2019', + publicKeyJwk: { + kty: 'EC', + crv: 'secp256k1', + x: '-LlsiAY9orf1zJBRNWCn7Di5Jhb_-cla6V9GzGkqfHU', + y: 'EpHSnFdt6eNeFBDg3U5QHT14MTl4vHsHy5diYOCXK5M', + }, + }, + ], + authentication: ['#key1'], + assertionMethod: ['#key1'], +} diff --git a/packages/siop-oid4vp/lib/__tests__/e2e/EBSI.spec.ts b/packages/siop-oid4vp/lib/__tests__/e2e/EBSI.spec.ts new file mode 100644 index 00000000..1a78d511 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/e2e/EBSI.spec.ts @@ -0,0 +1,123 @@ +import { getResolver as getKeyResolver } from '@cef-ebsi/key-did-resolver' +// import { EbsiWallet } from '@cef-ebsi/wallet-lib'; +import EbsiWallet from '@cef-ebsi/wallet-lib' +import { PresentationSignCallBackParams } from '@sphereon/pex' +import { parseDid, W3CVerifiablePresentation } from '@sphereon/ssi-types' +import { Resolver } from 'did-resolver' +import { importJWK, JWK, SignJWT } from 'jose' +import { v4 as uuidv4 } from 'uuid' + +import { OP, SigningAlgo } from '../../' +import { getCreateJwtCallback, getVerifyJwtCallback } from '../DidJwtTestUtils' + +const ID_TOKEN_REQUEST_URL = 'https://api-conformance.ebsi.eu/conformance/v3/auth-mock/id_token_request' + +export const UNIT_TEST_TIMEOUT = 30000 +export const jwk: JWK = { + alg: 'ES256', + kty: 'EC', + use: 'sig', + crv: 'P-256', + x: '9ggs4Cm4VXcKOePpjkL9iSyMCa22yOjbo-oUXpy-aw0', + y: 'lEXW7b_J7lceiVEtrfptvuPeENsOJl-fhzmu654GPR8', +} +const hexPrivateKey = '47dc6ae067aa011f8574d2da7cf8c326538af08b85e6779d192a9893291c9a0a' + +const nonce = uuidv4() +export const generateDid = () => { + const did = EbsiWallet.createDid('NATURAL_PERSON', jwk) + return did +} + +const keyResolver = getKeyResolver() + +const didStr = generateDid() +const kid = `${didStr}#${parseDid(didStr).id}` + +describe('EBSI SIOPv2 should', () => { + async function testWithOp() { + const did = generateDid(/*{ seed: u8a.fromString(hexPrivateKey, 'base16') }*/) + expect(did).toBeDefined() + + const authRequestURL = await getAuthRequestURL({ nonce }) + expect(authRequestURL).toBeDefined() + expect(authRequestURL).toContain('openid://?state=') + expect(authRequestURL).toContain(nonce) + + const correlationId = 'test' + + const resolver = new Resolver(keyResolver) + const op: OP = OP.builder() + .withPresentationSignCallback(presentationSignCalback) + .withCreateJwtCallback(getCreateJwtCallback({ alg: SigningAlgo.ES256, kid, did: didStr, hexPrivateKey })) + .withVerifyJwtCallback(getVerifyJwtCallback(resolver, { checkLinkedDomain: 'never' })) + .build() + + const verifiedAuthRequest = await op.verifyAuthorizationRequest(authRequestURL, { correlationId }) + expect(verifiedAuthRequest).toBeDefined() + + const authResponse = await op.createAuthorizationResponse(verifiedAuthRequest, { + issuer: didStr, + correlationId, + jwtIssuer: { + method: 'did', + didUrl: kid, + alg: SigningAlgo.ES256, + }, + }) + + expect(authResponse).toBeDefined() + expect(authResponse.response.payload).toBeDefined() + console.log(JSON.stringify(authResponse)) + + const result = await op.submitAuthorizationResponse(authResponse) + console.log(result.statusText) + console.log(await result.text()) + expect(result.status).toEqual(204) + } + + it.skip( + 'succeed with an id token only', + async () => { + await testWithOp() + }, + UNIT_TEST_TIMEOUT, + ) + + async function getAuthRequestURL({ nonce }: { nonce: string }): Promise { + const credentialOffer = await fetch(ID_TOKEN_REQUEST_URL, { + method: 'post', + headers: { + Accept: 'text/plain', + 'Content-Type': 'application/json', + }, + + //make sure to serialize your JSON body + body: JSON.stringify({ + nonce, + }), + }) + + return await credentialOffer.text() + } + + async function presentationSignCalback(args: PresentationSignCallBackParams): Promise { + const importedJwk = await importJWK(jwk, 'ES256') + const jwt = await new SignJWT({ + vp: { ...args.presentation }, + nonce: args.options.proofOptions?.nonce, + iss: args.options.holderDID, + }) + .setProtectedHeader({ + typ: 'JWT', + alg: 'ES256', + kid, + }) + .setIssuedAt() + .setExpirationTime('2h') + .sign(importedJwk) + + console.log(`VP: ${jwt}`) + return jwt + } +}) diff --git a/packages/siop-oid4vp/lib/__tests__/e2e/mattr.launchpad.spec.ts b/packages/siop-oid4vp/lib/__tests__/e2e/mattr.launchpad.spec.ts new file mode 100644 index 00000000..08bb969a --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/e2e/mattr.launchpad.spec.ts @@ -0,0 +1,265 @@ +import { PresentationSignCallBackParams, PresentationSubmissionLocation } from '@sphereon/pex' +import { W3CVerifiablePresentation } from '@sphereon/ssi-types' +import * as ed25519 from '@transmute/did-key-ed25519' +import { fetch } from 'cross-fetch' +import { DIDDocument, DIDResolutionResult } from 'did-resolver' +import { importJWK, JWK, SignJWT } from 'jose' +import * as u8a from 'uint8arrays' + +import { + AuthorizationRequest, + AuthorizationResponse, + OP, + PresentationDefinitionWithLocation, + PresentationExchange, + SigningAlgo, + SupportedVersion, +} from '../..' +import { getCreateJwtCallback, getVerifyJwtCallback } from '../DidJwtTestUtils' + +export interface InitiateOfferRequest { + types: string[] +} + +export interface InitiateOfferResponse { + authorizeRequestUri: string + state: string + nonce: string +} + +export const UNIT_TEST_TIMEOUT = 30000 + +export const VP_CREATE_URL = 'https://launchpad.mattrlabs.com/api/vp/create' + +export const OPENBADGE_JWT_VC = + 'eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDp3ZWI6bGF1bmNocGFkLnZpaS5lbGVjdHJvbi5tYXR0cmxhYnMuaW8jNkJoRk1DR1RKZyJ9.eyJpc3MiOiJkaWQ6d2ViOmxhdW5jaHBhZC52aWkuZWxlY3Ryb24ubWF0dHJsYWJzLmlvIiwic3ViIjoiZGlkOmtleTp6Nk1raXRHVmduTGRORlpqbUE5WEpwQThrM29lakVudU1GN205NkJEN3BaTGprWTIiLCJuYmYiOjE2OTYzNjA1MTEsImV4cCI6MTcyNzk4MjkxMSwidmMiOnsibmFtZSI6IkV4YW1wbGUgVW5pdmVyc2l0eSBEZWdyZWUiLCJkZXNjcmlwdGlvbiI6IkpGRiBQbHVnZmVzdCAzIE9wZW5CYWRnZSBDcmVkZW50aWFsIiwiY3JlZGVudGlhbEJyYW5kaW5nIjp7ImJhY2tncm91bmRDb2xvciI6IiM0NjRjNDkifSwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL21hdHRyLmdsb2JhbC9jb250ZXh0cy92Yy1leHRlbnNpb25zL3YyIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9vYi92M3AwL2NvbnRleHQtMy4wLjIuanNvbiIsImh0dHBzOi8vcHVybC5pbXNnbG9iYWwub3JnL3NwZWMvb2IvdjNwMC9leHRlbnNpb25zLmpzb24iLCJodHRwczovL3czaWQub3JnL3ZjLXJldm9jYXRpb24tbGlzdC0yMDIwL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJPcGVuQmFkZ2VDcmVkZW50aWFsIl0sImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1raXRHVmduTGRORlpqbUE5WEpwQThrM29lakVudU1GN205NkJEN3BaTGprWTIiLCJ0eXBlIjpbIkFjaGlldmVtZW50U3ViamVjdCJdLCJhY2hpZXZlbWVudCI6eyJpZCI6Imh0dHBzOi8vZXhhbXBsZS5jb20vYWNoaWV2ZW1lbnRzLzIxc3QtY2VudHVyeS1za2lsbHMvdGVhbXdvcmsiLCJuYW1lIjoiVGVhbXdvcmsiLCJ0eXBlIjpbIkFjaGlldmVtZW50Il0sImltYWdlIjp7ImlkIjoiaHR0cHM6Ly93M2MtY2NnLmdpdGh1Yi5pby92Yy1lZC9wbHVnZmVzdC0zLTIwMjMvaW1hZ2VzL0pGRi1WQy1FRFUtUExVR0ZFU1QzLWJhZGdlLWltYWdlLnBuZyIsInR5cGUiOiJJbWFnZSJ9LCJjcml0ZXJpYSI6eyJuYXJyYXRpdmUiOiJUZWFtIG1lbWJlcnMgYXJlIG5vbWluYXRlZCBmb3IgdGhpcyBiYWRnZSBieSB0aGVpciBwZWVycyBhbmQgcmVjb2duaXplZCB1cG9uIHJldmlldyBieSBFeGFtcGxlIENvcnAgbWFuYWdlbWVudC4ifSwiZGVzY3JpcHRpb24iOiJUaGlzIGJhZGdlIHJlY29nbml6ZXMgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBjYXBhY2l0eSB0byBjb2xsYWJvcmF0ZSB3aXRoaW4gYSBncm91cCBlbnZpcm9ubWVudC4ifX0sImlzc3VlciI6eyJpZCI6ImRpZDp3ZWI6bGF1bmNocGFkLnZpaS5lbGVjdHJvbi5tYXR0cmxhYnMuaW8iLCJuYW1lIjoiRXhhbXBsZSBVbml2ZXJzaXR5IiwiaWNvblVybCI6Imh0dHBzOi8vdzNjLWNjZy5naXRodWIuaW8vdmMtZWQvcGx1Z2Zlc3QtMS0yMDIyL2ltYWdlcy9KRkZfTG9nb0xvY2t1cC5wbmciLCJpbWFnZSI6Imh0dHBzOi8vdzNjLWNjZy5naXRodWIuaW8vdmMtZWQvcGx1Z2Zlc3QtMS0yMDIyL2ltYWdlcy9KRkZfTG9nb0xvY2t1cC5wbmcifX19.JDQ5kp_nvqJbL9Q8o2xIdt_r_WG0cB1o-Boy1RiDZhXRlVTgwAxvCa41OiL97VnbovN98tL7VtXbM6slAt6TBg' + +export const jwk: JWK = { + crv: 'Ed25519', + d: 'kTRm0aONHYwNPA-w_DtjMHUIWjE3K70qgCIhWojZ0eU', + x: 'NeA0d8sp86xRh3DczU4m5wPNIbl0HCSwOBcMN3sNmdk', + kty: 'OKP', +} + +// pub hex: 35e03477cb29f3ac518770dccd4e26e703cd21b9741c24b038170c377b0d99d9 +const hexPrivateKey = '913466d1a38d1d8c0d3c0fb0fc3b633075085a31372bbd2a8022215a88d9d1e5' + +const didStr = `did:key:z6Mki5ZwZKN1dBQprfJTikUvkDxrHijiiQngkWviMF5gw2Hv` +const kid = `${didStr}#z6Mki5ZwZKN1dBQprfJTikUvkDxrHijiiQngkWviMF5gw2Hv` + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const generateCustomDid = async (opts?: { seed?: Uint8Array }): Promise<{ keys: any; didDocument: DIDDocument }> => { + const { didDocument, keys } = await ed25519.generate( + { + secureRandom: () => { + return opts?.seed ?? '913466d1a38d1d8c0d3c0fb0fc3b633075085a31372bbd2a8022215a88d9d1e5' + }, + }, + { accept: 'application/did+json' }, + ) + + return { keys, didDocument } +} + +const resolve = async (didUrl: string): Promise => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return await didKeyResolve(didUrl, options) +} + +const getResolver = () => { + return { resolve } +} + +describe('OID4VCI-Client using Mattr issuer should', () => { + async function testWithOp(format: string | string[]) { + const did = await generateCustomDid({ seed: u8a.fromString(hexPrivateKey, 'base16') }) + expect(did).toBeDefined() + expect(did.didDocument).toBeDefined() + + const offer = await getOffer(format) + const { authorizeRequestUri, state, nonce } = offer + expect(authorizeRequestUri).toBeDefined() + expect(state).toBeDefined() + expect(nonce).toBeDefined() + + const correlationId = 'test' + + const op: OP = OP.builder() + .withPresentationSignCallback(presentationSignCalback) + .withCreateJwtCallback(getCreateJwtCallback({ alg: SigningAlgo.EDDSA, kid, did: didStr, hexPrivateKey })) + .withVerifyJwtCallback(getVerifyJwtCallback(getResolver(), { checkLinkedDomain: 'never' })) + .build() + + const verifiedAuthRequest = await op.verifyAuthorizationRequest(authorizeRequestUri, { correlationId }) + expect(verifiedAuthRequest).toBeDefined() + expect(verifiedAuthRequest.presentationDefinitions).toHaveLength(1) + + const pex = new PresentationExchange({ allDIDs: [didStr], allVerifiableCredentials: [OPENBADGE_JWT_VC] }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + verifiedAuthRequest.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, [OPENBADGE_JWT_VC], presentationSignCalback, { + presentationSubmissionLocation: PresentationSubmissionLocation.EXTERNAL, + proofOptions: { nonce }, + holderDID: didStr, + }) + + const authResponse = await op.createAuthorizationResponse(verifiedAuthRequest, { + issuer: didStr, + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + }, + correlationId, + jwtIssuer: { + method: 'did', + didUrl: kid, + alg: SigningAlgo.EDDSA, + }, + }) + + expect(authResponse).toBeDefined() + expect(authResponse.response.payload).toBeDefined() + expect(authResponse.response.payload.presentation_submission).toBeDefined() + expect(authResponse.response.payload.vp_token).toBeDefined() + + const result = await op.submitAuthorizationResponse(authResponse) + expect(result.status).toEqual(200) + } + + async function testWithPayloads(format: string | string[]) { + const did = await generateCustomDid({ seed: u8a.fromString(hexPrivateKey, 'base16') }) + expect(did).toBeDefined() + expect(did.didDocument).toBeDefined() + + const offer = await getOffer(format) + const { authorizeRequestUri, state, nonce } = offer + expect(authorizeRequestUri).toBeDefined() + expect(state).toBeDefined() + expect(nonce).toBeDefined() + + const correlationId = 'test' + + const verifiedAuthRequest = await AuthorizationRequest.verify(authorizeRequestUri, { + correlationId, + verifyJwtCallback: getVerifyJwtCallback(getResolver()), + verification: {}, + }) + expect(verifiedAuthRequest).toBeDefined() + expect(verifiedAuthRequest.presentationDefinitions).toHaveLength(1) + + const pex = new PresentationExchange({ allDIDs: [didStr], allVerifiableCredentials: [OPENBADGE_JWT_VC] }) + const pd: PresentationDefinitionWithLocation[] = await PresentationExchange.findValidPresentationDefinitions( + verifiedAuthRequest.authorizationRequestPayload, + ) + await pex.selectVerifiableCredentialsForSubmission(pd[0].definition) + const verifiablePresentationResult = await pex.createVerifiablePresentation(pd[0].definition, [OPENBADGE_JWT_VC], presentationSignCalback, { + presentationSubmissionLocation: PresentationSubmissionLocation.EXTERNAL, + proofOptions: { nonce }, + holderDID: didStr, + }) + + const authResponse = await AuthorizationResponse.fromVerifiedAuthorizationRequest( + verifiedAuthRequest, + { + jwtIssuer: { + method: 'did', + didUrl: kid, + alg: SigningAlgo.EDDSA, + }, + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: verifiablePresentationResult.presentationSubmission, + }, + createJwtCallback: getCreateJwtCallback({ + hexPrivateKey: '913466d1a38d1d8c0d3c0fb0fc3b633075085a31372bbd2a8022215a88d9d1e5', + did: didStr, + kid, + alg: SigningAlgo.EDDSA, + }), + }, + { + correlationId, + verifyJwtCallback: getVerifyJwtCallback(getResolver()), + verification: {}, + nonce, + state, + }, + ) + + expect(authResponse).toBeDefined() + expect(authResponse.payload).toBeDefined() + expect(authResponse.payload.presentation_submission).toBeDefined() + expect(authResponse.payload.vp_token).toBeDefined() + } + + it( + 'succeed using OpenID4VCI version 11 and ldp_vc request/responses', + async () => { + await testWithPayloads('OpenBadgeCredential') + }, + UNIT_TEST_TIMEOUT, + ) + it( + 'succeed in a full flow with the client using OpenID4VCI version 11 and jwt_vc_json', + async () => { + await testWithOp('OpenBadgeCredential') + }, + UNIT_TEST_TIMEOUT, + ) +}) + +async function getOffer(types: string | string[]): Promise { + const credentialOffer = await fetch(VP_CREATE_URL, { + method: 'post', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + + //make sure to serialize your JSON body + body: JSON.stringify({ + types: Array.isArray(types) ? types : [types], + }), + }) + + return (await credentialOffer.json()) as InitiateOfferResponse +} + +describe('Mattr OID4VP v18 credential offer', () => { + test('should verify using request directly', async () => { + const offer = await getOffer('OpenBadgeCredential') + const authorizationRequest = await AuthorizationRequest.fromUriOrJwt(offer.authorizeRequestUri) + + const verification = await authorizationRequest.verify({ + verifyJwtCallback: getVerifyJwtCallback(getResolver()), + correlationId: 'test', + verification: {}, + }) + + expect(verification).toBeDefined() + expect(verification.versions).toEqual([SupportedVersion.SIOPv2_D12_OID4VP_D20, SupportedVersion.SIOPv2_D12_OID4VP_D18]) + + /** + * pd value: {"id":"dae5d9b6-8145-4297-99b2-b8fcc5abb5ad","input_descriptors":[{"id":"OpenBadgeCredential","format":{"jwt_vc_json":{"alg":["EdDSA"]},"jwt_vc":{"alg":["EdDSA"]}},"constraints":{"fields":[{"path":["$.vc.type"],"filter":{"type":"array","items":{"type":"string"},"contains":{"const":"OpenBadgeCredential"}}}]}}]} + */ + }) +}) + +async function presentationSignCalback(args: PresentationSignCallBackParams): Promise { + const importedJwk = await importJWK(jwk, 'EdDSA') + const jwt = await new SignJWT({ vp: { ...args.presentation }, nonce: args.options.proofOptions?.nonce, iss: args.options.holderDID }) + .setProtectedHeader({ + typ: 'JWT', + alg: 'EdDSA', + kid, + }) + .setIssuedAt() + .setExpirationTime('2h') + .sign(importedJwk) + + console.log(`VP: ${jwt}`) + return jwt +} diff --git a/packages/siop-oid4vp/lib/__tests__/functions/DidSiopMetadata.spec.ts b/packages/siop-oid4vp/lib/__tests__/functions/DidSiopMetadata.spec.ts new file mode 100644 index 00000000..a6f8d6aa --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/functions/DidSiopMetadata.spec.ts @@ -0,0 +1,64 @@ +import { Format } from '@sphereon/pex-models' +import { IProofType } from '@sphereon/ssi-types' + +import { SigningAlgo, SIOPErrors, supportedCredentialsFormats } from '../..' + +describe('DidSiopMetadata should ', () => { + it('find supportedCredentialsFormats correctly', async function () { + const rpFormat: Format = { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + } + const opFormat: Format = { + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + } + expect(supportedCredentialsFormats(rpFormat, opFormat)).toStrictEqual({ jwt_vc: { alg: ['ES256', 'ES256K'] } }) + }) + + it('throw CREDENTIAL_FORMATS_NOT_SUPPORTED for algs not matching', async function () { + const rpFormat: Format = { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + jwt_vc: { + alg: [SigningAlgo.ES256K], + }, + } + const opFormat: Format = { + jwt_vc: { + alg: [SigningAlgo.ES256], + }, + } + expect(() => supportedCredentialsFormats(rpFormat, opFormat)).toThrow(SIOPErrors.CREDENTIAL_FORMATS_NOT_SUPPORTED) + }) + + it('throw CREDENTIAL_FORMATS_NOT_SUPPORTED for types not matching', async function () { + const rpFormat: Format = { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + } + const opFormat: Format = { + jwt_vc: { + alg: [SigningAlgo.ES256], + }, + } + expect(() => supportedCredentialsFormats(rpFormat, opFormat)).toThrow(SIOPErrors.CREDENTIAL_FORMATS_NOT_SUPPORTED) + }) + + it('throw CREDENTIALS_FORMATS_NOT_PROVIDED', async function () { + const rpFormat: Format = {} + const opFormat: Format = { + jwt_vc: { + alg: [SigningAlgo.ES256, SigningAlgo.ES256K], + }, + } + expect(() => supportedCredentialsFormats(rpFormat, opFormat)).toThrow(SIOPErrors.CREDENTIALS_FORMATS_NOT_PROVIDED) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/functions/Encodings.spec.ts b/packages/siop-oid4vp/lib/__tests__/functions/Encodings.spec.ts new file mode 100644 index 00000000..7990aa62 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/functions/Encodings.spec.ts @@ -0,0 +1,51 @@ +import { encodeJsonAsURI } from '../..' + +describe('Encodings', () => { + /*test('encodeAsUriValue', () => { + expect(encodeAsUriValue(undefined, { a: { b: { c: 'd', e: 'f' } } })).toBe('a%5Bb%5D%5Bc%5D=d&a%5Bb%5D%5Be%5D=f'); + + expect(encodeAsUriValue(undefined, { a: ['b', 'c', 'd'] })).toBe('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d'); + + expect( + encodeAsUriValue(undefined, { + a: { + b: { + 'a$s939very-2eweird-==key': { + c: 'd', + }, + }, + }, + }) + ).toBe('a%5Bb%5D%5Ba%24s939very-2eweird-%3D%3Dkey%5D%5Bc%5D=d'); + });*/ + + test('encodeJsonAsURI', () => { + const encoded = encodeJsonAsURI( + { + presentation_submission: { + id: 'bbYJTQe7YPvVx-3rLl4Aq', + definition_id: '000fc41b-2859-4fc3-b797-510492a9479a', + descriptor_map: [ + { + id: 'OpenBadgeCredential', + format: 'jwt_vp', + path: '$', + path_nested: { + id: 'OpenBadgeCredential', + format: 'jwt_vc_json', + path: '$.vp.verifiableCredential[0]', + }, + }, + ], + }, + vp_token: ['ey...1', 'ey...2'], + vp_token_single: 'ey...3', + }, + /*{ arraysWithIndex: ['presentation_submission', 'vp_token', 'vp_token_single'] }*/ + ) + + expect(encoded).toBe( + `presentation_submission=%7B%22id%22%3A%22bbYJTQe7YPvVx-3rLl4Aq%22%2C%22definition_id%22%3A%22000fc41b-2859-4fc3-b797-510492a9479a%22%2C%22descriptor_map%22%3A%5B%7B%22id%22%3A%22OpenBadgeCredential%22%2C%22format%22%3A%22jwt_vp%22%2C%22path%22%3A%22%24%22%2C%22path_nested%22%3A%7B%22id%22%3A%22OpenBadgeCredential%22%2C%22format%22%3A%22jwt_vc_json%22%2C%22path%22%3A%22%24.vp.verifiableCredential%5B0%5D%22%7D%7D%5D%7D&vp_token=%5B%22ey...1%22%2C%22ey...2%22%5D&vp_token_single=ey...3`, + ) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/functions/LanguageTagUtils.spec.ts b/packages/siop-oid4vp/lib/__tests__/functions/LanguageTagUtils.spec.ts new file mode 100644 index 00000000..18eb5551 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/functions/LanguageTagUtils.spec.ts @@ -0,0 +1,258 @@ +import { LanguageTagUtils } from '../..' + +describe('Language tag util should', () => { + it('return no lingually tagged fields if there are no lingually tagged fields in the source object', async () => { + expect.assertions(1) + const source = { nonLanguageTaggedFieldName: 'value' } + expect(LanguageTagUtils.getAllLanguageTaggedProperties(source)).toEqual(new Map()) + }) + + it('return all lingually tagged fields if there are lingually tagged fields in the source object', async () => { + expect.assertions(1) + const source = { + FieldNameWithoutLanguageTag: 'value', + 'FieldNameWithLanguageTag#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag#en-US': 'englishValue', + } + + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields regardless of capitalization if there are lingually tagged fields in the source object', async () => { + expect.assertions(1) + const source = { + FieldNameWithoutLanguageTag: 'value', + 'FieldNameWithLanguageTag#nl-nl': 'dutchValue', + 'FieldNameWithLanguageTag#en-US': 'englishValue', + } + + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag#nl-nl', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields if there are only lingually tagged fields in the source object', async () => { + expect.assertions(1) + const source = { + 'FieldNameWithLanguageTag#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields if there are multiple lingually tagged fields in the source object but no non-lingually tagged fields', async () => { + expect.assertions(1) + const source = { + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but no non-lingually tagged fields', async () => { + expect.assertions(1) + const source = { + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag1#en-US', 'englishValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but there is a non-lingually tagged field', async () => { + expect.assertions(1) + const source = { + nonLanguageTaggedFieldName: 'value', + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag1#en-US', 'englishValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return all lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but there are non-lingually tagged fields', async () => { + expect.assertions(1) + const source = { + nonLanguageTaggedFieldName: 'value', + nonLanguageTaggedFieldName2: 'value', + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag1#en-US', 'englishValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return no lingually tagged fields if there are incorrect lingually tagged fields in the source object', async () => { + expect.assertions(1) + const source = { + 'FieldNameWithLanguageTag2#en-EN': 'englishValue', + } + + const allLanguageTaggedProperties = LanguageTagUtils.getAllLanguageTaggedProperties(source) + expect(allLanguageTaggedProperties).toEqual(new Map()) + }) + + it('return non-mapped lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but there are non-lingually tagged fields as well', async () => { + expect.assertions(1) + const source = { + nonLanguageTaggedFieldName: 'value', + nonLanguageTaggedFieldName2: 'value', + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag1#en-US', 'englishValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag2#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getLanguageTaggedProperties(source, [ + 'FieldNameWithLanguageTag1', + 'FieldNameWithLanguageTag2', + ]) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return only desired non-mapped lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but there are non-lingually tagged fields as well', async () => { + expect.assertions(1) + const source = { + nonLanguageTaggedFieldName: 'value', + nonLanguageTaggedFieldName2: 'value', + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('FieldNameWithLanguageTag1#nl-NL', 'dutchValue') + expectedTaggedFields.set('FieldNameWithLanguageTag1#en-US', 'englishValue') + + const allLanguageTaggedProperties = LanguageTagUtils.getLanguageTaggedProperties(source, ['FieldNameWithLanguageTag1']) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('return only desired mapped lingually tagged fields if there are multiple lingually tagged fields in multiple languages in the source object but there are non-lingually tagged fields as well', async () => { + expect.assertions(1) + const source = { + nonLanguageTaggedFieldName: 'value', + nonLanguageTaggedFieldName2: 'value', + 'FieldNameWithLanguageTag1#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag1#en-US': 'englishValue', + 'FieldNameWithLanguageTag2#nl-NL': 'dutchValue', + 'FieldNameWithLanguageTag2#en-US': 'englishValue', + } + const expectedTaggedFields = new Map() + expectedTaggedFields.set('field_name_with_Language_tag_1#nl-NL', 'dutchValue') + expectedTaggedFields.set('field_name_with_Language_tag_1#en-US', 'englishValue') + + const languageTagEnabledFieldsNamesMapping = new Map() + languageTagEnabledFieldsNamesMapping.set('FieldNameWithLanguageTag1', 'field_name_with_Language_tag_1') + + const allLanguageTaggedProperties = LanguageTagUtils.getLanguageTaggedPropertiesMapped(source, languageTagEnabledFieldsNamesMapping) + expect(allLanguageTaggedProperties).toEqual(expectedTaggedFields) + }) + + it('throw error if source is null', async () => { + expect.assertions(1) + await expect(() => LanguageTagUtils.getAllLanguageTaggedProperties(null)).toThrowError() + }) + + it('throw error if list is null', async () => { + expect.assertions(1) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(() => LanguageTagUtils.getLanguageTaggedProperties({}, null as any)).toThrowError() + }) + + it('throw error if list is given but not effective', async () => { + expect.assertions(1) + await expect(() => LanguageTagUtils.getLanguageTaggedProperties({}, [])).toThrowError() + }) + + it('throw error if list is given but no proper field names', async () => { + expect.assertions(1) + await expect(() => LanguageTagUtils.getLanguageTaggedProperties({}, [''])).toThrowError() + }) + + it('do not throw error if mapping is null', async () => { + expect.assertions(1) + expect(LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, null as any)).toEqual(new Map()) + }) + + it('throw error if mapping is given but not effective', async () => { + expect.assertions(1) + await expect(() => LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, new Map())).toThrowError() + }) + + it('throw error if mapping is given but no proper names', async () => { + expect.assertions(1) + const languageTagEnabledFieldsNamesMapping: Map = new Map() + languageTagEnabledFieldsNamesMapping.set(null as any, 'valid') + await expect(() => LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, languageTagEnabledFieldsNamesMapping)).toThrowError() + }) + + it('throw error if mapping is given but no proper field names', async () => { + expect.assertions(1) + const languageTagEnabledFieldsNamesMapping: Map = new Map() + languageTagEnabledFieldsNamesMapping.set('', 'valid') + await expect(() => LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, languageTagEnabledFieldsNamesMapping)).toThrowError() + }) + + it('throw error if mapping is given but no mapped names', async () => { + expect.assertions(1) + const languageTagEnabledFieldsNamesMapping: Map = new Map() + languageTagEnabledFieldsNamesMapping.set('valid', null as any) + await expect(() => LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, languageTagEnabledFieldsNamesMapping)).toThrowError() + }) + + it('throw error if mapping is given but no proper mapped names', async () => { + expect.assertions(1) + const languageTagEnabledFieldsNamesMapping: Map = new Map() + languageTagEnabledFieldsNamesMapping.set('valid', '') + await expect(() => LanguageTagUtils.getLanguageTaggedPropertiesMapped({}, languageTagEnabledFieldsNamesMapping)).toThrowError() + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/interop/EBSI/EBSI.spec.ts b/packages/siop-oid4vp/lib/__tests__/interop/EBSI/EBSI.spec.ts new file mode 100644 index 00000000..9caf78ae --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/interop/EBSI/EBSI.spec.ts @@ -0,0 +1,66 @@ +import nock from 'nock' + +import { AuthorizationResponseOpts, OP, SupportedVersion, VerifyAuthorizationRequestOpts } from '../../../' +import { getVerifyJwtCallback } from '../../DidJwtTestUtils' +import { getResolver } from '../../ResolverTestUtils' +import { UNIT_TEST_TIMEOUT } from '../../data/mockedData' + +const SIOP_URI = + 'openid://?state=3f3a673a-7835-42f1-a03e-b186fd042dcc&client_id=https%3A%2F%2Fconformance-test.ebsi.eu%2Fconformance%2Fv3%2Fauth-mock&redirect_uri=https%3A%2F%2Fconformance-test.ebsi.eu%2Fconformance%2Fv3%2Fauth-mock%2Fdirect_post&response_type=id_token&response_mode=direct_post&scope=openid&nonce=3a50effa-4505-42ce-8708-0c4ab32378dd&request_uri=https%3A%2F%2Fconformance-test.ebsi.eu%2Fconformance%2Fv3%2Fauth-mock%2Frequest_uri%2F4cb2dc1f-61a4-46b7-9660-06d62dd99700' +const JWT = + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IkZMeEkzTE04bUZDRkNEMUg0VmpacVd0MVBmaWQyaThBQ1lpRHZFelo5VU0ifQ.eyJzdGF0ZSI6IjNmM2E2NzNhLTc4MzUtNDJmMS1hMDNlLWIxODZmZDA0MmRjYyIsImNsaWVudF9pZCI6Imh0dHBzOi8vY29uZm9ybWFuY2UtdGVzdC5lYnNpLmV1L2NvbmZvcm1hbmNlL3YzL2F1dGgtbW9jayIsInJlZGlyZWN0X3VyaSI6Imh0dHBzOi8vY29uZm9ybWFuY2UtdGVzdC5lYnNpLmV1L2NvbmZvcm1hbmNlL3YzL2F1dGgtbW9jay9kaXJlY3RfcG9zdCIsInJlc3BvbnNlX3R5cGUiOiJpZF90b2tlbiIsInJlc3BvbnNlX21vZGUiOiJkaXJlY3RfcG9zdCIsInNjb3BlIjoib3BlbmlkIiwibm9uY2UiOiIzYTUwZWZmYS00NTA1LTQyY2UtODcwOC0wYzRhYjMyMzc4ZGQiLCJpc3MiOiJodHRwczovL2NvbmZvcm1hbmNlLXRlc3QuZWJzaS5ldS9jb25mb3JtYW5jZS92My9hdXRoLW1vY2siLCJhdWQiOiJkaWQ6a2V5OnoyZG16RDgxY2dQeDhWa2k3SmJ1dU1tRllyV1BnWW95dHlrVVozZXlxaHQxajlLYnFTWlpGakc0dFZnS2hFd0twcm9qcUxCM0MyWXBqNEg3M1N0Z2pNa1NYZzJtUXh1V0xmenVSMTJRc052Z1FXenJ6S1NmN1lSQk5yUlhLNzF2ZnExMkJieXhUTEZFWkJXZm5IcWV6QlZHUWlOTGZxZXV5d1pIZ3N0TUNjUzQ0VFhmYjIifQ.h0nQfHq2sck4PizIleqlTTPPjYPgEH8OPKK0ug7r_O7N4qEghfILnL07cs5y1gARIH7hJLNNvI7qXEerl-SdDw' +describe('EBSI', () => { + const responseOpts: AuthorizationResponseOpts = { + createJwtCallback: () => { + throw new Error('Not implemented') + }, + /*checkLinkedDomain: CheckLinkedDomain.NEVER, + responseURI: EXAMPLE_REDIRECT_URL, + responseURIType: 'redirect_uri', + signature: { + hexPrivateKey: HEX_KEY, + did: DID, + kid: KID, + alg: SigningAlgo.ES256K, + }, + registration: { + authorizationEndpoint: 'www.myauthorizationendpoint.com', + responseTypesSupported: [ResponseType.ID_TOKEN], + subject_syntax_types_supported: ['did:web'], + vpFormats: { + ldp_vc: { + proof_type: [IProofType.EcdsaSecp256k1Signature2019, IProofType.EcdsaSecp256k1Signature2019], + }, + }, + logo_uri: VERIFIER_LOGO_FOR_CLIENT, + clientName: VERIFIER_NAME_FOR_CLIENT, + 'clientName#nl-NL': VERIFIER_NAME_FOR_CLIENT_NL + '2022100333', + clientPurpose: VERIFIERZ_PURPOSE_TO_VERIFY, + 'clientPurpose#nl-NL': VERIFIERZ_PURPOSE_TO_VERIFY_NL, + //TODO: fill it up with actual value + issuer: ResponseIss.SELF_ISSUED_V2, + passBy: PassBy.VALUE, + }, + responseMode: ResponseMode.POST, + expiresIn: 2000,*/ + } + + const verifyOpts: VerifyAuthorizationRequestOpts = { + verifyJwtCallback: getVerifyJwtCallback(getResolver('ebsi')), + verification: {}, + correlationId: '1234', + supportedVersions: [SupportedVersion.SIOPv2_D12_OID4VP_D18], + } + it.skip( + 'succeed from request opts when all params are set', + async () => { + nock('https://conformance-test.ebsi.eu/conformance/v3/auth-mock/request_uri/4cb2dc1f-61a4-46b7-9660-06d62dd99700').get('').reply(200, JWT) + + const op = OP.fromOpts(responseOpts, verifyOpts) + const verifiedRequest = await op.verifyAuthorizationRequest(SIOP_URI) + expect(verifiedRequest.issuer).toMatch('https://conformance-test.ebsi.eu/conformance/v3/auth-mock') + expect(verifiedRequest.jwt).toBeDefined() + }, + UNIT_TEST_TIMEOUT, + ) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/interop/auth0/auth0.spec.ts b/packages/siop-oid4vp/lib/__tests__/interop/auth0/auth0.spec.ts new file mode 100644 index 00000000..6e8fd31a --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/interop/auth0/auth0.spec.ts @@ -0,0 +1,12 @@ +import { PEX } from '@sphereon/pex' + +import { anyDef, VCs } from './fixtures' + +describe('auth0 presentation tool', () => { + it('any match definition should return all credentials', async () => { + const pex = new PEX() + expect(VCs).toHaveLength(5) + const selectResult = await pex.selectFrom(anyDef, VCs) + expect(selectResult.matches).toHaveLength(5) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/interop/auth0/fixtures.ts b/packages/siop-oid4vp/lib/__tests__/interop/auth0/fixtures.ts new file mode 100644 index 00000000..cd5810c6 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/interop/auth0/fixtures.ts @@ -0,0 +1,110 @@ +import { PresentationDefinitionV1 } from '@sphereon/pex-models' + +export const anyDef: PresentationDefinitionV1 = { + id: '1', + input_descriptors: [ + { + id: '1', + name: 'A specific type of VC', + purpose: 'We want a VC of this type', + schema: [{ uri: 'VerifiableCredential' }], + }, + ], +} + +export const multiple = { + id: '00000000-0000-0000-0000-000000000000', + input_descriptors: [ + { + id: '1', + name: 'A specific type of VC', + purpose: 'We want a VC of this type', + schema: [ + { + uri: '', + }, + ], + }, + ], +} +export const VCs = [ + { + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + 'https://sphereon-opensource.github.io/ssi-mobile-wallet/context/sphereon-wallet-identity-v1.jsonld', + ], + id: 'urn:uuid:69f05612-a6f4-415f-90588f91819aa2c1', + type: ['VerifiableCredential', 'SphereonWalletIdentityCredential'], + issuer: 'did:key:z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM', + issuanceDate: '2023-04-20T15:10:19.356Z', + credentialSubject: { + id: 'did:key:z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM', + firstName: 'Niels', + lastName: 'Klomp', + emailAddress: 'nklomp@sphereon.com', + }, + proof: { + type: 'Ed25519Signature2018', + created: '2023-04-20T15:10:19Z', + verificationMethod: 'did:key:z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM#z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM', + proofPurpose: 'assertionMethod', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..-IwvA3_naB-p6lz20T8wp5PVPmrUm47HgICMlJ9Z6yfoRkupGvGtEHfzY6fZOr9r0QmAj_6nRlf-MKhwVxv4BQ', + }, + }, + 'eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCMwIiwidHlwIjoiSldUIiwiYWxnIjoiRWREU0EifQ.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCIsInN1YiI6ImRpZDpqd2s6ZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0oxYzJVaU9pSnphV2NpTENKcmRIa2lPaUpGUXlJc0ltTnlkaUk2SW5ObFkzQXlOVFpyTVNJc0luZ2lPaUkyTm1kR1VqZDNhVjl1VFU1VlZIQmxVM3BEY0hKNmFWRllORXBDUzFOT1ptcG1lbmN6VVRWaFZITTRJaXdpZVNJNklqSktkRVpwVTJOdmIzRlhXV1EyVVZoT1pYVlJUSGhQU1MxMFpXSnVNSEZTWmxoNlRYWXlTM1UwY0VVaWZRIiwibmJmIjoxNjgyMDA0NjA1LCJpYXQiOjE2ODIwMDQ2MDUsInZjIjp7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJPcGVuQmFkZ2VDcmVkZW50aWFsIl0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9vYi92M3AwL2NvbnRleHQuanNvbiJdLCJpZCI6InVybjp1dWlkOjUwMGI1NWU0LWQxNmItNDkxOS05NWQ0LTJhNmFjNDhhM2M2ZiIsImlzc3VlciI6eyJpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpQUzFBaUxDSjFjMlVpT2lKemFXY2lMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaU4yUTJZMkptTWpRNE9XSXpOREkzTm1JeE56SXhPVEExTkRsa01qTTVNVGdpTENKNElqb2lSbTVGVlZWaGRXUnRPVGxPTXpCaU9EQnFjemhXZERSQmJrOTRkbEozV0hSblVtTkxjVE5uUWtsMU9DSXNJbUZzWnlJNklrVmtSRk5CSW4wIiwiaW1hZ2UiOnsiaWQiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIiwidHlwZSI6IkltYWdlIn0sIm5hbWUiOiJKb2JzIGZvciB0aGUgRnV0dXJlIChKRkYpIiwidHlwZSI6IlByb2ZpbGUiLCJ1cmwiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjMtMDQtMjBUMTU6MzA6MDVaIiwiaXNzdWVkIjoiMjAyMy0wNC0yMFQxNTozMDowNVoiLCJ2YWxpZEZyb20iOiIyMDIzLTA0LTIwVDE1OjMwOjA1WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSTJObWRHVWpkM2FWOXVUVTVWVkhCbFUzcERjSEo2YVZGWU5FcENTMU5PWm1wbWVuY3pVVFZoVkhNNElpd2llU0k2SWpKS2RFWnBVMk52YjNGWFdXUTJVVmhPWlhWUlRIaFBTUzEwWldKdU1IRlNabGg2VFhZeVMzVTBjRVVpZlEiLCJhY2hpZXZlbWVudCI6eyJjcml0ZXJpYSI6eyJuYXJyYXRpdmUiOiJUaGUgY29ob3J0IG9mIHRoZSBKRkYgUGx1Z2Zlc3QgMiBpbiBBdWd1c3QtTm92ZW1iZXIgb2YgMjAyMiBjb2xsYWJvcmF0ZWQgdG8gcHVzaCBpbnRlcm9wZXJhYmlsaXR5IG9mIFZDcyBpbiBlZHVjYXRpb24gZm9yd2FyZC4iLCJ0eXBlIjoiQ3JpdGVyaWEifSwiZGVzY3JpcHRpb24iOiJUaGlzIHdhbGxldCBjYW4gZGlzcGxheSB0aGlzIE9wZW4gQmFkZ2UgMy4wIiwiaWQiOiIwIiwiaW1hZ2UiOnsiaWQiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIiwidHlwZSI6IkltYWdlIn0sIm5hbWUiOiJPdXIgV2FsbGV0IFBhc3NlZCBKRkYgUGx1Z2Zlc3QgIzIgMjAyMiIsInR5cGUiOiJBY2hpZXZlbWVudCJ9LCJ0eXBlIjoiQWNoaWV2ZW1lbnRTdWJqZWN0In0sIm5hbWUiOiJBY2hpZXZlbWVudCBDcmVkZW50aWFsIn0sImp0aSI6InVybjp1dWlkOjUwMGI1NWU0LWQxNmItNDkxOS05NWQ0LTJhNmFjNDhhM2M2ZiJ9.Is1GlvsyjScNWOqldkV_dt1jRaF9FHO3EK1IBgaE4ey7d-zs535yZY0YvH9gWnzDPisGbN2L4xBFRcZWxaHwDg', + 'eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCMwIiwidHlwIjoiSldUIiwiYWxnIjoiRWREU0EifQ.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCIsInN1YiI6ImRpZDpqd2s6ZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0oxYzJVaU9pSnphV2NpTENKcmRIa2lPaUpGUXlJc0ltTnlkaUk2SW5ObFkzQXlOVFpyTVNJc0luZ2lPaUkyTm1kR1VqZDNhVjl1VFU1VlZIQmxVM3BEY0hKNmFWRllORXBDUzFOT1ptcG1lbmN6VVRWaFZITTRJaXdpZVNJNklqSktkRVpwVTJOdmIzRlhXV1EyVVZoT1pYVlJUSGhQU1MxMFpXSnVNSEZTWmxoNlRYWXlTM1UwY0VVaWZRIiwibmJmIjoxNjgyMDA0NjI3LCJpYXQiOjE2ODIwMDQ2MjcsInZjIjp7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQXR0ZXN0YXRpb24iLCJWZXJpZmlhYmxlSWQiXSwiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwiaWQiOiJ1cm46dXVpZDpiYjA1MmRiYi0xYTY5LTQ1N2MtYWM4Zi0zMzc3NWE0MzY0MGYiLCJpc3N1ZXIiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCIsImlzc3VhbmNlRGF0ZSI6IjIwMjMtMDQtMjBUMTU6MzA6MjdaIiwiaXNzdWVkIjoiMjAyMy0wNC0yMFQxNTozMDoyN1oiLCJ2YWxpZEZyb20iOiIyMDIzLTA0LTIwVDE1OjMwOjI3WiIsImNyZWRlbnRpYWxTY2hlbWEiOnsiaWQiOiJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vd2FsdC1pZC93YWx0aWQtc3Npa2l0LXZjbGliL21hc3Rlci9zcmMvdGVzdC9yZXNvdXJjZXMvc2NoZW1hcy9WZXJpZmlhYmxlSWQuanNvbiIsInR5cGUiOiJGdWxsSnNvblNjaGVtYVZhbGlkYXRvcjIwMjEifSwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lJMk5tZEdVamQzYVY5dVRVNVZWSEJsVTNwRGNISjZhVkZZTkVwQ1MxTk9abXBtZW5jelVUVmhWSE00SWl3aWVTSTZJakpLZEVacFUyTnZiM0ZYV1dRMlVWaE9aWFZSVEhoUFNTMTBaV0p1TUhGU1psaDZUWFl5UzNVMGNFVWlmUSIsImN1cnJlbnRBZGRyZXNzIjpbIjEgQm91bGV2YXJkIGRlIGxhIExpYmVydMOpLCA1OTgwMCBMaWxsZSJdLCJkYXRlT2ZCaXJ0aCI6IjE5OTMtMDQtMDgiLCJmYW1pbHlOYW1lIjoiRE9FIiwiZmlyc3ROYW1lIjoiSmFuZSIsImdlbmRlciI6IkZFTUFMRSIsIm5hbWVBbmRGYW1pbHlOYW1lQXRCaXJ0aCI6IkphbmUgRE9FIiwicGVyc29uYWxJZGVudGlmaWVyIjoiMDkwNDAwODA4NEgiLCJwbGFjZU9mQmlydGgiOiJMSUxMRSwgRlJBTkNFIn0sImV2aWRlbmNlIjpbeyJkb2N1bWVudFByZXNlbmNlIjpbIlBoeXNpY2FsIl0sImV2aWRlbmNlRG9jdW1lbnQiOlsiUGFzc3BvcnQiXSwic3ViamVjdFByZXNlbmNlIjoiUGh5c2ljYWwiLCJ0eXBlIjpbIkRvY3VtZW50VmVyaWZpY2F0aW9uIl0sInZlcmlmaWVyIjoiZGlkOmVic2k6MkE5Qlo5U1VlNkJhdGFjU3B2czFWNUNkakh2THBRN2JFc2kySmI2TGRIS25ReGFOIn1dfSwianRpIjoidXJuOnV1aWQ6YmIwNTJkYmItMWE2OS00NTdjLWFjOGYtMzM3NzVhNDM2NDBmIn0.7p-Bi5zX-5LJIJV-xYhJHdpiivbKcG7TldirI5cDL-RhKohO58zzAa964oYM_03s4AA8SboIxPT47LT6MO9FBQ', + { + type: ['VerifiableCredential', 'VerifiableCredentialExtension', 'PermanentResidentCard'], + issuer: { + id: 'did:web:launchpad.vii.electron.mattrlabs.io', + name: 'Government of Kakapo', + logoUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/logo.svg', + iconUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/icon.svg', + image: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/icon.svg', + }, + name: 'Permanent Resident Card', + description: 'Government of Kakapo PRC.', + credentialBranding: { + backgroundColor: '#3a2d2d', + watermarkImageUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/watermark@2x.png', + }, + issuanceDate: '2023-04-24T18:13:50.848Z', + credentialSubject: { + id: 'did:key:z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM', + image: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAADAFBMVEUPBhEECw4MCQ4KDAgPCxsQDRILEBMVDRYZDBcTERUZEgsVEisWFRkZFhQgFB0uFg8pGBAiGhInHA0oHgk6HxAzIRgtIxsvIxY4IBoqIycnIztTGyZHIR85JC07JhVJIxM3KRZHIzJCKQ9FKBk9KiBDKCM3LCFWLDdSMB9SMCRUMRlOMStaLixVMCxINCtKNR9DNipcLydGNiRKNhlBNjVPMjZqLDVpLTtRNkJAOVdjNCdlNiJhNz9iOipnODBlOiNlODhiOi9nOxpdPC9bOz9bPDdZQBdePSpUPzZhPSRhOzhWQSNTQS9PQjZJQkpVQipOQj95O0h8PUNwQUlxQkF0QzVyRS1wRTV9QyVqRkF4RC54RhxyRyV1RDt5RSZuSCttSDBtRztmSy1sSTZfTTVbTUFeTTphTi5sSk5eUU5nTlxzUSmGSy1pVCpZUm5bVFxYUn2JSVCCUCWFUB6DTjh9US+ETy9/USt5UjeBT0F3UUuBTk1/UTiBT0Z6UkVyVjd7U0FqWUBqWUVoWUxtWjmVViySVz+WVUiVWDqTWi2UWySSWEiPXC2NWk6SWzmQW0eNXUKIXk6LXFmAYUiLXkd+Y0COXzqDXmZ2ZkCaXyJ3Zk14Z0eZW153Z1p+ZWmLZz2HZV2jYjeeZS5/bUGgZTdzaoujZESgY1ufZkWbaTl6bnB5bX6kZk6cakKaak2ZalOca0mXa1qRblKEc1KFdE2DdFmpckOkcG2pd1KudVqleGaoeVuQgV+oemGPfoSkfVOPgmeJgYSVhVeMgpaVhl6Pg4+ngmO0g1yVi3u1hWazhWyTipyzhXKWipeSi6qdi5GUjKSdj2yckHWXj5O7kXOnloulmnSnm32hmpmdnJSlnImgnY+pmpaumZaknJakm6KpmqannoWkm7uqoJOnnrKooo6mopSqp5m4pJSwppmtqJSwqI2ypbGxp6ewqKGzqZyuq5ysq6K4qaS8qqC1rKayrqC3raC0sI+0saK3s6W7s6y2tay/sb+6tqi7uKnAvK05QZ2IAAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5AEJDh4BqLG3TQAAIABJREFUeNrMvQlYlGeW9200Jq2vCxoBnVEkssgiiyjTeUUFRIJswY4KAyL7orGdfK0gqMgm7YwdRQhL81IxSbfORI2CCqSNoMG0McZOJg0mkmBam8sLkGLCMp9FV8lH8v3PuZ+nNopFY8/1HhFKZKnzu896bzVhSKMvQ//DIv9GzbDPG4nuy3Wf0P2nZmRRs6hGlAlD//Na6yvKakgqm8BjNCijKKoZ1Nfa+D//rwUwkuojABgaZbxHpTMKgKds/E/yc/jpDXsGg48HQPrqESxFzc5g2gIe22PHAWukL/nhR37Pz/QH+iK1amiot0fNFPp03zQoRGPaGDTjE6GvHADUcjwQemueCMC4x5eGaQQuZI5DP/74o6pTqezD08PzVD/i/+BnaQBg8CcBkIOgSgJhAIA/8/gAxovAlAVIpvjDD9C0s6Ojo0+pZN/s7FOpHpHOavxL1lkGoDHU94kAkNJqnUjaP5kFPG5208ojSYYGur7++n5X1/2vb0BalRSf+ro61ezZZARsAxoZgX7e+ykANMMAaP5HAbDumoGBgUe9XQO99+9/TXJf2coMIAP8lH6AN8Aa9AAMU/bxAMgqa13habjAD5rxOIIRgEEgGCIAvV29sICve/Gwq7W5ra2N7aC9V6Pq7FSJZKWWfzwFQRp/9U+1AF1INGkBg/rPWfOUMricmMW/1JpBhDnS/8FAa+uDBw96W1sx+o2NzXhrbiYEZAfK9h817WrxHGAs5DA62LraT78CJD5qKS8O6n2Jge5qTrK6tGAQAsZpAfSTf3ickKhHRnpaavVQ7wMy+hs36lqJA9RvZmlrbm5vhSsICkpkRsqQGvKa4RnYMCgMDauEDADo8uFPBTD404IA/Xao1tZYR/o2ksD+W1paYAItxKCRY4FGqSYCclH06JFmzBZBrXMSyUxMlUrq0QAMT7mGquvkidMlMt8PQ91tzd0tjVC6hZQmvVuammWpa5XHv13Zer+1fQBRAn5g7GIGmg1pB1kAGBxmAcZdwU8FMPg4uksjIgUBtUYJ/bsb60hvDHuDAn8bGpqbGhvr4AiNjQDQ2t7eznmhtbW9r6+rq3dg6JFxK2Tk/8ObIeNiWT02ADJv6DY4svWT5oPjdgOZlmZQW+jTyMLh25rrKusaakhzRapCUSMEDxoaGhvbupETWkl9hMROZS+SZVevrlcc1AcwKJ7voImOkD85ODhabawxboaGRmvFHichUH3/wxA9vcFHjwYpig9ohlRdfUNKKNfYBv3zU/IUioKCgoSChIqKppqmpoba2tqK47UfN4h4eOPG11+TM6iUXRBkDQzVjz8aOL/IKiN3x0O61mfEokilHm8z9BgEtM9OI2zg0SCeBpK9cmigFWaPsFeH8a9rbGxqrilIDQ4uqKjFyDc0XQMAIKipo5x448aDB60iFvTBAu73oVlAj2QY+PWflqlhlj1gRAByCTSeLPAEXTIDoByOp97ZfoPCfSMMvUGhaCCBySvYCoJTyfYJAKRAQYEAQhEAVUF7u/IBkmZXp7JTNaQyynb6IXYUACaLQlEJjR/AkwplMFUfAltzC0J/TVlOWW1F7TXYu6KS9K8JTlAIAjUVrH9BTQOsg+zkBkJBMyFgEBplq5I72eEdga4wMAFArTfgehMiciWo1vydAGird1WvilJ6GwJ/jSI1ISehIKcgNTU1p6AgLw8IcoILFMEFwcEJBQpYREFCQkGBopKcAGbQ3d3NFdKNVpBo60ZyUKpM9IQmE4EcA1RC7ycDMIbV/zBC1uN3XL6rNAMqit/dyPx1HPECAwODE4JBIHhZcFgwQBQEJ6QWFCxbFrwMABARCgpyShQ1HCm4LKL3bSQcGZXtP6h0Vc6QcYc4ehegGuYCUi+gfmoWYAhg8EfNAFXnyjZSB86empAQl5iTmOiWGJaUtGzRsrBgEuifAAtYlqoAFvwL1lHT2NTYQJGgRoGAyUIk4BCtQ6phU1+PKeOeDxi11/thrFDJ+b/vvubHB3B+incY7JyCkpKSnJKSxJwwN8gyEMDQB5M5JCQsC85JTQoLDsvBF1JhoEBQwIcGUSM2UoEACK3KAV1s082Lj2dSTD0SAG0//PQAUAXyaPDhgGqoE/XM3xqgToEipyYnp6SS/D8YpgDVCQHsgPQHBvxNSgpzC0N0wBdTeFQUlJU1AB4LZQ0KjDcGBoY1g+Npi8cCoHmKQZAGRNX/8GFXrwq1vEaJbF8BB6ipw/CnktFjvAFgEelPgnBAPJYtSyLDAJACeEUBvqeitgzvYQSQ2tqaGgqNN1rZBLQxQD8SPqELPM0gOCimLoDz4cO7PQO9fdz3VZQVFJTBCiorE1J37HhZkkUIAsvwjgY/B++Cl4UtcguzWhS8DCYCYJQTy5AuawGgoYErhJqWbpQHAyrVgFpSfFALYHB0rccOgmo1lcIjTYWgptGM0SRzYS5Kv6GBh4/+++Gj3vahthaForahoIAUoapPWDt5PPsADXnYIjxKCaN/kFW4hYnsQAR2HD9ei7IBpWJtDX4EigTKCTe6Hj16iPqKjVr+vai4x0wDehlRpEDJ+9V6vcBIVb9mPHNfWgCPBgYG/vu/B3rb25obCspeLqjgMi81FWrD+nMSWIIpEHqEhCTBCqzcQpjGokWLbIgJAiYYVOwog8AMYAg1ipra2msKRV1jW+vXgoBmSK3USB3RozEAyGOvMZ4Ql0pBtoIJo4S9cQGQ2r8h0n/g/+3qUnZ31xUklO0oQOVHwY8sAPoj6wkAUNsaBKwWLbK2JhphbkJ/N7fgPNQHOTk7cgp2wH1ychpqERUBoBYAUBy2dmoePRwkV9MBGBwLgHpQb1aYwp56+NLYiE2PwbTWCH2RDEDoPzDwoLWxrpICfkICVXjB4s+yBEoB9GDRMjerFzzcPULC3Kw8rK09rKxCrFgIQKoCFQFg5SSQEcAGAKCCPKEBBNpQEfLz+EEQkCxAV+yNtiqg0gKQ9ZabY8kFDJepNeMEoJG/ZvARQlTvANqXuvw8JH8UAKj1kOyhc7DIdhT4KRrAATys3T3cD0B9FjcrK2sCAARheYiEqYCVAwb4mwMeIFBQ09RQ19zS1tYuBza1zgLUoxBQ61aG9OKfZP76AEaa5dSMXQMSux/wvk81oLx/gxpe1P7QNoFTH3sAlIeXU+gnDjCA2RDLZOhua21ra+0BIGwBISFulBKJGVoDwpeTA0dANERB0FjTSASUePqDhgBMd/76QVALgFsC4zXS4cvjP4w/AXJi/lE1pO798ceuG8eO0fRWA8I/qY24vgxFDqI85T0WAIDlQ/1Zsyzs7S0tLSwtbW1D3UNCAQH6e3iEuHlQMEgMQ5G8jGyAGqgKqpAawABGoFSq1f0qlVEMUA9bKJZDv94GCVOh8KfuDxCuwzWKEupT/9aC8jW1QpEKxfmNy183N2srtnZ+aGk2C2JvbwEMFhaW7u54o3AA/T2IhI0ffRNKhYSEyrwc5MXaCtSHNHnS0tKt1AypOg2CIC96GlfGan0XkBcHRwIw0nTuOJeAYFdD6tYbdTSZ04aqrYEqILJntzDkeXyQnBzvPdjv3aH61KmwAWCwMDOzsLSAI1hbW7l7WLl6uNsCgOMcAgACiXkIArUoDRU5OVQcwga6NZpO1k0GwJPouopnjKkQA+HPTHj8YdcPiPRQ3XHjxo32gd7WVvRyddT/JLiFuEL1FFLfjZW3NbeyJbG2nj0bmk8FATYBsgJ7C1tLWysrd3dbM1tXW1s7R5s5NjYUMRKCcyprUAmUpSpyliWU8OwpOiOVWh+ASQvQswK1Ng8arw2qRlob1GhMRUGjhblH0r+QWFpvtCpblW3NN9C/oQRAHgsLWZcMG2D9AcAWClqymNsCALSeOn3SVJjAVAYAY7CcY+tu6+5KAMzn2tjYzLGaQyEzLDFHoeC6iOooGEENWuT2Pv0gSI/UY1aAat3aoMZ4cVQ/BIw++a+/ejgw8EisXms0d2709SqVN2i+v66SElklQh+0T0G142HFA2/9wguWsy1nk7L2rP+sWZMmzWJPIDdAMJxtGWppaf1CKHzBnAMkggKZUFjYMuTCvKRE/MwwmjWqrKzrbuflI3qy/dpCbHBsB5BrYfWwPULjBKAvAsAPQ+ofWm/cUXUqW6l7r6EUiP6eslkSxj/Ew0qMvLW7taU9tKfgJwGYOn2ehYWZDAD/5z57trV1iKWVFXxitoXl7BesrdxC7a09wvLy8vLz16VQOslLbW5pUNR1d0OVPvYCjfonAzBe1BitH9Q2o7R4i07pxx8R/u90qpRK1l9RwIVvGLX4lAFCkOpt7SnU0+gLzweOWWb0APpbMhL6b3xNKABYUcAwt7Q0g7nMRoq0tXzB2o3GPgUAKKcm5cEHKhu722gdkVeDUBeMH4Ce5T8pACnWPBrgtWvNkLK5cUippNk/qoDQzYHAotS8vLBgSoHWlPOnTrXAG8aY099swDDDyJvNg6L2yAIMwMzS0n02lUNz5tjMMeNaCfHCFsZg/wKSB6qklHwygaS8yjxUW+gOu7uVSpRgCEIcCgY1TxHAeKa9JQCadlrxaYP719SkkvZc7wYngcAypH3rF8jgZ1lMJ3+HsmZmUMzSFgTMzC2goC19ztzW3NzM3Hyd+Zw5jgh/NmAAFHOszM3NKUVYUoWwbl1ISkoK2QIcorJSWl5uUyqlimB8AAx2jT0BAP0gKO1egAG0dLew+9fQhA4X/RwGktwWIevPtiTDnzUd7+0toKcZFLN2xwMLADA3JwD0wMrM3GydFQFYOGfhnDkO4IA8YGtuRokS7mAdiqSSkhKSEgbtk+ry6qQ1VRgCakPN4wAYVg6YCIIj7HEzWChmAPAAVOi3m5oaWH1FAc3roP7Nw1B5hLkBgOVsCvTzKPi5mpm7wcK5KjAnsZ05FyoCipmt1dyZc+0w+I4OC0FgoZOT0yInB5s5c81hK7NmA4F76DoQyAcB/Og8+AASTl1Lc11NczfvNRt9VkTqoKUJAI165J2io1uAPgB2AY2yFQX67aaGBl7lLchR5CUlLYP9p4RR0UcAuO6daob6BhbuACEjh4mb8yfmzjUznzlzJh7MnGsjAWD916wJjAtwgDFYzzaDE9m729u6JyeneFihxIQXIB3WKRoUTTWKumbqD0adIqbdEXIhwC3BMACGKo4cAo0tAB0ASj9a4uUFv4KauspKZCw2Vg8PZH9Lewp4ECtXK6i3yMkJyjnMoUAH+ya95841N587lx5YEQAHBycHVj8aEotHsBhLmBCCpXtoaHJyKDdNIZQLAKCggedMW9uH7aUyXhQXNiLvlxzDAkbawE5dv57AVNRDAkBtbYMiNbUSRlmZn58P5UNDPaxfQIkPAPBxc1sbG4dF0N4p0IlkoQMNLXwcGoPATDs7/MscvgHTsOGvWLNm8+bNGdFrvJ3gEdazqWa0cA9NPnAg+UCIR0qKRwh5ATyO5koQClo5I6pH2Sct5scl3ceygJEnAx4ZA1ApSf8KVKqoU5OgfyWeYnKyhztKudmzzBDC4epzbe0coHpgIAFY6BQY4OSwkEbbys3GxtluLnm/iPtuMAIbBwawefOuXTtBYI1XoI01tLeYCgDu7qH44UgGCIZJSZVIOjkMoK21laa61PpRz8gA5G7YcFFsuAUMaIakrWnDAWgYz6PBR5ID4NGA8gGaX+rVaCKnEgE6/8CBdTBUd5SyXOG42s4lxw+UhIfXCxwoFNj4LXRwnDPHzm6ujbMNCVIAjEN4wOadOzdvjomJQSxwQmGAusEeBGjuIBmx0CMkKSyvQJGQWlHbQLNlN5Qq3iEjTxHqw9BIE4FqaWpkeAyQ6x7NgFZM7YYx2vn4kCaBW9saayoqaPWXdjzkJcECDhwDg3XuVPTPsjDH2MLrA73XeMcGOnlDoJ43Y0C0I10XLhS6L3Qgx8Cnnby8vaPXRGfs3LkbfzZvXhPzz14L58wkAJDQZA+0BwgyYcu45ipQKGiuqLmtXS22pAgf1tsfKE+GDdsoqR7mAgN6AMbcD0i/Df1vW7MC2S+Hp4CSqGY/duwY9A91Ry0/a5YZ4jxMnyJaOMzZOzycGKxZAxROXgFOAoSDg6MjhX4QgIN4eeGr8PUAsHP37t1sBmtAAKmS9A8NpVyAIBsWxqurOTC7hhoqDJW9Dx+JgohVHBvA8D1ChgA0w/tig2BBAB60tcACWPvg1DxUqZVUoBxwQwOIIIAKxmoOhh8GTQjwNz09nD4ABSTT21sOiY6EYBW0d/KOYELR0TuF7EIo2BwThcxhbuVBABAIDxwIAYOwpFSYXSr9zjqaMm7tpO7MaHuUXg2kGT4frh7bAvT24piwAFVrd0uNoqKgjADQWCAJJiUlhVi5mZuhyrecbeUWQMO/OWNnRnkGC3GAX0PCw2HrMAUvr1WrVqxevcppFYyfht/LS4QAkl/v+g0QbM5AIJhj5RFCFhC6zhUelow2OZj8LowB1DWiGBjgqTn1CLWgCQDGMWDAOAZoNAY2oDEE8HBI2drdTOVPDWlOKQAf8sJo3YfKHFuzOTZOsRjLjF0ZOw8f3gkM+AuT3h2zBtEtPSoqK9zJG/pCNm2KAAsoH54V5YX/zdi9c9fhQ9D9NxAYAULhokVojkl9V1dnW9fQFFpKywuj9rCS8i+qgQdqjVpaBzKwgxEADN8uP0IMMHmgCL/i0Q/tbd1NVAJD+TxU53U0GJVJtPLlYetqO3OOW2AgfPnwrl2HITSSuzCoh3cWQmJi4ODpRdHRUVFRXl5Re9KyvMOzsrLCo8KjogBg56HD+AP5DcuuzbCcRW5WIQeS161b52xn52rrHuLG3TFEeEFdc6tGnhiUAqF8SIICv2rkg3OPD0Ds41UNKdtaoH5OAY98ChlAfj4sgGZ2rSj9Qf/onaz+LlkO7yK1Cgt3747ZXbi7PD09PQ0IotKOZoUDQGlaVEwa2OzceejQ4d/oABzetRN1YeCcOW7HQMDVbq6rLX4HaZ+Tn5KSx84HAkp5IlAA0C4GjAVANhXTAEwcqhQr1CpNd3MTbfjk/E97ACsrj1EZSC0AGjsbJxr/XYd2HRL6/+awAHDi1zsPQflfFhaWk6THEIC0tHC8KyoiMjG78RWsugQA37Vzc3R6IMrH5GMH4AXmtq7uIR5u6LlS8AuTaNsVIeDmWAKgH/7EWvCTAjBBQPySITWKAGoB8sLwLPAEjiWjCnR1dUcPYAsAfrHh0H/Xbw79+te/hiK/J01oUA9hfAtPQtPCc2cJQHp6UdFBEDiYdrDqzBl8/pfSN0AkD0AEAYFoxAG30GRkQltaTfEIQdWdkn8ghQEoFBQJf1CLaaJHRgBUjwtg5NMZ2qWAQU17c0NNhaIAToguFc8FlXqoqx3Pfduisw8ITycAu34t9IEebNTsAYVEAAAEgfKiIuhfdLCw/OTJk4WF/8bf8HsBgMwHbwAQkx69cJEb/xbbdebrXENphgS/NTkFBZiiQFEDALQzTwAY1B0S05iaBjIFgBDwXxmAydOpbAC0H7DjRnNDQwVqAABIQnkeihbIHQBQ/bubz7HxS4T+MgBpKMmoTxw6ATXLT547V34OBPCh/FxRVVXRmaozxOXkyTMnf33oEL5D6H/oEAURip47N6dHL5oTxgSQCkNDPMJSEHQAAH0B7y6qa+xWchSEC+ithI0NQFrlpFqa3tAODBotCsvqizM83BKoWxECK3aU0fod5YFjB1CpWbuvQ+Pvaj7XJiAuM0MKfND7/7AQgd9/8MEHJ06ehZy7iD/0VgWprq6uAg8A+PDDD0/+W+Gvf/273//+BGCJQMg/Z/PmaO+FDn4Yc4i7h9siagkBID/EDUkoVVFDy6cI5Q8HTR0Xkt5MVoLy+rh279lIBzTEPlCaj3/Ufwd9QEXBjh3BCQmoyZPyeWRQrFEB4OrmEJe5XcS+Q7+W9f8/7NcfkFwkANAeQupX1deDAOzhLPS/9OGZk4WHfnfid7//3QnS/9CJE+InIQyEewUkQv8D7smhITwxVFmJ0jAlhKIAnKChpa21d+DhI+PDEmotAJXRSrm2EDIGYHQERUeCZ2EhHa3qNkVFxQ6aBU9VkCkiPrt7QH+E6HUhgbHbM9h2aQCF+r8XogWAsScE9ZDLLKBx9hwB+PDkyf/43e9+Bws4QQgYA9cRMdHeDn7HaF4kOTnELQy9V15K/jFEQhSglQU1NTXNbTeUAKA2qgfHBmCwsmZ0QF/vBIb0b9oPRwZQg0YoJwElOffBABDqYWsJDwgNCQjcnpHBPi/s//f62kN/yKefQvnr1z/77LP6yzdZ6unTHwo5eeJ3vzvxe/KCEwIAcgcVA94LA0rIBUJDkf4QfvPy6ygCIyEWEACaHEEMH1SpDFYI1WO5AB89Gu08tu7fouFS9bW31TU20B6Y1AKeBqPnBAuwtLRHw+IG/Q/vkgOfDEDS/oNPoTzks3ro/9VXn31286YWwKcX6z/88PJNIvDBCQkAMUB43I0aMiM63NsppZJjQIhHCBWBjY35Kfn5SZXUitMOgrYbvQPqAVox0wsDRhZgIghqTLqAZmjY5twhCYCyvbmuEX0Q7fKFHSIHJLvThIU7vDM0f1Hg9sMEQBp3dv4TH5zSjr8A8Nln0B9CytO7z+o/+7T+4odwCXICADghACBtID0QANQCsQsd8vHLYG0hISEpVAPnw/yoB8tLpdWCtmYlnU8dNNgjZsIFDEvh4RdomL7AQsM9AKUCZTcXQQXBtP09P8TDNhSJicXd/ViIU2zGYXnwmQLU+IABfEp/P5UBfPWVTOAregMBOAQBuHjyP07qABziugHNwU6eKE1JoenRZJocq+T+A3V4HrkDNeON7AOPHo68J8DUypCpanckALwzT019sIKKAPrN+cmh9vbCAELd7Q/khzlRCpQIyOoL69cJbP/6dS0AZvAZyacUCS6ehA0g+h+W4iDKg5OoCHbupHIwLJ+DACig9chrbAQAxIA86kZpd3mb8nEBPMaecwLw8JFKo/xbc0WFQpFDAMKS2Prd3V3dMTAeKcn5boGZ5RIAMfyGti/0/+qr69ev6+v/FTlBff2nFCIoFp48eerUYTkE8rtDlAcCnVANCmODDXAjilaMZmPqKvMYwAMC8GgUACNfoTEOBARgUNP9twbe1JsK3wvzCCXPX08YQmlJIN8mMDN9pxbAKVl/KfhrAXzFAK4L/UUmgAF8ygmCCiIiICVBpMFDu35NBNLXBDqEcB5Y5+qeTIuFogknE6jL47mhB71PDGBofACGhrr/VrHjeAEBCEvysJ7Ns5U0IlSUVLoFxMVG0zSAMIBTJ06cRPV36hRSPyn30Uf4++l1HYCvbn7++ec3b+INbkGp4KNPhQ+cPPuB8ADozy31oZ2bM6KdHELoFyXTzGMILZdTFEhiC6isq2lobut+0PtkADS6E98a3ZFsIzw0FzQ41N1S+zIthaaGhaWEWVuHkvHThB161Py8MKfY6BhpNoeN4AS0PyWZACnPAfAzToNAwBngc5ably/DCS5SGECJdPbsqQ9OHNIJIaAgYON3AGlgW+g21B20YpxXmU/zIvk0IdEo5kcHNHRoz/QU4PgADA13iSHRCv0AI+jtbq7dAQMoQARISfFwC/Eg7UV5lpeU6hQdTQsbv9ESkKsArQdAfRHytEWADOAyMbgoBInjRCFSALePhYeoJYAFxDrZJB9YT0JTpGjD0IxTWZiTT1NjvHNALJr/JACm24FB3qg7+GgAbcAOOuaTmpSfT10phyQqhFCV5y1zio4BAJoBkNwA+UxYgFZ/9ncZwGUtgJtkAQIAimXqm04cko2Ap1OoEnCyIR/YBgAwPF4nCgmh2SHyAFTDzS0MQD0s2j8GgNGualJr+gGggQCgCQojAHgCbADuNEVRmbcoOJYsgOpgxDCEgFNyDfSpDsDlyxT0bxoaAOt/UTaAs2dpLlGKADxFilJoTXRmoBMArCMLsHenbQM0Avk8JU1nbG7TZkol98BGtyc9FoChUe6qIgtoqC1I5bkAtIG0EswT1qEHjqXkV4YBAFkABS3W/4RcAoo8ADPg7odsQNYeEfDzyyIA0PhTm8STJUiELLsEgp0EIDZwkRstPrEPIPqGiK0jNDfKp61ut3R3K6WtsU8CQJcSDV2A5laFBQw+7GpuuFZbUatIpeorP/8Yd+i0KJacUpkStigwNuafdwr9uQaidyeELqdoHkDq/i5/dlkkv8uXP78kERHqlwsCZzkMHJYY7OKOKDp6e6yTW/KBda7r1y+nesg9hGwAAOAAdDj19u0WBAH9tdAnAmC6K5IAwAJqaAevgmJAJbfkB2hJjJZtUlKs3QLD12zeuXnzYWTxw9BbpHH8vagLAKL7uXyTw96lS5c+/xzZgLIgqY6KuJ7KAY6DOgK0WEIxICHYCr2A63KOglJNzGlQUVvLAMgF5L0Q4oN6tFrwMSpBKQY8HOhuoKMwFcHBSUk0LUdTAe7JXAfke1i7JcIC4AOHD9GzJl84dJiHk0ucT8nxL5PD36zX83/+hEgA9fVcDohAePYUO8AurgOEC+QkuLnDB5aTDyTz3ABCABxAgdIMACgGqDQPtfoNatSPVQeMDWCQAFTUpqYqUgUAFMK8aEeukGLl4ZYYzgBAYDM+HDolOT8juFgvxXzJ+BmGDgH3QlwkfCoTOCtbACUCsoDMxLBQArBcAiB6Aj6RXlHbRB6gQimoswDNaPb/RAAeDXTfprNcaAZ5S2wougCuhVCfJQNAgADA6wCHT4k28AMxAyJmf2R1icClS5f1ACAwwEXq66vO0Wxp4c7C8kIKhadEIKRpwejYuMQQAEhev3y5qEDxe/Mr8/jMIR22a6GF4ocPjTbEjXad3uhnbvQnF3UW0HKNz7ynhtFifairrXvy+m0cCkOsrWUAuzZT8D51SpSBPAtI059Hq8+fP39JRD2t/bPgc9VVkpzjUvBsYXrM7gz8EPztbuJzAAAgAElEQVQgnhsFgLjExJAQWBsALBcr5tQUJfGBO7qVpE35QAYgXMDE1sDHBqA3K4z3D3vJAioKEqgU9nDzkHozjki2ttZhcbExtMcF+rP2kgljQAvT07OysooOZpWWlhaVVlUJCLL61dXV+Hx19WV2AuEASAblu3fulBPBZooBAEAOFxoqbMAdvz/EI5gIKK5dQx1ABvDI8FzUSGGADmPKLqAex/WMj3i+tV+l7L59vKKmJjWYZmKSQkJDePcOXHL9encLq5C4wGiqBdkAeEabQJxFE/TRRwjtn4pZDxrmoqKqeoZAQ19UJc0N3hQx8BxNApw8S1Poh3bu2klLA+QB4XFxASG2tA+FliGgPiQUgQgleCodsSMAss+P6v0PZRkBgMYkgAEuhJTd1+hEa04CQgAJjf2BUK7P3e3RosVGUzeweSdMFxUxB8GP5D7gotQLfPYVgSAI1Szg8JVUFiMC1kv6Q/3yw+U0/NB+MxlAeFxAgJ8lZd5kMQPlQb+dttUXVNZQFuwWN7Op1KrRg9+TARCRQNl2rUKRo6B5CNJe9AHuywUA1xBqh2NioD8FLuEF3AuLNEAERKSXOoHL0F47KQAOFAdRDdHqIa+glJcLD6DtMmvWAICfq30oARDzQqGiHApLUtQxgDa2ACkDqEfOgaR7DwOQjpaO1wLUcIG2a8cViro8ng3m309pAKXZ8vXurgAQIHzg8E5tFCAlystJm3MsUrLT9QLaR1wQ03rZOe4BxTdRGCzP2BwTHb0GScDPDR4nyk95HjI0BYmwDp0AAxhQq8e2gB6WxwegVg+q2AJoVSKFCzFeqQCA5fbL16+DhAQEwgR2ZuzUhkFa2kNGE3LyZOHBM2fOfPihlAg4Ld68flOUhZcv81IR28q5i+XlGRm0jE55oDyDt48CANLugdMHxO/mvhiJMK+yRlHXdJtcoHdgfDFAC8BAe/EvlV5q0D0CAOoIAKC2VlFQyfaPIpisMRQesHzW8m3Q39XVDwCiM8gGpCRQrq0EYf4YeVr7IIsn6+dSGMUwWT9iAeIiyzlJyjMoCQBBYSFtMYqODQCAdeu3HRPjj/QLOXCsjlfICUBbV89D/cORYwdBtUqllwglACrt1QsalTGAh8oWAcAtxDV02zYQSKYQsNx+FlmAq+s6x4A4AMiIEenr1KmLkv6M4DMtADkCnOdm4PPL1aXV0P4z7olQCdD2CWqKyonBTt5itWZNdCABgNYcA5EEkwnAsQOVeXk1lRIAKKUZeyZMD4DB5lIBYFAPiUprIgCgZhdopoPtBWFuVutCbddvo/GHA1hYzAMAz+Wu65wT49bQ881g9c8KkQjUixRYLS+IacuA85QIeGWAegJ8SbkUL1BASATIBQID/PxgAPitogWX4mA+7RIhAC3dVAY9UqkeA4DBfTtqgxvqtItLuiCoEgBgAsFuPBGwLZk3x9oTgG3+nkQgMS46IzqGdkgdPiWUP6cFwMGvXs59ohX8/NKR85ekdqgeAC6LavAi98ZCCgWAWMqCBGB9KO8c9RAB6ADPCNY1NVEWfPS4AKT2ULejcPgBRJUuDRKAltrj6IYLlll7wAZpZwwAzLKYJwFYnpwYl4k8sDsjQ2cA0EE2gHp59DkDUgA4f/4P3Ax8dfOz69c/u/whygOBgFTn76VoKAHw8/NfL8+GhHp4hCRRE8pTQnUNDEC2gNHdQC8LyLuI9QAYXFpJcY8fPmQLUBEAuhsjL8nD2tLensaAjsQRgPV4bvCDkMTY6PTo9IwMNDJnSYV3pL0g5edoM4DW/G/eZO3PX2InIBO4fv2j+qqjYs/A9evndBZABCQAjogB65ej/6YGLIlCcWiKsIBGGYB6rAbAKA2KRMixUFQQptPgwKNH+JK+IdofWVNXmU/TAPb2vCxkYWGPLLgc5miBQBifHwgTSM+gWpD6QZTAVAl/+tn1ixfEhhBuAS8J+ydhZ8AnyPjxuPpyvTw5fK48HSURKgLon5EeHRuYGGDj6YkQwI1QqEeImIyDEVQ2NjZ3d9PK2KBBwT8AJOLtob4LQHtmMEH2fx0A9UgABkROpOvRFHWVVI26u9qiIAcGe35H0SAZABLjYrenwwK4Evzg1EcfiSWRi9dZbgp1uQGkj5eoOYQxUJMo/ldMENaLiHmufDdE2mpLQcDZ35/0t+VDJGIi5gBFgbrGxjYUAQOqQZPODgYjARh2vsr00QONAKAkADV1dfkHyARcXUU+cl9OxoDYDADJAZmxmVoAyIMsoCABuCknf2EFkJsyksvXLzMP2jUkpKjqXBUVxiILxAYGBLg6SwBoMU6CcIA3SxIAOlSr+YkANKMBUPEtQTKA0NB1CMnUnC+3oHiAt3XJyX4SgAwGIGdBuPVN1v/mJdkDtC5wU/6MYCOyRHVmUVFpEUlVEblAOtJgIDowZ+dkzgG8Gsl58MAxuABdNvNgQPVkAOSdFNo7eLUHTHQwhAuoCUAjYkAeBQHUoqhECAACIbRHbFp3IAQuEJvOJnCq/Ow774iSBr4v8h6XPvB4KFzNUyP02fPnhS2cZykuzs0tKS4pyYRkQQ4WlRemx5ABBLqFhfjbJbvb2vNkCACIYjSFATS3PVCOlO8ePuz9iQDUMoDW5kbaIstRkACQ/hYWZhb2nJQZQByZQHoGVH8HAHg/aFFpaWlx8QUod/68UJcHnZvBy+IzpDlLdnZ8IktEYm5WeHh4Wtru3QQABJa5hayzSw61tOSZSIoANCUtAWgkAOqRAKhMAtBoVxG0mys5CqqMzlxqVLSDkh53tt5oLlAoUsPyQ+3taXKSymALOud7QHhkSlgiA+D09c727RjG2LhM0ic3G7oVn2cEEgM2+/Oy4L+zWXM/R0c/fz+/+PjEiIgIIIiKZv0RBN3c1q0LDbW1pw05yXoA8hQ1jeJ+BbWxC3C+MwLwUPqPCfIFG/oADO+jFwQ0cAFaHgHg1tY2BZ2USvGwtCfvJwIk7gekifoAlEKZRAAMtm+H3QZAoJKjo7+/f2Rk5N69xe8WF79LDM4b2H7x3kh/RxtnEjs7/uAPBhF0kMQrnLvhuAAHm5B1IaEe1u72trwoz0mAsgADaFMalUDjAaC9anT4eXvtjmMgGZBOYA08aG1uoIsgw6wt0QQtFz6w3N0erRE9pZSQgAD4ADtBuqQ+dBcq+Qu1/CPj9+599903i4+8pwMA048McrGbO9cOMtdu7syZ8+3mu/j5+q5a5e0dGE6+gHY4wIYOT3q428uJMDn5GNUBeYoGqgSUStV4XKBHlgnaCzYMAKiGA9CoxflDVe9AK22UTk0Ns7KF4vNeeUVYgIX7gW3raQtfGAEgEyh/Jz0WAPyc6YDgXFLM05MfAYV/JAF488gf/iDGHm+52ZEu8+fPlcSOZf78+Y4AsCowFgIGAODg5kZX7riL+2ekljwlJRXVWR2dKB8BQE+PaQAq7XkSHQDpwiF9ANrDCATgQRsDWOZhSwWwAIA04L5tG2+TCAuTfKC8HF4b6GRjJ8kCuwULZkKgHAHY+ybJkSNHROTLBYAl8+fbOfPXenr6+69duxY+4+LrG7AqMJAQwAYYQEqINepwqgU87N3F5hwEwZqaxrYRLQC69poGIE6WGhyx117Bpm0RpMVG6obpquy2pgZFcF4YnRGlGCAqAYv1oQd4m4hbWCIAUBJA7erk4OdMmqxdu3XtWk/PBQtgBKScP5vAu9ksBAIOEO8bFET/g57K0xPfsHXr2qCgyCBfSIAAQAycHGxSUqxsMf6h7h4evEWLDpAoamsaWlrYAvSDgO4UQG/vQ35T9erLBOl2PcMbR6W2aBgAKcIq22431NAOQapHOA6S2JP5h8gAtm/PKKfzv6viI4O2bt2wYevWyMi1nrIIAHvf5aF/UwgA+PkGSfq/CFm8eCUY+CBqUhgAgejY6MyscG8nh8QUKziAtbV1CJ1UTqI986kFx2ubJACaQRMAoKxsCoiJJgDoTSDprt/SiwUyALUAUFeXl58SEkoVCbUBdFcKr1WHeFgBQFymABAdnpgNBUj/rZH+ni+9JAFg247cy/qjG5YtwE87/kzgxcUrN2zYyBIfEeANE8gUAPJTKAK88II13cxHNwvkFRSkVlyTARg1Q0J7fQBwh2EATGwoHH4Di/R1aAcaGlEMp6D5scWzsLd+4YXZL1i7034hDysCkAkA2yUAe/fu3bqBNfZcywAWCAYuQZHZAgBnAPIA/6CgtcJMXmJZ7Ll45coN+/Zt3LgFAAIZQBa8KgW2B+YvkA3k5yPq0HWUtQ0NzSMBMLIAAwDSQA/T3Sgt6C2tK5XdjY2NtEs6JdTDg+748LAGAmuan/BwtXL1C8iUAcSGJyLf7Y2E/yMDQi9PnTi7+PtlywAguX5+/i6y+gtYXkLoWMwEtiQGeIfHhhOAOCeHpBAPNjrrEDc6tQ77r1DQvYMEwGgchZp6AAQCHQC1CQDacxYmAFAlBADNdbRDM4UJWGM4aEAoKbm7m7v6JTKADJQB4QQgnsdVAIAs0BJw9osn9VEDVFcTAH8Xsv2XXnpxwYIZP3t+woSf/WzGAs+1not94AOiIMwCgMzAZWEMYLalbQhvjqEbDCuu1SqaWrRpUPuM9QOeSQAjzpnIxYGxbRCAtprGyjy6KyM/xcPdlu8BsrA3W26LmGxuzhaQvv2d7ejewiMQAxwjg+D0ketcl89YMIMHdsGCF6EqqgEAuEQ90uXqCxcSHRxdPBfD8fHfM2Y8P2HahIkTn584b8HatfNd9u7NjSAEAJCeGZcY5mFtb2lva+9q5RBWUgf7r6ipraigMyOcBvv1LUAXAkaMASMBMLGhRAaAEFhJW3RTuCChy5JmWZgtd0deNDO380/MLEqHC6RHh3tH5Mb7xvv7b13raWtuNnUGDSoYwA5eZAB+JefF9Mfl6urEVS4ucPmXXnzxpdcW/Oz5ec8889xzk6cvnzfX09/Of288lcQSgDg3NzqbYG/nbOMQEJhQokgtoMs34QHd1A32Px0ARqag5wI8I5BXSVvUk9zCUIa4goDZrFnLUZlYmM21888uIQBwgCjv3GxHv3jntWsXzDCbNX3ShFd+NmHGzxYwgZfIBxxzabvUZwwgYtUSn5UbViL4v/bajBkTJ3//3LRpk+atX242E5Wkf7wgAAC0VQ4AZlugnnL0C3AIvHA9JwEEaigJ9A4D0KsD0KOT8QJQmwKgVnbTNv0kOiydRIdlQ4QXEABzs7nO/vGZEoDw8Nx4h3j/dah/lq+fPn3KjAkTZjz7/CuvMAGEBeeAxOoqcW6oujp8xVKfDYtp/AHg+RkT5z0zecb0edu2LZ8509nOxZcJZKG+AoBFbtaWlrZoFPwdHQLiSkqCgwsUDU0SgP5hAHqfGIDxyzFoATRWplL0oYvT6K5kvjMIBYG1JSzA0z+7tCidQgD0j1gFD3CdueCV1xnA//cKCCx4/RWO8ALAZRlAFAD4AAARWDDv+WnPPDNjxrzl27Z6Ulfk6BsfGZ8dkZWVnhGNRGhlZWlua+eyxAUmEBcY6BRcya/gI1tAv3EWeFwAau3YDwuCNGmsVDZX8rltOsId7LbMLSSFcmGIu6XFrBnz7OKLi2geQABwiPdzNjPb9va29bOmT57y+sR5U2bMe53THEoDPPvq+no+KwUL8Fod6bOSXAD/PQMyb8GMuUgfQfOpI3JB4UgAMmEBcU42VuZmZAEuLgsdAwKdnFIBgAyg9YFqYNAAAHR92IvSr0df/bEA6OpnteFLM8hrrvCBPNosmxgW4sfNrrPbOg+EZot506dbuCIGlqe/88726NjM3ICAXIeZZrbrt27bZm42a+qkSdOnT19OLQHy29Z4v7jMCxfPnTxzprq6qjozMCAS1T/KH8jal16jB1QJ+vgsWTJ/SVBkZHZ2LiXYzMw4mzl0RYGdnQ0YOMMIwvLqGskD6Nzgw4ff6wPol3Jff49peWwA4kNbY2VBak5qQlhKoh/qF7T460LC3KzNoZ7FurjMqnKKAbFxmasCihMXzrTjwp8afPPlFsvX+ztTwbt1697IAAbwH2feOAoApeEBvpGofFayUPG8kithH5+gJUuWbIQBxOdyl5kZCADmQGBjw3MMfn5hYQUNzaiCHnCkN4gBeu3w0wHADBAE6moqCnJSw8L8/BxdSJ91iAOWZgBgn5JZdK68HDEQCTsiuzhg4UKXyMiN+/bRVNC7x1AWouCNJPH3Sywpq7948T8OvpH2RvWZ0qyIVUFBQVB+40bovTIo0mcjvjEyKMg3yHf16i3oGnNJMuMCHObQDU1A4MwAHMKCU6kTfNA7AAAGZYB2Cajn6VoArQ3QoZmExEQ85yAXlHm2VtbmZtNnzXJPKeMVrXSUrbnFxfEOC5eu3kL9zL6NPrADAMDjyHhfNH7xJSVF5y6e/Leof40CgYNZWRG+QRt9wIplL1PCl5JsWrFikwBQkhlOACxoDoYvYbVxc4M/NvD4w9tNroGNLE8WA1Sa7pbb164dB4D4yJU+CGfO/q62CEx0e1JOGa9qlxeVUofj67hqxaYtkDff3LeR9MdHNDcAEB+fW3Kh/Nw5AvCvBCAtK2vTpi2S/ugPmVakNPB7Nm2KiMhNTIQFZCUG2JjzLCwxsKU7uQtQBDx4QHG+90kBqE0CGA5HAOjt7r59u6k2JyEgfuPi+Su3otdzpoPTZmYWbiXlZ88CQFFR9fni3FWrVlENu2nP/v37SaG9W3/7W5oaiMTA5hZfqCqn/WAH//Vf//WNM4W704rSorbs3btv31aKAL/9LSGQDX/PnlxJ0BEDgNnUWag+aaNgSAhKkqamNiUZQC8AKJ+iBYxUIQ88AICPa8tyEn0RsleuDYr0d7aba25mMcsypKRcrIdnlRajDIggp40LB4TsbIznViF7kdRzS6urzp09S5cGnHnvDF8fUVSaBgC/leVNnf56UkoA5oqLqd1tbV3pbrWahqa29i4JgMp4AeDhEwJAEaUxFQTxBQ+74APHrzVkJi5d/OLKDWuDYAHOdgBgZhtWRgDeoW2hqAQjiotLS0oyYbuJ8GQYwNbXoNnbb0O14ur6i2fp2oiTH34I/U8WFu4+WHo01xDAXn0Axbm0TFSUFR7oAHczs7c3dzU3dwsJS6xEHdjW0amiHGCE4OHTtgDxBd/3KP9GAHLjlyx+cfGGSM4DtmaWFpYeCeVnT50qf4d8AM+2tLq6+kJJCZ59dvG7kLdZfvvu3tzcC1UXz509XMgA6NaAcphAdWlxtpYAhwHZBPABIaW0FD8zPTrQCT5AN/W5zp3j6GeThBh4u6W9s0/V39NvBOAnusAIBB5+/98P/na79lpDSfySn7+4eCV5gLPzXHNbC9uUBNrfzYtCAFBaWlp1AUILYm8SgGOM4N13oUoVDOAsHYzlE/O0KTAjvfrIkbQ9+/e+KdQnAMWCAN6z/gfT0nbT2bE5VmYz587FL7WxsVkUVqCoAQCqgrnK63k6ANT0wpemXeDh9w97/9Zde+16ycYlG/5x8UoX/0g/GztnukM7Ja787AdsAefkvd8XLtAW8eI3mYCQ4mLaBAIAJ07qABSmp1WfP3rw6JH9+8SEORF4UwZQrAOQTgDMeXXB2dHGJiBH0cAb5akRYq2oFMJfetPTtR9JoquHa2JKFxQwCMAA9cyqAdVjSf8AzYrUNCTG+6xcPN8HWc3P39/VwsLSLSCuvPwUrYhKu2IgVdWwbJ75ktW/wFL/ER0NOnfyw8v1H/INMruzqs+XFlWVZtGAIxOKdVLJB1j/o2lFaIfSqRsyn+ns77h06fz5/n6ptQSgm2/chtYU9IiEeNMD0NfT09fT29eHNzzq6+3v6+qbQC+N0Tuyt48sGmVzQRlcYOXiJShWIwHA2d7C3CYgs0gsCYuLQkRBQDNe52UCYCEAfPTRWcqYVdWXKQacRBpEyACA6tJSGvI3JQBi2aQE3lR69GhalgTA3NLW2dFx9dL5+NUFDdeQBrv5hRpVshUMl/4+RIk+PaF/TJDnDB8bAOrhguBMWMDKxQQAUdDO3MJ8TkAmrwnz/i5po19VaakBgPNaAO+cPXsKBGQAu7OKEBqEwWQXCwCSnC/VAshKTw9cNMfM3NnZ0XfLiqWR8WGKawSgjfTv61ONpH9Pf2cnvdY7S6cM4ScBUCTEJQYtQe3uszEoiAoB+7lznOKKpH1dBIC3+hEAsgHoQQDA4cL16+QB77xDG0jO1V/+TAKQDhOgS3Wqi/VFsAOWo8IC0GQsmjNnrp2dS9CmFUsd/Sprrn0MAO3wgD72gf5xAOj8yQDo9cQUKIUJAFo29ANz59rSFUJZ6ToA0k1Bsk5kArwefv16FRkAAzh78eZn9RKAoiLpXiGhuU7989UCABUCAOBgY0v6+2zyWroqsab2449vt7QhDfapRgXQrx13AOg0BPDY+verWhsVipzcbB8fmrX28SEAc+fYxMkApBhw8WJ9FR+HEfrwfoDPr1+ur/8IAMQWIjoo9yEDKBcAqvRtwBSAWCfaaRAUtHGTl1cAAbh2u6WVAZALjAhAN+7DAPT26enWNy4APfcbFQWpOdmR6NW5aXeZT7O0YlWUCZSzD1ysqiezlsPApfOXrvM88AUdgPrLN+spCyAVCgugXWLFYs1c7CdhhMIDBIAAv8jIoA37NnmF55bAA27fbmvvk5/5yABYcRYthgmkPcljaY/MiZTa3FBTpkiM9BEA8IT8EwPiMjPTaZM/nXUQ+50vymN6Xt4Y87nYBigDOEdTgvXoCvmKvaIqOkrExEp5yUyoX10N9d9IS0vLCs9M3749MDCb5xg2RYWXXGigXdLKzj69wXk8AAP6+o8fQG93c0OtoiQ+e+lGanA3onPNpe1htKXx8E4tABEELl+uPi/2gl2+Lh2Tp1xJ+iMI4jNnAADlcHo6bKBeRI1SnfXz+L9BAMLD0zNosinXN2gfLCAqoviCOCnST1OB/aOVf8MAdOpZgEolZ8bHANDS1FBzITfX12cfEQjaWwwAtEc4g4+IkP7lOgDS7sjr1y9fZwuoAgC+Vu0cbROrp7ZY3K8n7herFvWjnvu/QQCi6Nrd7bTxatXqfWQB6KnJANq7+lnEyI4NQCsTpMnRPj0AfcMcYTgWaruUBKDmQmLi0jeJQOTe4tLMzO0ZEgAQEEe/5DTAAK7z2fnrtAe27B1RCVbx2tBFqgX5ksly3lFdf6G+Wqv/UaH/G2lRBGC7ABCP37kprRgAmgCgn/a9oRfqf0IAvHGCZtFVBIMeqVSGH3qpRxCPBphAbx9M4Nq1mpI479wjb8IECACeHfSPjtldWIhIcO6cBEAwuCzLZ3QySmyklzygHp0hl8MUPs7VX7/ORsK+f+TIkaNvyPpHhcemb4+mfRIr9u/ft9qr9EJJDV0aQDo/HCH59VMNjPds+Frr7zMG8BgyIK04KNtu3/64qWH7mnAA2OCzsbiEVsVhATFRabRFrJyM4Ky2Kaqq0l4eR8eDz57iTuCMDIBg/dvBQsHkArmJOGzLurP9EwAoHx0bm7Vn06b9+zdtiruQo6AXoFL2jlD99XYNS3zaQujJAXDI7IUPdLfcvt3UVBYbvgc+sMSnOFcGEJMeAwCFdGD25MkqKbtX6d2eV8V3JHCAoMOCjIQOlB0slDfVXuajU1VVByn4vfHGUaF/VHR4OhlAxIpN+7ds2ZQZm8OvQdbb+98jEOjS6dxnWAeMwwIGRgWAH65sa2lparq+PdZr/5v7fHyyizNFEsigEyPp6bv5sNxBOHCpdCL6ohZAlZQgyDE+vyROTp87CCnCV4s9xGQV54oOCgJpAkB4dCwBCHdasWfLltVbMnNoSbBNqer5fiwLkNRWjRgDHtMC+nrhc3CCthYBABFpaXxubly0uEUbRhATk7Y7LQ0qUQg7I/S/yGeCLvNm+CKpPOCjEpcufVhddZS+9siePXuQ/GUAQIgfkSbpDwugGJDu7R2xCfrvL7t+ne4MgAd8P6oFdOpbwfgBdI1kA30MAD+990E7UsH2TO8t8IGlSyNywyUTyJAuDD4IAm8AwEGyeXGDAvIhHRRPS8uVSt1Ll/7whz+gSCglM8fAbtl/RByxrxIAgEBWHxYQTYtO3uEREbRUcv1j5MC2to6e78cA0CnUV/V1Pi0LUPVKS4wtTbUvx8at2Pfmvi0rvCKyJAD08ggCAfkvABTpALCuUVErVmyh6Q4iAAB/4D3yuZtWL9m4byMROH+JAZw9ix4BJhAlAQiP5YMTmcURvvHx52s/ZgPoe/j9GC7AxY+e3tq4+OQAUG+RkXQ1tzQsyomL8Nn35qYVC72zwtOlKMAABALyg5MygMu8K35P1KYl8+cH8VJB8R94n1z2lvjsjUvn88oQ28D56jN0n05h4e5fpmkBRBOA9MzM3IiI3NxitEEUApDmxhEDOk3JkwLok5beu+63NFQsyslMXLpl/549dEF+ukQgJkaHAMEd9YAWAAwfacxn8fz5LnsjI8WO2Tf37o3c6zN//soNGzfu279/D20irj5zhkuDX2ojAAwgdnt6dGZmaS4tlJYcZ/2VfSNOgvR2aUe8cywAXV3jB9DDFaNSqXzwoKUhdVlZZvzGpauPHM0K987iPeLIhdHp6QJAVBqf+wKAswyADwXs37R6w8rFM2fa+YMA1ZFUSPnMX7xyA3XX+/fvP/IeEyD9d//yl2lROgCxvGGyNDMuMy6w4BrdmwPlukYiIAB0dI4kE7oeQ29dEOwhk1KytLQULGsoyc5evenI0aKs6PCsaAEgIyN9dwwP3C93EwEuixlAbm72EQLw85WL58+0cwkSe0E3RpL+K2lPHKIgCLzJAEDgl7/UxUAAiMa7zNzSzJJMJ6eKptt/UyppgLu6RgMwonRoAfAHiQVNm/by7OmIBHplAHTF9KKy6yW52Zv20PHv8HA+JwA3QB2wW9gAAeCuACUeLRhSk79p9c9XbljpSScCgoS4zF9Je1KZp9IAACAASURBVKqDIiUAb715/j02gV/qhYDwTN40npVbnFuSGVhQS2clOwUAEMBfvOlXhV0CQN9I+ndMYN2NzEB0P9QaqUY1BHxX1/37rc11TQ1lJSVQrLSUlsN40oIkJkpy3jRYABd+NDPIaf581qYlS2hCdS3vHF5LOyld/P2D+ERJfPYRIvDe+SNHecXsl/9MP4PUZwuIRuW5Z09ucUlZ7TUBgKdAmEM//ugvh/UaW0CHVvWODjkGGAPQnzse3RW66I1ebb22rKzkAi/dkf7pQqJ3p5P+hGB34WGaHwKA91j/6uqsTb4+QT485kJ/z7W0fZglEgBQD72BLqiIYsBukwBKSyquXaPlAB2ATqniGQWAHocOOQYMA9A3bgAwAXaCirKysgsXaOEuK1yrP4IBvADVYFQMfOAwLwH84cieI6LDz4r3DaKtwToALAyAdtAeSUMfCAsolywgKpwAcBFAAHJzS8qOf8wA+nQAOmleSD8kdukS/3AAHfoA9DA8BgC8KZXdzbUFOwgAFXgSAA6CAsBuGQBK/+r3uMZBKVyUlRjv5+wi755fK4OgIxKR8bnF51EWAsBBsoCYf/5nWXmiiiTAW0UEADQCAkCfXOB0dnZJZt3VNXoM7BgfABEfu4bpLj4CQF1Nxcsvv3OBCQgAUkOQwQjSsghDIfXF54/sf++SAJCZmSh2R8t74w0BoFaOAgAQ2E0AYqLTJQB0gDiO9M9J2HG8obmlvV1yAanjJcV6erUERgfQIdKgQSZgANpJw5HGXYdD2d1W13CtbEfZO+9cqJIJ6ADs1gIohAGc379fzPGgRc5MTIz3X6vVnwis1AdQlJZ2tPTowd0CgNYCoqPj+EhWZsLLL++oaeluV3bouYBU9Pb10/se/EffiEmgQ64Dek0A6BsNgN74M4DmxqaGhjIdABAwApDFpdC5M6XFFAFL8VUEIBMAgtaufeklAwIEIDs3lxbCoghAGr3ySszuLB0BASCn7PiOHQVtFAL0Y4Be1tNN/PSNNP6dhhbQO24AehCUysbm5qaG2ndAAACKcyUA6XIMSEvL4jsAThZVl6ZlVZcKKSotzcyNjwxis9fzgLX+ALAXPdKR0tI9aaVEII0BRPELdQkAGP6EnLKKHTtqAKCzr19yAV29CwPoH7H6HQbAOA2wA3SOBUD+jg5lXVtzI0xg+/Yy2heWu4mGKkNKBbupEpABHD2SVioDoJPEdJyIE+FrALB1qwAQyUdLs/fTcbqoLBmAVAbRj0YIiIvLKav9+OPjx+EBDyQAXcManjH0H5YFeuXI0TkMwLBSSc9cVH03brQ1NqIU2J6ZVVycvX8LE+BCiNUXAHYXnqk6uietig9R8zlqfO3ejRtpPxhMgA7J6QNAf7B/f3FUFM0RRNHcSlqUXAfERUj6Q5rbWrkM6B+z5h0dQK8BgK4+XcPMaYDqzE59L9HHoe4kAOQEZZlZubn7CUBWtCAg9E9jTygsOnM0rbSqSjpGfgR/irP38ZY4PlUIAPQWqQWAnjgrKq00iwHQq3DJAMgAaq8JAM2tyg7JBfR16yconfQm9Oww0Q31m6oDpNQBmrCozt4+/ekDfbvXqxE6la30yga0TpYQnpmbmJtI50ZjZRfgBLBz567DhQePRh3U2f/Ro0XlRWwIR7K3bAzaGEmbIsWuUAj1i/v3Z0dERBRTcRlDSSCcKyHqBV/ecRzKX2tqut3c3NZOdQDNCOnrRjtE+K1/5LHXdYOmhZUdAYB+kdSuVN5oRBxsrlEU0PDQi4vGxWYKE5AB7Nq1s/AoAAj7R7149GhpebnYC4GynzbSkkBpaUdcYsSePfuzQaCYLhCIjgmP1QHYXkb604pwC5+S6mMA+roaLImPLiMD6DIG0GVcLAtfUPIJGkTBhtqClxMSYgPp9oTY7QwgWgKQsXNnRmFRWhSZfxbpjwxfynOi5xHrjry571ckTGBPVilviUcu2ZMdDwCZOgCGBnCbzgcAv5KHvEdfU8NdEYa538gbfjoA5MF2DD8d20JlsiMhJ+dCLJ+Yom4gmkvhgwSgqDQriu6RYABZpUeoHDryxhv79+8j9X/xi1f/6Z9effXVffuzSplAHO2yjFi1Knc4gEVl0J+uUG5rl/SnONg5DgDUAT45gM4uIwDaYlPZ1tzUdO34DgzN8TI0hmUEIJ0uPYmmVxZMK6XZgaLS8KzMoqIsvhSEfP8NaL9ly+p/guK/+MUvfv7zf2JZvSmc9gOPAmD7y8d5/KH+fYOs1zcWALkFfmIAXaYA4H8JwO1rxyuOH/+49jgxeIcsgE2AABw9Sju7sjIBIJNGNyu3GN0uKY8hf1UCAAJ4RwRWr46nsyEIgKsiVnkDGJJqTHSs1gC2H+fx74b+d7vGAnDXGEDHuIOgrpWQfrKRC+ATLD2dvcp2YQKS1NZ+tGO71LnRi0sepd2t0UWZ4ezcmbkI/LL2r/7qV6T9BiGEAQiWLFmCenjj6tWrxElBBkDqezMAlABNTS1/6+6krtd0nNcPgh3Dxl18Qp4Q+ckA6GsAAARqhf4N8NAd2wUBYQG8t68oiwHwrs8tPlCStP/VL1h+vpIZwApW/hyyhMUnaFVEYni4HgCygIQc2hJ1u43nQXjpt/+JAHRIMh4Akgz7tGQB/R2d7e3dbS0tzWQDtddqG2o/Pr4jWgfgIPUG6VlZEXD+3MT4+NU+rB95/M//SVi/Tv4RQsfE8BUuDCDLCEDZNTELwAWgBEC8jTcNSkSEFYwFoM8kAf1/8zNQtre3tbXdvnbtWkNDTUPttWtaACBwMJ2zQNYmMIiP9/VdCv3+UV9+/o+GAvWD6N6IgMREcoFoLQA4AGrAa02328QsgNCuo9/YEEZMg0YWMA4X0G8vRgLQ2delfPDgQWtrS9M1NMbNDQ1NBgAKd0sA9gCAr+8Sff3FsIsEAFOAObz6qo8PHRRKREWZGAe3oZetBgBvyQCuN9F6cHuHVn8AYFUfywI69F3A0LxHdAKD7CC3RzwdT+VQe2t7a9ttKs5u4xk2XXuZggCaOC2A9CyMZhyC+4oVK1Zv2bKFS7+33nrrD/j71q/e+pVWaF0kNzc8LjBOAEiny0TXrFkTRZNBL9NiGOrfDv3BpfE3GGrZN3R2IYxeb+zv84f7HRPweZ7f7xqn9PYadYYygHYA4OOrdLfp7aYyEFhDXWxMRiFfh0f7nzJRKsOr0w7Siv+R8++99d4f3qKF0ffee+8tFqkg3pPFMT8C9UBmEb1edfga2FI0bY9ChCUDuN/zfc/90at8o1lww6Hv6rovZIKkv7JzvAC6hgPopYIYBNpQnLUIuf3Ry9u3r4mG/voA6Oh7XFbRQSLwxhFUgWQBTOAtLYBXN27Zs4mTnjcAxGVmRkuv3k7TIdvfoSKwpftBF9t8x1MAoJSk6zFEN+fK6zE9/E/+Kd1tQkBgx8sYOjKAneI+xPL0cqpw4zJpgiztYNrRPW/s2b+P1Rbqk/mjMti4ccumKNZfHwC/YjkMoPZjsS/4/l1ygQ6jAmcYgI6nD8BAeUFAFy04FLa2M4KPXn45ek14VEz0zozdNEtKAGhhK5MnitOi0tDu7UcbICv/1q+4MmIAmxhAeARiAO2I0QJ4mbqAa1wE3yX9TYlx7f93t4Be/Xf09kD5gLwBJoAoEB4TvTmGG+Py9KIiLoVoqigtyiuKzhLu26cLfr/6Bem/BRUgLMALBCIiOAhqAURHv3y8CTEQTVBHx91+qcbRG3wjAPr/fLoAdAi0U6M9fByH4yHNkXQ+aGu5BhOgybHN6dJaEQDE0spWOi1zeUXRTrd9b+0jxX+1gQvCV/ftQ4m8ehNdl+Ll5cUAYgWA8Bg4wMs7Pv644dptNMFyMWuks1zkGqU7o/xHD+7f/2kAZAj6AHQLsiQP2pp2vLyGp7JRBNLkAC2b0WVI0Vn8ovObIFu2bNz46qsoBPjA+D/5wPpXr15Bl8d5e3lFCQCxAgCNP/RHFdTM+pu2+nEB4Pz3FACIOSM5EA4j0NqiSAiMJQKkOeufFR4XGxseHU76r2BZunTJksWLUfv9I9W+S1av8FpBd8cxgE0CQLQA4L1mzctIAdfohORIotXRSN3O4dHiqQDQcwVWXNqmc59+f1fP/bbK4MBAAgA/xsBnsXCfT/qvXrpwqcPShY4uLp6ei1/05PJ/6QovL6dVAQHeBAAGogfAK3wNGQBXQTo1+ocReCIA7SQ/CUCPPgDOBz3f331QxwDWRHPoi6aJkD1ZmcK9V6z28VnqAHF09pfvl3JxdHRy8vZeFbDKiwBEAUBAYHjsGjYAL681nAIZwJ07d0RN199xxxiBQav3lAF0kmr8oeu+ngtwkWxg/2wBd3sbAcCbm/jMLL4LMDwijipBmPcK+LoDbN3Pj28N9HT2X8v3BgZ60/2TZAHedOg8ELKG9gOs8fZe8w7PhDa3tcoAIHceH4D0Ffc7xJsWgHAEfthhpPj9+0Lj0Vpj41WYvo7WB3V4+t6rViUGxmaGe9OsPtSPDYyNDWQFychX+PoGBQX500Vr/rQxgPyfJEAcuo+Lo59AYXBNoFMOL4U0tbTeEXrfETJyLdAxLhkvgLHmBobXX60PGgMDnQDAFwAQ/70EANriw/qHR3EaiOQ9If5BBMDXNyIiPBFtIMyArpYl/eFFIAAAJQ2SAbDSd+48JoCRkExol2QUAGL8DWqsMfTH16IguhQgAyAT8PaO5atWERG5tQ1PS9vDBCC8LSQykq6KCo9LjIsLCAykDwyAt8UFBjqUNDQ0XCMDGAeAx5CxANzXvr/fMV4LEFGm9+uSAHYBX6GEt7zDL0sS3kC1KWJL9r6NtBgUuX/LFqqA4rQSKAggE3h7O/iVNDbSq4vfuX/3jqH8nQHcF+8h+t3VqBbABHru3jhmAEBIdLosWbTeiYaALtfIzqWlMPQAdCIkNk762kDhAnjv7eXn/O6N/MZmjP9dYwAygscgoUdtAutuEoCcKGQOneN1ASbQ8/WxAwEBgdDf0YkMWWgVrQMgVs7T9tCOuNxcer8nd4+wgFgpWEgAAgK9nPz83/06+djXNzrv3r37rUn5CRYwBgBicN9UELyvw9Jh1Jp3dH5z9diBRAkACAiN1ugDiCH96UTQkSN7couhPwhEaF1AawFIi6ucHILWvv3lMYv+b+/2fPP0Aej5gB6A+8YA9OtqHYAu0xtx+29dPb03Eulsla8v6h0nHktyBYRAKQak03UgaQIAOwIsAVEwTi8I8J3cAQEOC1cBwJWrE7f1f/Pt3b8XAJ2MAMC0BXT1dRq14JwF+6+efjsy0o/0910FAvAGCYB8Zb4kxQwgiwhkZ+dS+Z+YmYkMiCwQIAm+3Tdo7ZUrt+ZNvNpPut41Jd8+PQDt941FD4DcTutZgInlx45vr155299fAPB1dAQBJ3iCnAi0BEoBAKrvIRPI3psdHx/Bl9Dzzfpa/Rc6ol7yvPLlrXmT53377Y2Ou6YBPFlKMAlAr1S+fx+PaQ61s6vDYD5BmyK4DNTuPJUB3AUATwIAAkuBgNzASTiCZATCEnJzyfj37InYsmUvXZuZKEsEXSge4ITvI/19XdZ+eeXWK1Mmbesf0QKeIgDZClDam6isRt5yQ7PQyDF9He33AeC0p398ANLgkqVLlzo6OtoQAo7qkgmkZ9FCWWIiXZKRFZFN6vsFBFK3GC4CQCCQOQn9fT1PX7l6a/2kSZNOfwO5OywX3Pn2CUuD0QBwa/vYANqV7creG3evvv+251o/lP0rCAARgBUscwpwChTbHGlqjHbU8HaY4qzc7Hj/dXTBoi4AkvpOCxc6LPWFFXleuXr11rZJ0ydNe+WWIMBa6wDc+TsAuK8FMNrEo2EH0NHRfkM1cCP5u1ufAEA8ASD9lyxhAGTRDgFxMoI4vl4qMn5vLhkAGiK/eAp/Ov0dFi5cumL1agDYeuXW1aunYQFTpsy7SkbASv+9AVAEGD8B0Xa2IwBcnXrgu1tX3l7grwPg4uji6GCzyIEJUKcDBlkRifG8KSwyewse0G3jchAICBDDD/0hvr5+AAACBGDaxHmn790SAO78nQDoRcDRAJiYjaIIeufG1Ol4ikYAXNgEFtrgg58fRjoeOS+e9OfrFelW+bXisITQP8AB6js6LoUBkANFvn3rKgOYPnHKlMnTTt8bHcBjsHi6ADiFaKbOm3j63r1bEoBVEgAQgEUTAPFSI4lIenwHGR5TN0gbBQlAAOlPwR8AlqxmAi7OkVcYAKLgxCmTp0yccfWbb0eLAT8RQMcoADpH8Abdv/vcp05//n0AuLLA3y/O22vVat+ljrTaTzbgaAORXmaEh58HnidDpNeT8A8IY/0JgMuSpatXQ39//7dvkQdcPT1x0sRnnps8eeK8q0Z1oKHWellciwHvTBExBeB+j/hergjGFD0Ad1T376hvTJ30PAH465eezvFxZAGrHB3Fng/kAhtHm4XOEgHptQTEdJCLvyR+fg7kKwsdHPBtbD1BniICXKEo+Mwzz02cjDhw9da3t8YP4I7UBI4TwN0RAIw1zdR1927PDfupsyZPfv/77+/99W27gLhAAqAlQLlgoc188Qo6JOKSeWcCIH/KxlGYv+MK8PKliXMXz/e/+IIAXDk9nQBMnvzMlCnTTt+6d+vbb54UwB35nUkAEoH28ZmATlA4nJ41der0SZNfv/f9vS+/jHSIi/VetVoPABFwXKhHYPlyVwbgogNARkK3hFHxsGrFiqUunq/96U+fCADzAOAZ5ILpUyZPnndVJAMTAPQKRK0P3NGbRtI6xUgWQN84DMDYs4x3v9s2aeosAJgGAN//5S/vBsQKAL4A4CM5AcTF2UV6HSVX1+W2Mg0X8fpKpL1jkI8PAXBwWAUAWz/505+FBVxZPum5Z54DgEnwgokwgscBcKfDMDreGRGANgh2GFqAwdIStwi6/+Gvv7ocYzNp+vTJk1+5de/e919eiQ9AZeu1AirLAKgzYgbz7Wzkl5SyIxq0MkKPbGD9CIk+Pj5Llq6A7bj4r337iz/96YurDGA9giAsgNxgMgi8cpXKQvz9FoXhXe6U+a8g8K3UInTcMVaevKTjDtjcv2MIoHWEbnCYCBMRSaKP1xm+vt97YDpy9ORJkydPmfD6F/fu3fvuy7ed/by9vLxQCC5ZKcLg0qX0ijGrHCgfWFkJ7efOpRcfIgLOzo4OTqtoqnwlEWD7X/v2JwAg9L/6yqSJk5+ZOHHyZAYwedqUV06DwS2pOtaKyI96PdIw0S2MjKsdNi0d8m6brp77PY9u2MMwp0yZQgAmvv7FLXKCK842EbQMQrWwlAgYQICfn6MzANjY6b2klKeLSxBywCoGQPovWb0iyGXta1e++EI2gKuvT5w4EQAmCgATn5kCM3j99C2Sb/Qg3NHVSHfGD6D1yQDQL+x5eHc5RT88rSnTQWGCAPDdX/bOWRXhpU+AAQQAgC/dBiqsX3pRqbX0KktB1PkEMQFUAD5BzluvfPnFF198IgBceR16ywAYwUQOh69fvXcPniAbgqw19Ygdd0w5gB4A2tEh9G81UQiNDaCz57vvvzu9fvosuP9kCcBkBkAm8LX/nABvfQJaC/D1d+QgwLWAAEAEaHsgL5VA/9VLgmgqkPTXApjIWrMQAY6HVBwvR1ZE8cV28M3dkQvDcQFofxwH6P/u6rZ50H3i9Elk/OQCGBMAEASuzHQM8GICq7kaXLpasgA/AcBfekUxPjvKq2PSWXJ82eqgtUJ/fQBT2AKE+hMpI056jh5PmTbvlfcp8HwjtYo64+/oGN0FWoWwC4wnCIrZwk7k1c5vv+3/9ti8Gc/PeH4KD74MgGMAA/j+L+/a2TjwZgDaIOsSpAUAC+CewD+Sh54MYCXrDe/3Wb0RX+Ybufalt7/85BMCAPcXAJ6XgoCIAgyA/zlh8vMzZszjrIC3u2LCwJTtm7IAAaB1fACkydI7d3sQZa9us5j+PGTKlCnCKwnAcyIGSCbwlwN2VM6sIBNwkSyAXSDITwAg5bUA0BYG0RUSq1fjsb/na6Q9W4A+gIkmAMA1JuCJzFuOcPCN7Ah3jSaKxgWAPozDAXp67n5zdT2aUzY/AwCyC5BTEoFtdo70+gBL0dXouwAiviN3QXxYkvRf60MAfIQJbAyKXPsaJUDIJ5QA8PeT0wYAJrIPPCOEsiKeyeQp816hcPCNPG00niygD4AejUd/qL+cww9Ufm7alMkSgMlUB0yZOIUBCCf47sutds5BS7itC9JzgSCKA7QoSmfm6LW4Nmyg19YTAGAFG9aiAvzTn/4sAWB5/5XnJ2gB0HtoTn+JAxkDKoMZkyc8j6wgUsLI4XA4AAGBH4/DBe4emIeCDzY3ecJzEBp6HYBpAHD1lmQC97777sttnv5BIqjjAwMIIAsI8uPJkK38SnwAQC4QSa+wQDdUbli54e0//fGPfwaAP34ix4DTOgCSiOGfJAs+8/zzzz777D+88votKR6O1wW0jtDaajLma+fI7nT03Tg9HYLIN2HChCkE4DnJB6ZIAJ5/5ZNbEoF79/5y69Y2O/8g9PY+lN1pjtfXTw724sU2AGDlyrUrfQhA5EYygA0rX3r/iz/9+c9//uMfAUBnAc8OAzBRT/9JlCUpHlI4eP2qZAQG9ZAoj+6jCKZIph8DTMU/URF0tLYr2yUuHf3f3thmMWkaRDfoZAJ4L4LAJCSBZ5GSvgSA7767d++vqIlvbfNEpKPaBrqJNC8+boyUBbrjUz6Rkb4bN25YufKl196n4f8zewCJAPC//9ezz0/U6TtJb/z5obZCosGYRnWyVCZ/q98j4RNaIKMAaL1Dn7jTKnykvb0L9X5Pz431GPxJWvV1vi9FQaoGJvzD/waAL6E/Afiv77+79+XbnkjzVNxAfEWyj9S3AHo1EaISGbklCMO/mPT/k9BfC+Dq+8MA6LPQJgetTKQakVzhlmQDX3MXIxfLhgAkEarfb6W3dr3MgM9+fRft/vqp6Pam6YX9yQYfp9C87eRn/+Ff3v9EAvDXvyIS/vWvV972RAj0XS0hIAaR+vpvlC8TQvj3Wbn4pdf++GdjAFcFgAkTnxkFgAECPKnnKDF+872ojUwFA2MAHB30AkK7DAXa3z22fNb0eVOQ9WSfnyw+TmER6sMCJgDAv3zy5a17wgJA4N5fvwQBO9i3loCoeMn06YSYnviw/u9T+B8G4F/GAYATpB4EURzcEtEAGgtzHsMCtPFQC6Dnu6+3LafIN3HaNFjWZF3el/Un3HAOWAAA/D///v4V2QIQBP7rv/765ZdvU9WDKCAB8AvSiZ72pP/i14T9CwB/FACuXpEBTBodgE57elIT6f20KctPX/1Wn8GYALg7QJjkuPB1z93T2+ah5kPNO00/5cnBX9J/0qSpBODZZ/+3AYD/kgmsc/bnKocA+I0AYOVKTwoAf/6zMYArVz8ZL4CJBjZAFoFCBXZwmlMj+4JYWhsJQLvOG6ichutj8OfNmKYteSca6C8ecg1AvcnkZ/+XBOCW5AL0DgCuvL3e2SXIZwkhIAPw0QJA3YPs78Nbpl96UU9/PRegEEAAJo4JwCgUykM07fkZC155X6oStanBtAWAQIcImP3fIu2h6CHtp03RAzBR0nqKHoDnJAD/IAO4JbkAEwCD09s87YKWkBX4+gbpqc+ykkqBlS8h/v3pzwYAuBfQAZj0BADEU0SF9Oy812kO6d4tmcFIFnCH9f8O9f48BP15MHwp9E/Ry7TGAFAQUHtuAEBYAOS/8OCLq9uQDlldfd2DhPoA8NJLHP///J//+Z9GAK4+DgB9DChSnpNywvMs0+bNozpRtM53R4gBYtoPnf4UKnkQ8wjBFFl17khNAeBCkCzg3//9k/+/tnPnbdwI4viK4lKmJdFXJScBLpN0qU6ABbhI4bTGAfkUcUH726S7jo38HQwIBCuCtAAhwCEIQoJhOukbqMjM7HK5y4fkR7LwHQw9eJwf5/GfWZ5EALYIYP8V/rGyLLMy3q5BEFxfKwBCEKH9IH7oA4Xu0P1TE0BE84C3ARBPilo1wfPFZyAcbrEyAAITwO8Y93/9TZd/JTwfl+NyR0h+hGmR5uY9ADgC8AOUrwQgrwEgg+12dSMI/KTHAF7+Hwz7awCJBBARAPZyAFYNAKuz+BVFPHSs2DCAI6wJwD/q2oPT4/q6XX0Gx5+S3pUl3nEdNYejgxu1wFWiGGDZ4yAN8ZRFNyBCAOpADgCyJHq6Qye4VoEATbIw/+7yCvRfKlcNIBIAHh+DJQDgugzQu4Luh8FsGQKSgCpblBg/SQ+g9ojMBye9v51NyPVrAG6d/yq4Lm8BIC9BIfhIAFQ7RFkQCQCCEgwiAr9cEwXcFv0ZP0EKrz+m/5b9EgA4QODPbeYYzc9pALwnI5L90M+B36PMpUZhvfr8aTbzPLLeVeYroWMAaByvAuCYACSCPXiA8IGyzJPn36A3WohvloTELz5WUNqv+z9lgLgB4LUe0LbdwMD+AI1P/dHq1++x2FOeJNMbALgOoNUF1QQQQJhuImm/ILDf72ih/QDg6cvNQn61psRws1ho11+3P45UCkAAfPBeAOZpMzT/z+3qdgYpbwoWT7wR5kv8rWm7DsBtAXA1DwiLTaLbrwDsEAAIgqfV/UJ8+TKG/zV9ptxd0//NGoA50B//twDQA7DYffJGswlmR6e68tU1bdkvAbidACoPWIZFmWjmiySoAGTZNqGbyKpvYRfXP2k6QGX/mlYUggeMmWH/ewHAsww1voca33E6gr5lqMUtq1H1uF4DAIBlLzcKgEKgAOygNcgws4EsXFTfRH91F0WhXv+b1x/sRwC2LTaHG5aqCXELgLpofQwYxH1leMN+t4NYddA3AyAIWZlBaK+fvgCCBX4L96UfqvyX6gCqEigBLG1m9sLahLQTgDrtXidgnujvHVEVXBzvOX0AqNN6AYB5WZT5EQC44niL8v7+6mq59P0gFeqBYgAAA9NJREFUSJvhr6Zh65MAyDOdbsfgJxaDlO840MZP8eRJKuHNiF2xrznAMQCgBG0BgDbrKgK5YX5ZbLDAh49hgOvh4SEw3V94QGIACIJxnwfAnw4AljjtOuC7ANAcA/t4l6PtUiwZ9muRVFWAbgBSCWkAagK54QFFUWzKeBP6/kO1ggaAWFPBsEIJwBm+KgnWBKw+AOj21C+4wgfElL95/Q0NaAIwXuwMHZcxyAFQ6/LsWQB4prFIDUAGQRnOx7TmyyUSKNJCJIJaA+DGeIT3h0GODDAHIgC5GYDzYGOXCB8QW0W68Vom6AOAUc9PpL8KQNP964FgpbcBoB0UxS5PaBQAAHB3TwNQluKnjC/tKntb3ni8BAKpBgC3xSIKArBeAmCWw+XmaDvR6Zfd/F24/xEArgmAvw+Ay3wEkOsAEsMFDuQFt5bHJkLZWpZtj8epAFCrwCgxAEAOlL24YSS3Ggh4oyes9lKPAGjZ0VYMvdLafBsCsJcAgFwAAGTZM9mvETjQzz3zmDfhMmghdY7naVGk7SQAK1YeUG2Pd3iBeuBVANqXtKvyVwdtK6PmIxQCcwJQzYJyuXYGgUdrNILjiTEaHdwGz6E0oBDQ1vgTAYjDwPchZKDvHxjTTy0K+BsBHBWLrwJgSQBjBLDrBXA47A4RNF2Wa/EJlh557x+3fc0DNqEAIEIAAQSUA7nVBFCPKQ0AtQWdOUC8gNVbG+o1bg+G7jSqExl1AqjXvkYwO6tcZjodDjhN1EFCBVAew9LwAAIQIoBQzMOs3mXmwtYTfTmAd9S9NwJwTwDYS/MP96ORFA4IoBrWjEBFb8pSU0IKQEg5gL8fQMOSUyFwbApyxAPSYtdFQAHIrbMzNa6bToQSGQ5cZvvlptTtJwBJHIapD1WA90z/GuZZJ1/xPwHgDQBZdwwcdpfe2dmwBgAEBvA+TDG2DIBYVgEEkIAkwBQwPwaAvx3A6SrQ3nd1tduCOgAEBCDDfVFzCQeIGDsbVbob/x8QDp4x+cCblySH5DTMBDDuAdBzvt2vauBiHT1/DwD+IgADMRYmADvcGm8B2O8P3shjfDqlGTVWAXG7hc0mk+EE3puS92sAYgHAfg+AHuvYCdev3b9/vqo1AnJrBIwoBYGdUIQ5TcdzYf9+bY3c4fl0em5dXHw4P4cCAARoCxN0AQM5lMYgIGNRBcSNYmFBrQDn7W5Qq3C9abBrpvECAB2S++iQVQzd4W8EUIo0SHpIAqCeEADMrNHw/Jtvf7y4+Pjdxw/UiREBZDlwUAwoALFcm9QPcSTMzX2Rqsyr26dfDeBflf6uKaayqh8AAAAASUVORK5CYII=', + gender: 'Male', + birthDate: '1958-08-17', + givenName: 'Louis', + lprNumber: '1958-08-17', + familyName: 'Pasteur', + lprCategory: 'C09', + birthCountry: 'France', + residentSince: '2015-01-01', + commuterClassification: 'C1', + }, + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + { + '@vocab': 'https://w3id.org/security/undefinedTerm#', + }, + 'https://mattr.global/contexts/vc-extensions/v1', + 'https://schema.org', + 'https://w3id.org/vc-revocation-list-2020/v1', + ], + credentialStatus: { + id: 'https://launchpad.vii.electron.mattrlabs.io/core/v1/revocation-lists/25ce0f22-975a-43f8-8936-b93983b3e8f0#79', + type: 'RevocationList2020Status', + revocationListIndex: '79', + revocationListCredential: 'https://launchpad.vii.electron.mattrlabs.io/core/v1/revocation-lists/25ce0f22-975a-43f8-8936-b93983b3e8f0', + }, + proof: { + type: 'Ed25519Signature2018', + created: '2023-04-24T18:13:51Z', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..6QxpmD1apUezx-_0zNNBEuRDCohh0EDuSQyWPPG_VgFx-eDtDfgpfm7-JcErW2xn0FihqMzxCxgMvRL2lzJJDQ', + proofPurpose: 'assertionMethod', + verificationMethod: 'did:web:launchpad.vii.electron.mattrlabs.io#6BhFMCGTJg', + }, + }, + 'eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCMwIiwidHlwIjoiSldUIiwiYWxnIjoiRWREU0EifQ.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0oxYzJVaU9pSnphV2NpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpYTJsa0lqb2lOMlEyWTJKbU1qUTRPV0l6TkRJM05tSXhOekl4T1RBMU5EbGtNak01TVRnaUxDSjRJam9pUm01RlZWVmhkV1J0T1RsT016QmlPREJxY3poV2REUkJiazk0ZGxKM1dIUm5VbU5MY1ROblFrbDFPQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMCIsInN1YiI6ImRpZDpqd2s6ZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0oxYzJVaU9pSnphV2NpTENKcmRIa2lPaUpGUXlJc0ltTnlkaUk2SW5ObFkzQXlOVFpyTVNJc0luZ2lPaUkyTm1kR1VqZDNhVjl1VFU1VlZIQmxVM3BEY0hKNmFWRllORXBDUzFOT1ptcG1lbmN6VVRWaFZITTRJaXdpZVNJNklqSktkRVpwVTJOdmIzRlhXV1EyVVZoT1pYVlJUSGhQU1MxMFpXSnVNSEZTWmxoNlRYWXlTM1UwY0VVaWZRIiwibmJmIjoxNjgyNjIzNzY5LCJpYXQiOjE2ODI2MjM3NjksInZjIjp7InR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJPcGVuQmFkZ2VDcmVkZW50aWFsIl0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9vYi92M3AwL2NvbnRleHQuanNvbiJdLCJpZCI6InVybjp1dWlkOjU3OWE1YjljLTI2Y2MtNDgwNi1hMDYwLTIyOWMwYjE5ZmI2OCIsImlzc3VlciI6eyJpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpQUzFBaUxDSjFjMlVpT2lKemFXY2lMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaU4yUTJZMkptTWpRNE9XSXpOREkzTm1JeE56SXhPVEExTkRsa01qTTVNVGdpTENKNElqb2lSbTVGVlZWaGRXUnRPVGxPTXpCaU9EQnFjemhXZERSQmJrOTRkbEozV0hSblVtTkxjVE5uUWtsMU9DSXNJbUZzWnlJNklrVmtSRk5CSW4wIiwiaW1hZ2UiOnsiaWQiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIiwidHlwZSI6IkltYWdlIn0sIm5hbWUiOiJKb2JzIGZvciB0aGUgRnV0dXJlIChKRkYpIiwidHlwZSI6IlByb2ZpbGUiLCJ1cmwiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjMtMDQtMjdUMTk6Mjk6MjlaIiwiaXNzdWVkIjoiMjAyMy0wNC0yN1QxOToyOToyOVoiLCJ2YWxpZEZyb20iOiIyMDIzLTA0LTI3VDE5OjI5OjI5WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSTJObWRHVWpkM2FWOXVUVTVWVkhCbFUzcERjSEo2YVZGWU5FcENTMU5PWm1wbWVuY3pVVFZoVkhNNElpd2llU0k2SWpKS2RFWnBVMk52YjNGWFdXUTJVVmhPWlhWUlRIaFBTUzEwWldKdU1IRlNabGg2VFhZeVMzVTBjRVVpZlEiLCJhY2hpZXZlbWVudCI6eyJjcml0ZXJpYSI6eyJuYXJyYXRpdmUiOiJUaGUgY29ob3J0IG9mIHRoZSBKRkYgUGx1Z2Zlc3QgMiBpbiBBdWd1c3QtTm92ZW1iZXIgb2YgMjAyMiBjb2xsYWJvcmF0ZWQgdG8gcHVzaCBpbnRlcm9wZXJhYmlsaXR5IG9mIFZDcyBpbiBlZHVjYXRpb24gZm9yd2FyZC4iLCJ0eXBlIjoiQ3JpdGVyaWEifSwiZGVzY3JpcHRpb24iOiJUaGlzIHdhbGxldCBjYW4gZGlzcGxheSB0aGlzIE9wZW4gQmFkZ2UgMy4wIiwiaWQiOiIwIiwiaW1hZ2UiOnsiaWQiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTItMjAyMi9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDItYmFkZ2UtaW1hZ2UucG5nIiwidHlwZSI6IkltYWdlIn0sIm5hbWUiOiJPdXIgV2FsbGV0IFBhc3NlZCBKRkYgUGx1Z2Zlc3QgIzIgMjAyMiIsInR5cGUiOiJBY2hpZXZlbWVudCJ9LCJ0eXBlIjoiQWNoaWV2ZW1lbnRTdWJqZWN0In0sIm5hbWUiOiJBY2hpZXZlbWVudCBDcmVkZW50aWFsIn0sImp0aSI6InVybjp1dWlkOjU3OWE1YjljLTI2Y2MtNDgwNi1hMDYwLTIyOWMwYjE5ZmI2OCJ9.UazGcYVGIW0xKeqdP6cW-TFgkk9in2pXz5v4LPRUmHshj5O1m_i91O5XsMAZP0WC5n1bClKlXcMGrBqlrrH2Aw', +] diff --git a/packages/siop-oid4vp/lib/__tests__/interop/mattr/fixtures.ts b/packages/siop-oid4vp/lib/__tests__/interop/mattr/fixtures.ts new file mode 100644 index 00000000..4aa7e5e0 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/interop/mattr/fixtures.ts @@ -0,0 +1,53 @@ +export const MattrPRCVC = { + type: ['VerifiableCredential', 'VerifiableCredentialExtension', 'PermanentResidentCard'], + issuer: { + id: 'did:web:launchpad.vii.electron.mattrlabs.io', + name: 'Government of Kakapo', + logoUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/logo.svg', + iconUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/icon.svg', + image: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/icon.svg', + }, + name: 'Permanent Resident Card', + description: 'Government of Kakapo PRC.', + credentialBranding: { + backgroundColor: '#3a2d2d', + watermarkImageUrl: 'https://static.mattr.global/credential-assets/government-of-kakapo/web/watermark@2x.png', + }, + issuanceDate: '2023-04-24T18:13:50.848Z', + credentialSubject: { + id: 'did:key:z6MkkVP8oAK9wSpE5pX5A8u5pXZzdkYxpzEUrgGyQD11DsAM', + image: + 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAADAFBMVEUPBhEECw4MCQ4KDAgPCxsQDRILEBMVDRYZDBcTERUZEgsVEisWFRkZFhQgFB0uFg8pGBAiGhInHA0oHgk6HxAzIRgtIxsvIxY4IBoqIycnIztTGyZHIR85JC07JhVJIxM3KRZHIzJCKQ9FKBk9KiBDKCM3LCFWLDdSMB9SMCRUMRlOMStaLixVMCxINCtKNR9DNipcLydGNiRKNhlBNjVPMjZqLDVpLTtRNkJAOVdjNCdlNiJhNz9iOipnODBlOiNlODhiOi9nOxpdPC9bOz9bPDdZQBdePSpUPzZhPSRhOzhWQSNTQS9PQjZJQkpVQipOQj95O0h8PUNwQUlxQkF0QzVyRS1wRTV9QyVqRkF4RC54RhxyRyV1RDt5RSZuSCttSDBtRztmSy1sSTZfTTVbTUFeTTphTi5sSk5eUU5nTlxzUSmGSy1pVCpZUm5bVFxYUn2JSVCCUCWFUB6DTjh9US+ETy9/USt5UjeBT0F3UUuBTk1/UTiBT0Z6UkVyVjd7U0FqWUBqWUVoWUxtWjmVViySVz+WVUiVWDqTWi2UWySSWEiPXC2NWk6SWzmQW0eNXUKIXk6LXFmAYUiLXkd+Y0COXzqDXmZ2ZkCaXyJ3Zk14Z0eZW153Z1p+ZWmLZz2HZV2jYjeeZS5/bUGgZTdzaoujZESgY1ufZkWbaTl6bnB5bX6kZk6cakKaak2ZalOca0mXa1qRblKEc1KFdE2DdFmpckOkcG2pd1KudVqleGaoeVuQgV+oemGPfoSkfVOPgmeJgYSVhVeMgpaVhl6Pg4+ngmO0g1yVi3u1hWazhWyTipyzhXKWipeSi6qdi5GUjKSdj2yckHWXj5O7kXOnloulmnSnm32hmpmdnJSlnImgnY+pmpaumZaknJakm6KpmqannoWkm7uqoJOnnrKooo6mopSqp5m4pJSwppmtqJSwqI2ypbGxp6ewqKGzqZyuq5ysq6K4qaS8qqC1rKayrqC3raC0sI+0saK3s6W7s6y2tay/sb+6tqi7uKnAvK05QZ2IAAAACXBIWXMAABcSAAAXEgFnn9JSAAAAB3RJTUUH5AEJDh4BqLG3TQAAIABJREFUeNrMvQlYlGeW9200Jq2vCxoBnVEkssgiiyjTeUUFRIJswY4KAyL7orGdfK0gqMgm7YwdRQhL81IxSbfORI2CCqSNoMG0McZOJg0mkmBam8sLkGLCMp9FV8lH8v3PuZ+nNopFY8/1HhFKZKnzu896bzVhSKMvQ//DIv9GzbDPG4nuy3Wf0P2nZmRRs6hGlAlD//Na6yvKakgqm8BjNCijKKoZ1Nfa+D//rwUwkuojABgaZbxHpTMKgKds/E/yc/jpDXsGg48HQPrqESxFzc5g2gIe22PHAWukL/nhR37Pz/QH+iK1amiot0fNFPp03zQoRGPaGDTjE6GvHADUcjwQemueCMC4x5eGaQQuZI5DP/74o6pTqezD08PzVD/i/+BnaQBg8CcBkIOgSgJhAIA/8/gAxovAlAVIpvjDD9C0s6Ojo0+pZN/s7FOpHpHOavxL1lkGoDHU94kAkNJqnUjaP5kFPG5208ojSYYGur7++n5X1/2vb0BalRSf+ro61ezZZARsAxoZgX7e+ykANMMAaP5HAbDumoGBgUe9XQO99+9/TXJf2coMIAP8lH6AN8Aa9AAMU/bxAMgqa13habjAD5rxOIIRgEEgGCIAvV29sICve/Gwq7W5ra2N7aC9V6Pq7FSJZKWWfzwFQRp/9U+1AF1INGkBg/rPWfOUMricmMW/1JpBhDnS/8FAa+uDBw96W1sx+o2NzXhrbiYEZAfK9h817WrxHGAs5DA62LraT78CJD5qKS8O6n2Jge5qTrK6tGAQAsZpAfSTf3ickKhHRnpaavVQ7wMy+hs36lqJA9RvZmlrbm5vhSsICkpkRsqQGvKa4RnYMCgMDauEDADo8uFPBTD404IA/Xao1tZYR/o2ksD+W1paYAItxKCRY4FGqSYCclH06JFmzBZBrXMSyUxMlUrq0QAMT7mGquvkidMlMt8PQ91tzd0tjVC6hZQmvVuammWpa5XHv13Zer+1fQBRAn5g7GIGmg1pB1kAGBxmAcZdwU8FMPg4uksjIgUBtUYJ/bsb60hvDHuDAn8bGpqbGhvr4AiNjQDQ2t7eznmhtbW9r6+rq3dg6JFxK2Tk/8ObIeNiWT02ADJv6DY4svWT5oPjdgOZlmZQW+jTyMLh25rrKusaakhzRapCUSMEDxoaGhvbupETWkl9hMROZS+SZVevrlcc1AcwKJ7voImOkD85ODhabawxboaGRmvFHichUH3/wxA9vcFHjwYpig9ohlRdfUNKKNfYBv3zU/IUioKCgoSChIqKppqmpoba2tqK47UfN4h4eOPG11+TM6iUXRBkDQzVjz8aOL/IKiN3x0O61mfEokilHm8z9BgEtM9OI2zg0SCeBpK9cmigFWaPsFeH8a9rbGxqrilIDQ4uqKjFyDc0XQMAIKipo5x448aDB60iFvTBAu73oVlAj2QY+PWflqlhlj1gRAByCTSeLPAEXTIDoByOp97ZfoPCfSMMvUGhaCCBySvYCoJTyfYJAKRAQYEAQhEAVUF7u/IBkmZXp7JTNaQyynb6IXYUACaLQlEJjR/AkwplMFUfAltzC0J/TVlOWW1F7TXYu6KS9K8JTlAIAjUVrH9BTQOsg+zkBkJBMyFgEBplq5I72eEdga4wMAFArTfgehMiciWo1vydAGird1WvilJ6GwJ/jSI1ISehIKcgNTU1p6AgLw8IcoILFMEFwcEJBQpYREFCQkGBopKcAGbQ3d3NFdKNVpBo60ZyUKpM9IQmE4EcA1RC7ycDMIbV/zBC1uN3XL6rNAMqit/dyPx1HPECAwODE4JBIHhZcFgwQBQEJ6QWFCxbFrwMABARCgpyShQ1HCm4LKL3bSQcGZXtP6h0Vc6QcYc4ehegGuYCUi+gfmoWYAhg8EfNAFXnyjZSB86empAQl5iTmOiWGJaUtGzRsrBgEuifAAtYlqoAFvwL1lHT2NTYQJGgRoGAyUIk4BCtQ6phU1+PKeOeDxi11/thrFDJ+b/vvubHB3B+incY7JyCkpKSnJKSxJwwN8gyEMDQB5M5JCQsC85JTQoLDsvBF1JhoEBQwIcGUSM2UoEACK3KAV1s082Lj2dSTD0SAG0//PQAUAXyaPDhgGqoE/XM3xqgToEipyYnp6SS/D8YpgDVCQHsgPQHBvxNSgpzC0N0wBdTeFQUlJU1AB4LZQ0KjDcGBoY1g+Npi8cCoHmKQZAGRNX/8GFXrwq1vEaJbF8BB6ipw/CnktFjvAFgEelPgnBAPJYtSyLDAJACeEUBvqeitgzvYQSQ2tqaGgqNN1rZBLQxQD8SPqELPM0gOCimLoDz4cO7PQO9fdz3VZQVFJTBCiorE1J37HhZkkUIAsvwjgY/B++Cl4UtcguzWhS8DCYCYJQTy5AuawGgoYErhJqWbpQHAyrVgFpSfFALYHB0rccOgmo1lcIjTYWgptGM0SRzYS5Kv6GBh4/+++Gj3vahthaForahoIAUoapPWDt5PPsADXnYIjxKCaN/kFW4hYnsQAR2HD9ei7IBpWJtDX4EigTKCTe6Hj16iPqKjVr+vai4x0wDehlRpEDJ+9V6vcBIVb9mPHNfWgCPBgYG/vu/B3rb25obCspeLqjgMi81FWrD+nMSWIIpEHqEhCTBCqzcQpjGokWLbIgJAiYYVOwog8AMYAg1ipra2msKRV1jW+vXgoBmSK3USB3RozEAyGOvMZ4Ql0pBtoIJo4S9cQGQ2r8h0n/g/+3qUnZ31xUklO0oQOVHwY8sAPoj6wkAUNsaBKwWLbK2JhphbkJ/N7fgPNQHOTk7cgp2wH1ychpqERUBoBYAUBy2dmoePRwkV9MBGBwLgHpQb1aYwp56+NLYiE2PwbTWCH2RDEDoPzDwoLWxrpICfkICVXjB4s+yBEoB9GDRMjerFzzcPULC3Kw8rK09rKxCrFgIQKoCFQFg5SSQEcAGAKCCPKEBBNpQEfLz+EEQkCxAV+yNtiqg0gKQ9ZabY8kFDJepNeMEoJG/ZvARQlTvANqXuvw8JH8UAKj1kOyhc7DIdhT4KRrAATys3T3cD0B9FjcrK2sCAARheYiEqYCVAwb4mwMeIFBQ09RQ19zS1tYuBza1zgLUoxBQ61aG9OKfZP76AEaa5dSMXQMSux/wvk81oLx/gxpe1P7QNoFTH3sAlIeXU+gnDjCA2RDLZOhua21ra+0BIGwBISFulBKJGVoDwpeTA0dANERB0FjTSASUePqDhgBMd/76QVALgFsC4zXS4cvjP4w/AXJi/lE1pO798ceuG8eO0fRWA8I/qY24vgxFDqI85T0WAIDlQ/1Zsyzs7S0tLSwtbW1D3UNCAQH6e3iEuHlQMEgMQ5G8jGyAGqgKqpAawABGoFSq1f0qlVEMUA9bKJZDv94GCVOh8KfuDxCuwzWKEupT/9aC8jW1QpEKxfmNy183N2srtnZ+aGk2C2JvbwEMFhaW7u54o3AA/T2IhI0ffRNKhYSEyrwc5MXaCtSHNHnS0tKt1AypOg2CIC96GlfGan0XkBcHRwIw0nTuOJeAYFdD6tYbdTSZ04aqrYEqILJntzDkeXyQnBzvPdjv3aH61KmwAWCwMDOzsLSAI1hbW7l7WLl6uNsCgOMcAgACiXkIArUoDRU5OVQcwga6NZpO1k0GwJPouopnjKkQA+HPTHj8YdcPiPRQ3XHjxo32gd7WVvRyddT/JLiFuEL1FFLfjZW3NbeyJbG2nj0bmk8FATYBsgJ7C1tLWysrd3dbM1tXW1s7R5s5NjYUMRKCcyprUAmUpSpyliWU8OwpOiOVWh+ASQvQswK1Ng8arw2qRlob1GhMRUGjhblH0r+QWFpvtCpblW3NN9C/oQRAHgsLWZcMG2D9AcAWClqymNsCALSeOn3SVJjAVAYAY7CcY+tu6+5KAMzn2tjYzLGaQyEzLDFHoeC6iOooGEENWuT2Pv0gSI/UY1aAat3aoMZ4cVQ/BIw++a+/ejgw8EisXms0d2709SqVN2i+v66SElklQh+0T0G142HFA2/9wguWsy1nk7L2rP+sWZMmzWJPIDdAMJxtGWppaf1CKHzBnAMkggKZUFjYMuTCvKRE/MwwmjWqrKzrbuflI3qy/dpCbHBsB5BrYfWwPULjBKAvAsAPQ+ofWm/cUXUqW6l7r6EUiP6eslkSxj/Ew0qMvLW7taU9tKfgJwGYOn2ehYWZDAD/5z57trV1iKWVFXxitoXl7BesrdxC7a09wvLy8vLz16VQOslLbW5pUNR1d0OVPvYCjfonAzBe1BitH9Q2o7R4i07pxx8R/u90qpRK1l9RwIVvGLX4lAFCkOpt7SnU0+gLzweOWWb0APpbMhL6b3xNKABYUcAwt7Q0g7nMRoq0tXzB2o3GPgUAKKcm5cEHKhu722gdkVeDUBeMH4Ce5T8pACnWPBrgtWvNkLK5cUippNk/qoDQzYHAotS8vLBgSoHWlPOnTrXAG8aY099swDDDyJvNg6L2yAIMwMzS0n02lUNz5tjMMeNaCfHCFsZg/wKSB6qklHwygaS8yjxUW+gOu7uVSpRgCEIcCgY1TxHAeKa9JQCadlrxaYP719SkkvZc7wYngcAypH3rF8jgZ1lMJ3+HsmZmUMzSFgTMzC2goC19ztzW3NzM3Hyd+Zw5jgh/NmAAFHOszM3NKUVYUoWwbl1ISkoK2QIcorJSWl5uUyqlimB8AAx2jT0BAP0gKO1egAG0dLew+9fQhA4X/RwGktwWIevPtiTDnzUd7+0toKcZFLN2xwMLADA3JwD0wMrM3GydFQFYOGfhnDkO4IA8YGtuRokS7mAdiqSSkhKSEgbtk+ry6qQ1VRgCakPN4wAYVg6YCIIj7HEzWChmAPAAVOi3m5oaWH1FAc3roP7Nw1B5hLkBgOVsCvTzKPi5mpm7wcK5KjAnsZ05FyoCipmt1dyZc+0w+I4OC0FgoZOT0yInB5s5c81hK7NmA4F76DoQyAcB/Og8+AASTl1Lc11NczfvNRt9VkTqoKUJAI165J2io1uAPgB2AY2yFQX67aaGBl7lLchR5CUlLYP9p4RR0UcAuO6daob6BhbuACEjh4mb8yfmzjUznzlzJh7MnGsjAWD916wJjAtwgDFYzzaDE9m729u6JyeneFihxIQXIB3WKRoUTTWKumbqD0adIqbdEXIhwC3BMACGKo4cAo0tAB0ASj9a4uUFv4KauspKZCw2Vg8PZH9Lewp4ECtXK6i3yMkJyjnMoUAH+ya95841N587lx5YEQAHBycHVj8aEotHsBhLmBCCpXtoaHJyKDdNIZQLAKCggedMW9uH7aUyXhQXNiLvlxzDAkbawE5dv57AVNRDAkBtbYMiNbUSRlmZn58P5UNDPaxfQIkPAPBxc1sbG4dF0N4p0IlkoQMNLXwcGoPATDs7/MscvgHTsOGvWLNm8+bNGdFrvJ3gEdazqWa0cA9NPnAg+UCIR0qKRwh5ATyO5koQClo5I6pH2Sct5scl3ceygJEnAx4ZA1ApSf8KVKqoU5OgfyWeYnKyhztKudmzzBDC4epzbe0coHpgIAFY6BQY4OSwkEbbys3GxtluLnm/iPtuMAIbBwawefOuXTtBYI1XoI01tLeYCgDu7qH44UgGCIZJSZVIOjkMoK21laa61PpRz8gA5G7YcFFsuAUMaIakrWnDAWgYz6PBR5ID4NGA8gGaX+rVaCKnEgE6/8CBdTBUd5SyXOG42s4lxw+UhIfXCxwoFNj4LXRwnDPHzm6ujbMNCVIAjEN4wOadOzdvjomJQSxwQmGAusEeBGjuIBmx0CMkKSyvQJGQWlHbQLNlN5Qq3iEjTxHqw9BIE4FqaWpkeAyQ6x7NgFZM7YYx2vn4kCaBW9saayoqaPWXdjzkJcECDhwDg3XuVPTPsjDH2MLrA73XeMcGOnlDoJ43Y0C0I10XLhS6L3Qgx8Cnnby8vaPXRGfs3LkbfzZvXhPzz14L58wkAJDQZA+0BwgyYcu45ipQKGiuqLmtXS22pAgf1tsfKE+GDdsoqR7mAgN6AMbcD0i/Df1vW7MC2S+Hp4CSqGY/duwY9A91Ry0/a5YZ4jxMnyJaOMzZOzycGKxZAxROXgFOAoSDg6MjhX4QgIN4eeGr8PUAsHP37t1sBmtAAKmS9A8NpVyAIBsWxqurOTC7hhoqDJW9Dx+JgohVHBvA8D1ChgA0w/tig2BBAB60tcACWPvg1DxUqZVUoBxwQwOIIIAKxmoOhh8GTQjwNz09nD4ABSTT21sOiY6EYBW0d/KOYELR0TuF7EIo2BwThcxhbuVBABAIDxwIAYOwpFSYXSr9zjqaMm7tpO7MaHuUXg2kGT4frh7bAvT24piwAFVrd0uNoqKgjADQWCAJJiUlhVi5mZuhyrecbeUWQMO/OWNnRnkGC3GAX0PCw2HrMAUvr1WrVqxevcppFYyfht/LS4QAkl/v+g0QbM5AIJhj5RFCFhC6zhUelow2OZj8LowB1DWiGBjgqTn1CLWgCQDGMWDAOAZoNAY2oDEE8HBI2drdTOVPDWlOKQAf8sJo3YfKHFuzOTZOsRjLjF0ZOw8f3gkM+AuT3h2zBtEtPSoqK9zJG/pCNm2KAAsoH54V5YX/zdi9c9fhQ9D9NxAYAULhokVojkl9V1dnW9fQFFpKywuj9rCS8i+qgQdqjVpaBzKwgxEADN8uP0IMMHmgCL/i0Q/tbd1NVAJD+TxU53U0GJVJtPLlYetqO3OOW2AgfPnwrl2HITSSuzCoh3cWQmJi4ODpRdHRUVFRXl5Re9KyvMOzsrLCo8KjogBg56HD+AP5DcuuzbCcRW5WIQeS161b52xn52rrHuLG3TFEeEFdc6tGnhiUAqF8SIICv2rkg3OPD0Ds41UNKdtaoH5OAY98ChlAfj4sgGZ2rSj9Qf/onaz+LlkO7yK1Cgt3747ZXbi7PD09PQ0IotKOZoUDQGlaVEwa2OzceejQ4d/oABzetRN1YeCcOW7HQMDVbq6rLX4HaZ+Tn5KSx84HAkp5IlAA0C4GjAVANhXTAEwcqhQr1CpNd3MTbfjk/E97ACsrj1EZSC0AGjsbJxr/XYd2HRL6/+awAHDi1zsPQflfFhaWk6THEIC0tHC8KyoiMjG78RWsugQA37Vzc3R6IMrH5GMH4AXmtq7uIR5u6LlS8AuTaNsVIeDmWAKgH/7EWvCTAjBBQPySITWKAGoB8sLwLPAEjiWjCnR1dUcPYAsAfrHh0H/Xbw79+te/hiK/J01oUA9hfAtPQtPCc2cJQHp6UdFBEDiYdrDqzBl8/pfSN0AkD0AEAYFoxAG30GRkQltaTfEIQdWdkn8ghQEoFBQJf1CLaaJHRgBUjwtg5NMZ2qWAQU17c0NNhaIAToguFc8FlXqoqx3Pfduisw8ITycAu34t9IEebNTsAYVEAAAEgfKiIuhfdLCw/OTJk4WF/8bf8HsBgMwHbwAQkx69cJEb/xbbdebrXENphgS/NTkFBZiiQFEDALQzTwAY1B0S05iaBjIFgBDwXxmAydOpbAC0H7DjRnNDQwVqAABIQnkeihbIHQBQ/bubz7HxS4T+MgBpKMmoTxw6ATXLT547V34OBPCh/FxRVVXRmaozxOXkyTMnf33oEL5D6H/oEAURip47N6dHL5oTxgSQCkNDPMJSEHQAAH0B7y6qa+xWchSEC+ithI0NQFrlpFqa3tAODBotCsvqizM83BKoWxECK3aU0fod5YFjB1CpWbuvQ+Pvaj7XJiAuM0MKfND7/7AQgd9/8MEHJ06ehZy7iD/0VgWprq6uAg8A+PDDD0/+W+Gvf/273//+BGCJQMg/Z/PmaO+FDn4Yc4i7h9siagkBID/EDUkoVVFDy6cI5Q8HTR0Xkt5MVoLy+rh279lIBzTEPlCaj3/Ufwd9QEXBjh3BCQmoyZPyeWRQrFEB4OrmEJe5XcS+Q7+W9f8/7NcfkFwkANAeQupX1deDAOzhLPS/9OGZk4WHfnfid7//3QnS/9CJE+InIQyEewUkQv8D7smhITwxVFmJ0jAlhKIAnKChpa21d+DhI+PDEmotAJXRSrm2EDIGYHQERUeCZ2EhHa3qNkVFxQ6aBU9VkCkiPrt7QH+E6HUhgbHbM9h2aQCF+r8XogWAsScE9ZDLLKBx9hwB+PDkyf/43e9+Bws4QQgYA9cRMdHeDn7HaF4kOTnELQy9V15K/jFEQhSglQU1NTXNbTeUAKA2qgfHBmCwsmZ0QF/vBIb0b9oPRwZQg0YoJwElOffBABDqYWsJDwgNCQjcnpHBPi/s//f62kN/yKefQvnr1z/77LP6yzdZ6unTHwo5eeJ3vzvxe/KCEwIAcgcVA94LA0rIBUJDkf4QfvPy6ygCIyEWEACaHEEMH1SpDFYI1WO5AB89Gu08tu7fouFS9bW31TU20B6Y1AKeBqPnBAuwtLRHw+IG/Q/vkgOfDEDS/oNPoTzks3ro/9VXn31286YWwKcX6z/88PJNIvDBCQkAMUB43I0aMiM63NsppZJjQIhHCBWBjY35Kfn5SZXUitMOgrYbvQPqAVox0wsDRhZgIghqTLqAZmjY5twhCYCyvbmuEX0Q7fKFHSIHJLvThIU7vDM0f1Hg9sMEQBp3dv4TH5zSjr8A8Nln0B9CytO7z+o/+7T+4odwCXICADghACBtID0QANQCsQsd8vHLYG0hISEpVAPnw/yoB8tLpdWCtmYlnU8dNNgjZsIFDEvh4RdomL7AQsM9AKUCZTcXQQXBtP09P8TDNhSJicXd/ViIU2zGYXnwmQLU+IABfEp/P5UBfPWVTOAregMBOAQBuHjyP07qABziugHNwU6eKE1JoenRZJocq+T+A3V4HrkDNeON7AOPHo68J8DUypCpanckALwzT019sIKKAPrN+cmh9vbCAELd7Q/khzlRCpQIyOoL69cJbP/6dS0AZvAZyacUCS6ehA0g+h+W4iDKg5OoCHbupHIwLJ+DACig9chrbAQAxIA86kZpd3mb8nEBPMaecwLw8JFKo/xbc0WFQpFDAMKS2Prd3V3dMTAeKcn5boGZ5RIAMfyGti/0/+qr69ev6+v/FTlBff2nFCIoFp48eerUYTkE8rtDlAcCnVANCmODDXAjilaMZmPqKvMYwAMC8GgUACNfoTEOBARgUNP9twbe1JsK3wvzCCXPX08YQmlJIN8mMDN9pxbAKVl/KfhrAXzFAK4L/UUmgAF8ygmCCiIiICVBpMFDu35NBNLXBDqEcB5Y5+qeTIuFogknE6jL47mhB71PDGBofACGhrr/VrHjeAEBCEvysJ7Ns5U0IlSUVLoFxMVG0zSAMIBTJ06cRPV36hRSPyn30Uf4++l1HYCvbn7++ec3b+INbkGp4KNPhQ+cPPuB8ADozy31oZ2bM6KdHELoFyXTzGMILZdTFEhiC6isq2lobut+0PtkADS6E98a3ZFsIzw0FzQ41N1S+zIthaaGhaWEWVuHkvHThB161Py8MKfY6BhpNoeN4AS0PyWZACnPAfAzToNAwBngc5ably/DCS5SGECJdPbsqQ9OHNIJIaAgYON3AGlgW+g21B20YpxXmU/zIvk0IdEo5kcHNHRoz/QU4PgADA13iSHRCv0AI+jtbq7dAQMoQARISfFwC/Eg7UV5lpeU6hQdTQsbv9ESkKsArQdAfRHytEWADOAyMbgoBInjRCFSALePhYeoJYAFxDrZJB9YT0JTpGjD0IxTWZiTT1NjvHNALJr/JACm24FB3qg7+GgAbcAOOuaTmpSfT10phyQqhFCV5y1zio4BAJoBkNwA+UxYgFZ/9ncZwGUtgJtkAQIAimXqm04cko2Ap1OoEnCyIR/YBgAwPF4nCgmh2SHyAFTDzS0MQD0s2j8GgNGualJr+gGggQCgCQojAHgCbADuNEVRmbcoOJYsgOpgxDCEgFNyDfSpDsDlyxT0bxoaAOt/UTaAs2dpLlGKADxFilJoTXRmoBMArCMLsHenbQM0Avk8JU1nbG7TZkol98BGtyc9FoChUe6qIgtoqC1I5bkAtIG0EswT1qEHjqXkV4YBAFkABS3W/4RcAoo8ADPg7odsQNYeEfDzyyIA0PhTm8STJUiELLsEgp0EIDZwkRstPrEPIPqGiK0jNDfKp61ut3R3K6WtsU8CQJcSDV2A5laFBQw+7GpuuFZbUatIpeorP/8Yd+i0KJacUpkStigwNuafdwr9uQaidyeELqdoHkDq/i5/dlkkv8uXP78kERHqlwsCZzkMHJYY7OKOKDp6e6yTW/KBda7r1y+nesg9hGwAAOAAdDj19u0WBAH9tdAnAmC6K5IAwAJqaAevgmJAJbfkB2hJjJZtUlKs3QLD12zeuXnzYWTxw9BbpHH8vagLAKL7uXyTw96lS5c+/xzZgLIgqY6KuJ7KAY6DOgK0WEIxICHYCr2A63KOglJNzGlQUVvLAMgF5L0Q4oN6tFrwMSpBKQY8HOhuoKMwFcHBSUk0LUdTAe7JXAfke1i7JcIC4AOHD9GzJl84dJiHk0ucT8nxL5PD36zX83/+hEgA9fVcDohAePYUO8AurgOEC+QkuLnDB5aTDyTz3ABCABxAgdIMACgGqDQPtfoNatSPVQeMDWCQAFTUpqYqUgUAFMK8aEeukGLl4ZYYzgBAYDM+HDolOT8juFgvxXzJ+BmGDgH3QlwkfCoTOCtbACUCsoDMxLBQArBcAiB6Aj6RXlHbRB6gQimoswDNaPb/RAAeDXTfprNcaAZ5S2wougCuhVCfJQNAgADA6wCHT4k28AMxAyJmf2R1icClS5f1ACAwwEXq66vO0Wxp4c7C8kIKhadEIKRpwejYuMQQAEhev3y5qEDxe/Mr8/jMIR22a6GF4ocPjTbEjXad3uhnbvQnF3UW0HKNz7ynhtFifairrXvy+m0cCkOsrWUAuzZT8D51SpSBPAtI059Hq8+fP39JRD2t/bPgc9VVkpzjUvBsYXrM7gz8EPztbuJzAAAgAElEQVQgnhsFgLjExJAQWBsALBcr5tQUJfGBO7qVpE35QAYgXMDE1sDHBqA3K4z3D3vJAioKEqgU9nDzkHozjki2ttZhcbExtMcF+rP2kgljQAvT07OysooOZpWWlhaVVlUJCLL61dXV+Hx19WV2AuEASAblu3fulBPBZooBAEAOFxoqbMAdvz/EI5gIKK5dQx1ABvDI8FzUSGGADmPKLqAex/WMj3i+tV+l7L59vKKmJjWYZmKSQkJDePcOXHL9encLq5C4wGiqBdkAeEabQJxFE/TRRwjtn4pZDxrmoqKqeoZAQ19UJc0N3hQx8BxNApw8S1Poh3bu2klLA+QB4XFxASG2tA+FliGgPiQUgQgleCodsSMAss+P6v0PZRkBgMYkgAEuhJTd1+hEa04CQgAJjf2BUK7P3e3RosVGUzeweSdMFxUxB8GP5D7gotQLfPYVgSAI1Szg8JVUFiMC1kv6Q/3yw+U0/NB+MxlAeFxAgJ8lZd5kMQPlQb+dttUXVNZQFuwWN7Op1KrRg9+TARCRQNl2rUKRo6B5CNJe9AHuywUA1xBqh2NioD8FLuEF3AuLNEAERKSXOoHL0F47KQAOFAdRDdHqIa+glJcLD6DtMmvWAICfq30oARDzQqGiHApLUtQxgDa2ACkDqEfOgaR7DwOQjpaO1wLUcIG2a8cViro8ng3m309pAKXZ8vXurgAQIHzg8E5tFCAlystJm3MsUrLT9QLaR1wQ03rZOe4BxTdRGCzP2BwTHb0GScDPDR4nyk95HjI0BYmwDp0AAxhQq8e2gB6WxwegVg+q2AJoVSKFCzFeqQCA5fbL16+DhAQEwgR2ZuzUhkFa2kNGE3LyZOHBM2fOfPihlAg4Ld68flOUhZcv81IR28q5i+XlGRm0jE55oDyDt48CANLugdMHxO/mvhiJMK+yRlHXdJtcoHdgfDFAC8BAe/EvlV5q0D0CAOoIAKC2VlFQyfaPIpisMRQesHzW8m3Q39XVDwCiM8gGpCRQrq0EYf4YeVr7IIsn6+dSGMUwWT9iAeIiyzlJyjMoCQBBYSFtMYqODQCAdeu3HRPjj/QLOXCsjlfICUBbV89D/cORYwdBtUqllwglACrt1QsalTGAh8oWAcAtxDV02zYQSKYQsNx+FlmAq+s6x4A4AMiIEenr1KmLkv6M4DMtADkCnOdm4PPL1aXV0P4z7olQCdD2CWqKyonBTt5itWZNdCABgNYcA5EEkwnAsQOVeXk1lRIAKKUZeyZMD4DB5lIBYFAPiUprIgCgZhdopoPtBWFuVutCbddvo/GHA1hYzAMAz+Wu65wT49bQ881g9c8KkQjUixRYLS+IacuA85QIeGWAegJ8SbkUL1BASATIBQID/PxgAPitogWX4mA+7RIhAC3dVAY9UqkeA4DBfTtqgxvqtItLuiCoEgBgAsFuPBGwLZk3x9oTgG3+nkQgMS46IzqGdkgdPiWUP6cFwMGvXs59ohX8/NKR85ekdqgeAC6LavAi98ZCCgWAWMqCBGB9KO8c9RAB6ADPCNY1NVEWfPS4AKT2ULejcPgBRJUuDRKAltrj6IYLlll7wAZpZwwAzLKYJwFYnpwYl4k8sDsjQ2cA0EE2gHp59DkDUgA4f/4P3Ax8dfOz69c/u/whygOBgFTn76VoKAHw8/NfL8+GhHp4hCRRE8pTQnUNDEC2gNHdQC8LyLuI9QAYXFpJcY8fPmQLUBEAuhsjL8nD2tLensaAjsQRgPV4bvCDkMTY6PTo9IwMNDJnSYV3pL0g5edoM4DW/G/eZO3PX2InIBO4fv2j+qqjYs/A9evndBZABCQAjogB65ej/6YGLIlCcWiKsIBGGYB6rAbAKA2KRMixUFQQptPgwKNH+JK+IdofWVNXmU/TAPb2vCxkYWGPLLgc5miBQBifHwgTSM+gWpD6QZTAVAl/+tn1ixfEhhBuAS8J+ydhZ8AnyPjxuPpyvTw5fK48HSURKgLon5EeHRuYGGDj6YkQwI1QqEeImIyDEVQ2NjZ3d9PK2KBBwT8AJOLtob4LQHtmMEH2fx0A9UgABkROpOvRFHWVVI26u9qiIAcGe35H0SAZABLjYrenwwK4Evzg1EcfiSWRi9dZbgp1uQGkj5eoOYQxUJMo/ldMENaLiHmufDdE2mpLQcDZ35/0t+VDJGIi5gBFgbrGxjYUAQOqQZPODgYjARh2vsr00QONAKAkADV1dfkHyARcXUU+cl9OxoDYDADJAZmxmVoAyIMsoCABuCknf2EFkJsyksvXLzMP2jUkpKjqXBUVxiILxAYGBLg6SwBoMU6CcIA3SxIAOlSr+YkANKMBUPEtQTKA0NB1CMnUnC+3oHiAt3XJyX4SgAwGIGdBuPVN1v/mJdkDtC5wU/6MYCOyRHVmUVFpEUlVEblAOtJgIDowZ+dkzgG8Gsl58MAxuABdNvNgQPVkAOSdFNo7eLUHTHQwhAuoCUAjYkAeBQHUoqhECAACIbRHbFp3IAQuEJvOJnCq/Ow774iSBr4v8h6XPvB4KFzNUyP02fPnhS2cZykuzs0tKS4pyYRkQQ4WlRemx5ABBLqFhfjbJbvb2vNkCACIYjSFATS3PVCOlO8ePuz9iQDUMoDW5kbaIstRkACQ/hYWZhb2nJQZQByZQHoGVH8HAHg/aFFpaWlx8QUod/68UJcHnZvBy+IzpDlLdnZ8IktEYm5WeHh4Wtru3QQABJa5hayzSw61tOSZSIoANCUtAWgkAOqRAKhMAtBoVxG0mys5CqqMzlxqVLSDkh53tt5oLlAoUsPyQ+3taXKSymALOud7QHhkSlgiA+D09c727RjG2LhM0ic3G7oVn2cEEgM2+/Oy4L+zWXM/R0c/fz+/+PjEiIgIIIiKZv0RBN3c1q0LDbW1pw05yXoA8hQ1jeJ+BbWxC3C+MwLwUPqPCfIFG/oADO+jFwQ0cAFaHgHg1tY2BZ2USvGwtCfvJwIk7gekifoAlEKZRAAMtm+H3QZAoJKjo7+/f2Rk5N69xe8WF79LDM4b2H7x3kh/RxtnEjs7/uAPBhF0kMQrnLvhuAAHm5B1IaEe1u72trwoz0mAsgADaFMalUDjAaC9anT4eXvtjmMgGZBOYA08aG1uoIsgw6wt0QQtFz6w3N0erRE9pZSQgAD4ADtBuqQ+dBcq+Qu1/CPj9+599903i4+8pwMA048McrGbO9cOMtdu7syZ8+3mu/j5+q5a5e0dGE6+gHY4wIYOT3q428uJMDn5GNUBeYoGqgSUStV4XKBHlgnaCzYMAKiGA9CoxflDVe9AK22UTk0Ns7KF4vNeeUVYgIX7gW3raQtfGAEgEyh/Jz0WAPyc6YDgXFLM05MfAYV/JAF488gf/iDGHm+52ZEu8+fPlcSOZf78+Y4AsCowFgIGAODg5kZX7riL+2ekljwlJRXVWR2dKB8BQE+PaQAq7XkSHQDpwiF9ANrDCATgQRsDWOZhSwWwAIA04L5tG2+TCAuTfKC8HF4b6GRjJ8kCuwULZkKgHAHY+ybJkSNHROTLBYAl8+fbOfPXenr6+69duxY+4+LrG7AqMJAQwAYYQEqINepwqgU87N3F5hwEwZqaxrYRLQC69poGIE6WGhyx117Bpm0RpMVG6obpquy2pgZFcF4YnRGlGCAqAYv1oQd4m4hbWCIAUBJA7erk4OdMmqxdu3XtWk/PBQtgBKScP5vAu9ksBAIOEO8bFET/g57K0xPfsHXr2qCgyCBfSIAAQAycHGxSUqxsMf6h7h4evEWLDpAoamsaWlrYAvSDgO4UQG/vQ35T9erLBOl2PcMbR6W2aBgAKcIq22431NAOQapHOA6S2JP5h8gAtm/PKKfzv6viI4O2bt2wYevWyMi1nrIIAHvf5aF/UwgA+PkGSfq/CFm8eCUY+CBqUhgAgejY6MyscG8nh8QUKziAtbV1CJ1UTqI986kFx2ubJACaQRMAoKxsCoiJJgDoTSDprt/SiwUyALUAUFeXl58SEkoVCbUBdFcKr1WHeFgBQFymABAdnpgNBUj/rZH+ni+9JAFg247cy/qjG5YtwE87/kzgxcUrN2zYyBIfEeANE8gUAPJTKAK88II13cxHNwvkFRSkVlyTARg1Q0J7fQBwh2EATGwoHH4Di/R1aAcaGlEMp6D5scWzsLd+4YXZL1i7034hDysCkAkA2yUAe/fu3bqBNfZcywAWCAYuQZHZAgBnAPIA/6CgtcJMXmJZ7Ll45coN+/Zt3LgFAAIZQBa8KgW2B+YvkA3k5yPq0HWUtQ0NzSMBMLIAAwDSQA/T3Sgt6C2tK5XdjY2NtEs6JdTDg+748LAGAmuan/BwtXL1C8iUAcSGJyLf7Y2E/yMDQi9PnTi7+PtlywAguX5+/i6y+gtYXkLoWMwEtiQGeIfHhhOAOCeHpBAPNjrrEDc6tQ77r1DQvYMEwGgchZp6AAQCHQC1CQDacxYmAFAlBADNdbRDM4UJWGM4aEAoKbm7m7v6JTKADJQB4QQgnsdVAIAs0BJw9osn9VEDVFcTAH8Xsv2XXnpxwYIZP3t+woSf/WzGAs+1not94AOiIMwCgMzAZWEMYLalbQhvjqEbDCuu1SqaWrRpUPuM9QOeSQAjzpnIxYGxbRCAtprGyjy6KyM/xcPdlu8BsrA3W26LmGxuzhaQvv2d7ejewiMQAxwjg+D0ketcl89YMIMHdsGCF6EqqgEAuEQ90uXqCxcSHRxdPBfD8fHfM2Y8P2HahIkTn584b8HatfNd9u7NjSAEAJCeGZcY5mFtb2lva+9q5RBWUgf7r6ipraigMyOcBvv1LUAXAkaMASMBMLGhRAaAEFhJW3RTuCChy5JmWZgtd0deNDO380/MLEqHC6RHh3tH5Mb7xvv7b13raWtuNnUGDSoYwA5eZAB+JefF9Mfl6urEVS4ucPmXXnzxpdcW/Oz5ec8889xzk6cvnzfX09/Of288lcQSgDg3NzqbYG/nbOMQEJhQokgtoMs34QHd1A32Px0ARqag5wI8I5BXSVvUk9zCUIa4goDZrFnLUZlYmM21888uIQBwgCjv3GxHv3jntWsXzDCbNX3ShFd+NmHGzxYwgZfIBxxzabvUZwwgYtUSn5UbViL4v/bajBkTJ3//3LRpk+atX242E5Wkf7wgAAC0VQ4AZlugnnL0C3AIvHA9JwEEaigJ9A4D0KsD0KOT8QJQmwKgVnbTNv0kOiydRIdlQ4QXEABzs7nO/vGZEoDw8Nx4h3j/dah/lq+fPn3KjAkTZjz7/CuvMAGEBeeAxOoqcW6oujp8xVKfDYtp/AHg+RkT5z0zecb0edu2LZ8509nOxZcJZKG+AoBFbtaWlrZoFPwdHQLiSkqCgwsUDU0SgP5hAHqfGIDxyzFoATRWplL0oYvT6K5kvjMIBYG1JSzA0z+7tCidQgD0j1gFD3CdueCV1xnA//cKCCx4/RWO8ALAZRlAFAD4AAARWDDv+WnPPDNjxrzl27Z6Ulfk6BsfGZ8dkZWVnhGNRGhlZWlua+eyxAUmEBcY6BRcya/gI1tAv3EWeFwAau3YDwuCNGmsVDZX8rltOsId7LbMLSSFcmGIu6XFrBnz7OKLi2geQABwiPdzNjPb9va29bOmT57y+sR5U2bMe53THEoDPPvq+no+KwUL8Fod6bOSXAD/PQMyb8GMuUgfQfOpI3JB4UgAMmEBcU42VuZmZAEuLgsdAwKdnFIBgAyg9YFqYNAAAHR92IvSr0df/bEA6OpnteFLM8hrrvCBPNosmxgW4sfNrrPbOg+EZot506dbuCIGlqe/88726NjM3ICAXIeZZrbrt27bZm42a+qkSdOnT19OLQHy29Z4v7jMCxfPnTxzprq6qjozMCAS1T/KH8jal16jB1QJ+vgsWTJ/SVBkZHZ2LiXYzMw4mzl0RYGdnQ0YOMMIwvLqGskD6Nzgw4ff6wPol3Jff49peWwA4kNbY2VBak5qQlhKoh/qF7T460LC3KzNoZ7FurjMqnKKAbFxmasCihMXzrTjwp8afPPlFsvX+ztTwbt1697IAAbwH2feOAoApeEBvpGofFayUPG8kithH5+gJUuWbIQBxOdyl5kZCADmQGBjw3MMfn5hYQUNzaiCHnCkN4gBeu3w0wHADBAE6moqCnJSw8L8/BxdSJ91iAOWZgBgn5JZdK68HDEQCTsiuzhg4UKXyMiN+/bRVNC7x1AWouCNJPH3Sywpq7948T8OvpH2RvWZ0qyIVUFBQVB+40bovTIo0mcjvjEyKMg3yHf16i3oGnNJMuMCHObQDU1A4MwAHMKCU6kTfNA7AAAGZYB2Cajn6VoArQ3QoZmExEQ85yAXlHm2VtbmZtNnzXJPKeMVrXSUrbnFxfEOC5eu3kL9zL6NPrADAMDjyHhfNH7xJSVF5y6e/Leof40CgYNZWRG+QRt9wIplL1PCl5JsWrFikwBQkhlOACxoDoYvYbVxc4M/NvD4w9tNroGNLE8WA1Sa7pbb164dB4D4yJU+CGfO/q62CEx0e1JOGa9qlxeVUofj67hqxaYtkDff3LeR9MdHNDcAEB+fW3Kh/Nw5AvCvBCAtK2vTpi2S/ugPmVakNPB7Nm2KiMhNTIQFZCUG2JjzLCwxsKU7uQtQBDx4QHG+90kBqE0CGA5HAOjt7r59u6k2JyEgfuPi+Su3otdzpoPTZmYWbiXlZ88CQFFR9fni3FWrVlENu2nP/v37SaG9W3/7W5oaiMTA5hZfqCqn/WAH//Vf//WNM4W704rSorbs3btv31aKAL/9LSGQDX/PnlxJ0BEDgNnUWag+aaNgSAhKkqamNiUZQC8AKJ+iBYxUIQ88AICPa8tyEn0RsleuDYr0d7aba25mMcsypKRcrIdnlRajDIggp40LB4TsbIznViF7kdRzS6urzp09S5cGnHnvDF8fUVSaBgC/leVNnf56UkoA5oqLqd1tbV3pbrWahqa29i4JgMp4AeDhEwJAEaUxFQTxBQ+74APHrzVkJi5d/OLKDWuDYAHOdgBgZhtWRgDeoW2hqAQjiotLS0oyYbuJ8GQYwNbXoNnbb0O14ur6i2fp2oiTH34I/U8WFu4+WHo01xDAXn0Axbm0TFSUFR7oAHczs7c3dzU3dwsJS6xEHdjW0amiHGCE4OHTtgDxBd/3KP9GAHLjlyx+cfGGSM4DtmaWFpYeCeVnT50qf4d8AM+2tLq6+kJJCZ59dvG7kLdZfvvu3tzcC1UXz509XMgA6NaAcphAdWlxtpYAhwHZBPABIaW0FD8zPTrQCT5AN/W5zp3j6GeThBh4u6W9s0/V39NvBOAnusAIBB5+/98P/na79lpDSfySn7+4eCV5gLPzXHNbC9uUBNrfzYtCAFBaWlp1AUILYm8SgGOM4N13oUoVDOAsHYzlE/O0KTAjvfrIkbQ9+/e+KdQnAMWCAN6z/gfT0nbT2bE5VmYz587FL7WxsVkUVqCoAQCqgrnK63k6ANT0wpemXeDh9w97/9Zde+16ycYlG/5x8UoX/0g/GztnukM7Ja787AdsAefkvd8XLtAW8eI3mYCQ4mLaBAIAJ07qABSmp1WfP3rw6JH9+8SEORF4UwZQrAOQTgDMeXXB2dHGJiBH0cAb5akRYq2oFMJfetPTtR9JoquHa2JKFxQwCMAA9cyqAdVjSf8AzYrUNCTG+6xcPN8HWc3P39/VwsLSLSCuvPwUrYhKu2IgVdWwbJ75ktW/wFL/ER0NOnfyw8v1H/INMruzqs+XFlWVZtGAIxOKdVLJB1j/o2lFaIfSqRsyn+ns77h06fz5/n6ptQSgm2/chtYU9IiEeNMD0NfT09fT29eHNzzq6+3v6+qbQC+N0Tuyt48sGmVzQRlcYOXiJShWIwHA2d7C3CYgs0gsCYuLQkRBQDNe52UCYCEAfPTRWcqYVdWXKQacRBpEyACA6tJSGvI3JQBi2aQE3lR69GhalgTA3NLW2dFx9dL5+NUFDdeQBrv5hRpVshUMl/4+RIk+PaF/TJDnDB8bAOrhguBMWMDKxQQAUdDO3MJ8TkAmrwnz/i5po19VaakBgPNaAO+cPXsKBGQAu7OKEBqEwWQXCwCSnC/VAshKTw9cNMfM3NnZ0XfLiqWR8WGKawSgjfTv61ONpH9Pf2cnvdY7S6cM4ScBUCTEJQYtQe3uszEoiAoB+7lznOKKpH1dBIC3+hEAsgHoQQDA4cL16+QB77xDG0jO1V/+TAKQDhOgS3Wqi/VFsAOWo8IC0GQsmjNnrp2dS9CmFUsd/Sprrn0MAO3wgD72gf5xAOj8yQDo9cQUKIUJAFo29ANz59rSFUJZ6ToA0k1Bsk5kArwefv16FRkAAzh78eZn9RKAoiLpXiGhuU7989UCABUCAOBgY0v6+2zyWroqsab2449vt7QhDfapRgXQrx13AOg0BPDY+verWhsVipzcbB8fmrX28SEAc+fYxMkApBhw8WJ9FR+HEfrwfoDPr1+ur/8IAMQWIjoo9yEDKBcAqvRtwBSAWCfaaRAUtHGTl1cAAbh2u6WVAZALjAhAN+7DAPT26enWNy4APfcbFQWpOdmR6NW5aXeZT7O0YlWUCZSzD1ysqiezlsPApfOXrvM88AUdgPrLN+spCyAVCgugXWLFYs1c7CdhhMIDBIAAv8jIoA37NnmF55bAA27fbmvvk5/5yABYcRYthgmkPcljaY/MiZTa3FBTpkiM9BEA8IT8EwPiMjPTaZM/nXUQ+50vymN6Xt4Y87nYBigDOEdTgvXoCvmKvaIqOkrExEp5yUyoX10N9d9IS0vLCs9M3749MDCb5xg2RYWXXGigXdLKzj69wXk8AAP6+o8fQG93c0OtoiQ+e+lGanA3onPNpe1htKXx8E4tABEELl+uPi/2gl2+Lh2Tp1xJ+iMI4jNnAADlcHo6bKBeRI1SnfXz+L9BAMLD0zNosinXN2gfLCAqoviCOCnST1OB/aOVf8MAdOpZgEolZ8bHANDS1FBzITfX12cfEQjaWwwAtEc4g4+IkP7lOgDS7sjr1y9fZwuoAgC+Vu0cbROrp7ZY3K8n7herFvWjnvu/QQCi6Nrd7bTxatXqfWQB6KnJANq7+lnEyI4NQCsTpMnRPj0AfcMcYTgWaruUBKDmQmLi0jeJQOTe4tLMzO0ZEgAQEEe/5DTAAK7z2fnrtAe27B1RCVbx2tBFqgX5ksly3lFdf6G+Wqv/UaH/G2lRBGC7ABCP37kprRgAmgCgn/a9oRfqf0IAvHGCZtFVBIMeqVSGH3qpRxCPBphAbx9M4Nq1mpI479wjb8IECACeHfSPjtldWIhIcO6cBEAwuCzLZ3QySmyklzygHp0hl8MUPs7VX7/ORsK+f+TIkaNvyPpHhcemb4+mfRIr9u/ft9qr9EJJDV0aQDo/HCH59VMNjPds+Frr7zMG8BgyIK04KNtu3/64qWH7mnAA2OCzsbiEVsVhATFRabRFrJyM4Ky2Kaqq0l4eR8eDz57iTuCMDIBg/dvBQsHkArmJOGzLurP9EwAoHx0bm7Vn06b9+zdtiruQo6AXoFL2jlD99XYNS3zaQujJAXDI7IUPdLfcvt3UVBYbvgc+sMSnOFcGEJMeAwCFdGD25MkqKbtX6d2eV8V3JHCAoMOCjIQOlB0slDfVXuajU1VVByn4vfHGUaF/VHR4OhlAxIpN+7ds2ZQZm8OvQdbb+98jEOjS6dxnWAeMwwIGRgWAH65sa2lparq+PdZr/5v7fHyyizNFEsigEyPp6bv5sNxBOHCpdCL6ohZAlZQgyDE+vyROTp87CCnCV4s9xGQV54oOCgJpAkB4dCwBCHdasWfLltVbMnNoSbBNqer5fiwLkNRWjRgDHtMC+nrhc3CCthYBABFpaXxubly0uEUbRhATk7Y7LQ0qUQg7I/S/yGeCLvNm+CKpPOCjEpcufVhddZS+9siePXuQ/GUAQIgfkSbpDwugGJDu7R2xCfrvL7t+ne4MgAd8P6oFdOpbwfgBdI1kA30MAD+990E7UsH2TO8t8IGlSyNywyUTyJAuDD4IAm8AwEGyeXGDAvIhHRRPS8uVSt1Ll/7whz+gSCglM8fAbtl/RByxrxIAgEBWHxYQTYtO3uEREbRUcv1j5MC2to6e78cA0CnUV/V1Pi0LUPVKS4wtTbUvx8at2Pfmvi0rvCKyJAD08ggCAfkvABTpALCuUVErVmyh6Q4iAAB/4D3yuZtWL9m4byMROH+JAZw9ix4BJhAlAQiP5YMTmcURvvHx52s/ZgPoe/j9GC7AxY+e3tq4+OQAUG+RkXQ1tzQsyomL8Nn35qYVC72zwtOlKMAABALyg5MygMu8K35P1KYl8+cH8VJB8R94n1z2lvjsjUvn88oQ28D56jN0n05h4e5fpmkBRBOA9MzM3IiI3NxitEEUApDmxhEDOk3JkwLok5beu+63NFQsyslMXLpl/549dEF+ukQgJkaHAMEd9YAWAAwfacxn8fz5LnsjI8WO2Tf37o3c6zN//soNGzfu279/D20irj5zhkuDX2ojAAwgdnt6dGZmaS4tlJYcZ/2VfSNOgvR2aUe8cywAXV3jB9DDFaNSqXzwoKUhdVlZZvzGpauPHM0K987iPeLIhdHp6QJAVBqf+wKAswyADwXs37R6w8rFM2fa+YMA1ZFUSPnMX7xyA3XX+/fvP/IeEyD9d//yl2lROgCxvGGyNDMuMy6w4BrdmwPlukYiIAB0dI4kE7oeQ29dEOwhk1KytLQULGsoyc5evenI0aKs6PCsaAEgIyN9dwwP3C93EwEuixlAbm72EQLw85WL58+0cwkSe0E3RpL+K2lPHKIgCLzJAEDgl7/UxUAAiMa7zNzSzJJMJ6eKptt/UyppgLu6RgMwonRoAfAHiQVNm/by7OmIBHplAHTF9KKy6yW52Zv20PHv8HA+JwA3QB2wW9gAAeCuACUeLRhSk79p9c9XbljpSScCgoS4zF9Je1KZp9IAACAASURBVKqDIiUAb715/j02gV/qhYDwTN40npVbnFuSGVhQS2clOwUAEMBfvOlXhV0CQN9I+ndMYN2NzEB0P9QaqUY1BHxX1/37rc11TQ1lJSVQrLSUlsN40oIkJkpy3jRYABd+NDPIaf581qYlS2hCdS3vHF5LOyld/P2D+ERJfPYRIvDe+SNHecXsl/9MP4PUZwuIRuW5Z09ucUlZ7TUBgKdAmEM//ugvh/UaW0CHVvWODjkGGAPQnzse3RW66I1ebb22rKzkAi/dkf7pQqJ3p5P+hGB34WGaHwKA91j/6uqsTb4+QT485kJ/z7W0fZglEgBQD72BLqiIYsBukwBKSyquXaPlAB2ATqniGQWAHocOOQYMA9A3bgAwAXaCirKysgsXaOEuK1yrP4IBvADVYFQMfOAwLwH84cieI6LDz4r3DaKtwToALAyAdtAeSUMfCAsolywgKpwAcBFAAHJzS8qOf8wA+nQAOmleSD8kdukS/3AAHfoA9DA8BgC8KZXdzbUFOwgAFXgSAA6CAsBuGQBK/+r3uMZBKVyUlRjv5+wi755fK4OgIxKR8bnF51EWAsBBsoCYf/5nWXmiiiTAW0UEADQCAkCfXOB0dnZJZt3VNXoM7BgfABEfu4bpLj4CQF1Nxcsvv3OBCQgAUkOQwQjSsghDIfXF54/sf++SAJCZmSh2R8t74w0BoFaOAgAQ2E0AYqLTJQB0gDiO9M9J2HG8obmlvV1yAanjJcV6erUERgfQIdKgQSZgANpJw5HGXYdD2d1W13CtbEfZO+9cqJIJ6ADs1gIohAGc379fzPGgRc5MTIz3X6vVnwis1AdQlJZ2tPTowd0CgNYCoqPj+EhWZsLLL++oaeluV3bouYBU9Pb10/se/EffiEmgQ64Dek0A6BsNgN74M4DmxqaGhjIdABAwApDFpdC5M6XFFAFL8VUEIBMAgtaufeklAwIEIDs3lxbCoghAGr3ySszuLB0BASCn7PiOHQVtFAL0Y4Be1tNN/PSNNP6dhhbQO24AehCUysbm5qaG2ndAAACKcyUA6XIMSEvL4jsAThZVl6ZlVZcKKSotzcyNjwxis9fzgLX+ALAXPdKR0tI9aaVEII0BRPELdQkAGP6EnLKKHTtqAKCzr19yAV29CwPoH7H6HQbAOA2wA3SOBUD+jg5lXVtzI0xg+/Yy2heWu4mGKkNKBbupEpABHD2SVioDoJPEdJyIE+FrALB1qwAQyUdLs/fTcbqoLBmAVAbRj0YIiIvLKav9+OPjx+EBDyQAXcManjH0H5YFeuXI0TkMwLBSSc9cVH03brQ1NqIU2J6ZVVycvX8LE+BCiNUXAHYXnqk6uietig9R8zlqfO3ejRtpPxhMgA7J6QNAf7B/f3FUFM0RRNHcSlqUXAfERUj6Q5rbWrkM6B+z5h0dQK8BgK4+XcPMaYDqzE59L9HHoe4kAOQEZZlZubn7CUBWtCAg9E9jTygsOnM0rbSqSjpGfgR/irP38ZY4PlUIAPQWqQWAnjgrKq00iwHQq3DJAMgAaq8JAM2tyg7JBfR16yconfQm9Oww0Q31m6oDpNQBmrCozt4+/ekDfbvXqxE6la30yga0TpYQnpmbmJtI50ZjZRfgBLBz567DhQePRh3U2f/Ro0XlRWwIR7K3bAzaGEmbIsWuUAj1i/v3Z0dERBRTcRlDSSCcKyHqBV/ecRzKX2tqut3c3NZOdQDNCOnrRjtE+K1/5LHXdYOmhZUdAYB+kdSuVN5oRBxsrlEU0PDQi4vGxWYKE5AB7Nq1s/AoAAj7R7149GhpebnYC4GynzbSkkBpaUdcYsSePfuzQaCYLhCIjgmP1QHYXkb604pwC5+S6mMA+roaLImPLiMD6DIG0GVcLAtfUPIJGkTBhtqClxMSYgPp9oTY7QwgWgKQsXNnRmFRWhSZfxbpjwxfynOi5xHrjry571ckTGBPVilviUcu2ZMdDwCZOgCGBnCbzgcAv5KHvEdfU8NdEYa538gbfjoA5MF2DD8d20JlsiMhJ+dCLJ+Yom4gmkvhgwSgqDQriu6RYABZpUeoHDryxhv79+8j9X/xi1f/6Z9effXVffuzSplAHO2yjFi1Knc4gEVl0J+uUG5rl/SnONg5DgDUAT45gM4uIwDaYlPZ1tzUdO34DgzN8TI0hmUEIJ0uPYmmVxZMK6XZgaLS8KzMoqIsvhSEfP8NaL9ly+p/guK/+MUvfv7zf2JZvSmc9gOPAmD7y8d5/KH+fYOs1zcWALkFfmIAXaYA4H8JwO1rxyuOH/+49jgxeIcsgE2AABw9Sju7sjIBIJNGNyu3GN0uKY8hf1UCAAJ4RwRWr46nsyEIgKsiVnkDGJJqTHSs1gC2H+fx74b+d7vGAnDXGEDHuIOgrpWQfrKRC+ATLD2dvcp2YQKS1NZ+tGO71LnRi0sepd2t0UWZ4ezcmbkI/LL2r/7qV6T9BiGEAQiWLFmCenjj6tWrxElBBkDqezMAlABNTS1/6+6krtd0nNcPgh3Dxl18Qp4Q+ckA6GsAAARqhf4N8NAd2wUBYQG8t68oiwHwrs8tPlCStP/VL1h+vpIZwApW/hyyhMUnaFVEYni4HgCygIQc2hJ1u43nQXjpt/+JAHRIMh4Akgz7tGQB/R2d7e3dbS0tzWQDtddqG2o/Pr4jWgfgIPUG6VlZEXD+3MT4+NU+rB95/M//SVi/Tv4RQsfE8BUuDCDLCEDZNTELwAWgBEC8jTcNSkSEFYwFoM8kAf1/8zNQtre3tbXdvnbtWkNDTUPttWtaACBwMJ2zQNYmMIiP9/VdCv3+UV9+/o+GAvWD6N6IgMREcoFoLQA4AGrAa02328QsgNCuo9/YEEZMg0YWMA4X0G8vRgLQ2delfPDgQWtrS9M1NMbNDQ1NBgAKd0sA9gCAr+8Sff3FsIsEAFOAObz6qo8PHRRKREWZGAe3oZetBgBvyQCuN9F6cHuHVn8AYFUfywI69F3A0LxHdAKD7CC3RzwdT+VQe2t7a9ttKs5u4xk2XXuZggCaOC2A9CyMZhyC+4oVK1Zv2bKFS7+33nrrD/j71q/e+pVWaF0kNzc8LjBOAEiny0TXrFkTRZNBL9NiGOrfDv3BpfE3GGrZN3R2IYxeb+zv84f7HRPweZ7f7xqn9PYadYYygHYA4OOrdLfp7aYyEFhDXWxMRiFfh0f7nzJRKsOr0w7Siv+R8++99d4f3qKF0ffee+8tFqkg3pPFMT8C9UBmEb1edfga2FI0bY9ChCUDuN/zfc/90at8o1lww6Hv6rovZIKkv7JzvAC6hgPopYIYBNpQnLUIuf3Ry9u3r4mG/voA6Oh7XFbRQSLwxhFUgWQBTOAtLYBXN27Zs4mTnjcAxGVmRkuv3k7TIdvfoSKwpftBF9t8x1MAoJSk6zFEN+fK6zE9/E/+Kd1tQkBgx8sYOjKAneI+xPL0cqpw4zJpgiztYNrRPW/s2b+P1Rbqk/mjMti4ccumKNZfHwC/YjkMoPZjsS/4/l1ygQ6jAmcYgI6nD8BAeUFAFy04FLa2M4KPXn45ek14VEz0zozdNEtKAGhhK5MnitOi0tDu7UcbICv/1q+4MmIAmxhAeARiAO2I0QJ4mbqAa1wE3yX9TYlx7f93t4Be/Xf09kD5gLwBJoAoEB4TvTmGG+Py9KIiLoVoqigtyiuKzhLu26cLfr/6Bem/BRUgLMALBCIiOAhqAURHv3y8CTEQTVBHx91+qcbRG3wjAPr/fLoAdAi0U6M9fByH4yHNkXQ+aGu5BhOgybHN6dJaEQDE0spWOi1zeUXRTrd9b+0jxX+1gQvCV/ftQ4m8ehNdl+Ll5cUAYgWA8Bg4wMs7Pv644dptNMFyMWuks1zkGqU7o/xHD+7f/2kAZAj6AHQLsiQP2pp2vLyGp7JRBNLkAC2b0WVI0Vn8ovObIFu2bNz46qsoBPjA+D/5wPpXr15Bl8d5e3lFCQCxAgCNP/RHFdTM+pu2+nEB4Pz3FACIOSM5EA4j0NqiSAiMJQKkOeufFR4XGxseHU76r2BZunTJksWLUfv9I9W+S1av8FpBd8cxgE0CQLQA4L1mzctIAdfohORIotXRSN3O4dHiqQDQcwVWXNqmc59+f1fP/bbK4MBAAgA/xsBnsXCfT/qvXrpwqcPShY4uLp6ei1/05PJ/6QovL6dVAQHeBAAGogfAK3wNGQBXQTo1+ocReCIA7SQ/CUCPPgDOBz3f331QxwDWRHPoi6aJkD1ZmcK9V6z28VnqAHF09pfvl3JxdHRy8vZeFbDKiwBEAUBAYHjsGjYAL681nAIZwJ07d0RN199xxxiBQav3lAF0kmr8oeu+ngtwkWxg/2wBd3sbAcCbm/jMLL4LMDwijipBmPcK+LoDbN3Pj28N9HT2X8v3BgZ60/2TZAHedOg8ELKG9gOs8fZe8w7PhDa3tcoAIHceH4D0Ffc7xJsWgHAEfthhpPj9+0Lj0Vpj41WYvo7WB3V4+t6rViUGxmaGe9OsPtSPDYyNDWQFychX+PoGBQX500Vr/rQxgPyfJEAcuo+Lo59AYXBNoFMOL4U0tbTeEXrfETJyLdAxLhkvgLHmBobXX60PGgMDnQDAFwAQ/70EANriw/qHR3EaiOQ9If5BBMDXNyIiPBFtIMyArpYl/eFFIAAAJQ2SAbDSd+48JoCRkExol2QUAGL8DWqsMfTH16IguhQgAyAT8PaO5atWERG5tQ1PS9vDBCC8LSQykq6KCo9LjIsLCAykDwyAt8UFBjqUNDQ0XCMDGAeAx5CxANzXvr/fMV4LEFGm9+uSAHYBX6GEt7zDL0sS3kC1KWJL9r6NtBgUuX/LFqqA4rQSKAggE3h7O/iVNDbSq4vfuX/3jqH8nQHcF+8h+t3VqBbABHru3jhmAEBIdLosWbTeiYaALtfIzqWlMPQAdCIkNk762kDhAnjv7eXn/O6N/MZmjP9dYwAygscgoUdtAutuEoCcKGQOneN1ASbQ8/WxAwEBgdDf0YkMWWgVrQMgVs7T9tCOuNxcer8nd4+wgFgpWEgAAgK9nPz83/06+djXNzrv3r37rUn5CRYwBgBicN9UELyvw9Jh1Jp3dH5z9diBRAkACAiN1ugDiCH96UTQkSN7couhPwhEaF1AawFIi6ucHILWvv3lMYv+b+/2fPP0Aej5gB6A+8YA9OtqHYAu0xtx+29dPb03Eulsla8v6h0nHktyBYRAKQak03UgaQIAOwIsAVEwTi8I8J3cAQEOC1cBwJWrE7f1f/Pt3b8XAJ2MAMC0BXT1dRq14JwF+6+efjsy0o/0910FAvAGCYB8Zb4kxQwgiwhkZ+dS+Z+YmYkMiCwQIAm+3Tdo7ZUrt+ZNvNpPut41Jd8+PQDt941FD4DcTutZgInlx45vr155299fAPB1dAQBJ3iCnAi0BEoBAKrvIRPI3psdHx/Bl9Dzzfpa/Rc6ol7yvPLlrXmT53377Y2Ou6YBPFlKMAlAr1S+fx+PaQ61s6vDYD5BmyK4DNTuPJUB3AUATwIAAkuBgNzASTiCZATCEnJzyfj37InYsmUvXZuZKEsEXSge4ITvI/19XdZ+eeXWK1Mmbesf0QKeIgDZClDam6isRt5yQ7PQyDF9He33AeC0p398ANLgkqVLlzo6OtoQAo7qkgmkZ9FCWWIiXZKRFZFN6vsFBFK3GC4CQCCQOQn9fT1PX7l6a/2kSZNOfwO5OywX3Pn2CUuD0QBwa/vYANqV7creG3evvv+251o/lP0rCAARgBUscwpwChTbHGlqjHbU8HaY4qzc7Hj/dXTBoi4AkvpOCxc6LPWFFXleuXr11rZJ0ydNe+WWIMBa6wDc+TsAuK8FMNrEo2EH0NHRfkM1cCP5u1ufAEA8ASD9lyxhAGTRDgFxMoI4vl4qMn5vLhkAGiK/eAp/Ov0dFi5cumL1agDYeuXW1aunYQFTpsy7SkbASv+9AVAEGD8B0Xa2IwBcnXrgu1tX3l7grwPg4uji6GCzyIEJUKcDBlkRifG8KSwyewse0G3jchAICBDDD/0hvr5+AAACBGDaxHmn790SAO78nQDoRcDRAJiYjaIIeufG1Ol4ikYAXNgEFtrgg58fRjoeOS+e9OfrFelW+bXisITQP8AB6js6LoUBkANFvn3rKgOYPnHKlMnTTt8bHcBjsHi6ADiFaKbOm3j63r1bEoBVEgAQgEUTAPFSI4lIenwHGR5TN0gbBQlAAOlPwR8AlqxmAi7OkVcYAKLgxCmTp0yccfWbb0eLAT8RQMcoADpH8Abdv/vcp05//n0AuLLA3y/O22vVat+ljrTaTzbgaAORXmaEh58HnidDpNeT8A8IY/0JgMuSpatXQ39//7dvkQdcPT1x0sRnnps8eeK8q0Z1oKHWellciwHvTBExBeB+j/hergjGFD0Ad1T376hvTJ30PAH465eezvFxZAGrHB3Fng/kAhtHm4XOEgHptQTEdJCLvyR+fg7kKwsdHPBtbD1BniICXKEo+Mwzz02cjDhw9da3t8YP4I7UBI4TwN0RAIw1zdR1927PDfupsyZPfv/77+/99W27gLhAAqAlQLlgoc188Qo6JOKSeWcCIH/KxlGYv+MK8PKliXMXz/e/+IIAXDk9nQBMnvzMlCnTTt+6d+vbb54UwB35nUkAEoH28ZmATlA4nJ41der0SZNfv/f9vS+/jHSIi/VetVoPABFwXKhHYPlyVwbgogNARkK3hFHxsGrFiqUunq/96U+fCADzAOAZ5ILpUyZPnndVJAMTAPQKRK0P3NGbRtI6xUgWQN84DMDYs4x3v9s2aeosAJgGAN//5S/vBsQKAL4A4CM5AcTF2UV6HSVX1+W2Mg0X8fpKpL1jkI8PAXBwWAUAWz/505+FBVxZPum5Z54DgEnwgokwgscBcKfDMDreGRGANgh2GFqAwdIStwi6/+Gvv7ocYzNp+vTJk1+5de/e919eiQ9AZeu1AirLAKgzYgbz7Wzkl5SyIxq0MkKPbGD9CIk+Pj5Llq6A7bj4r337iz/96YurDGA9giAsgNxgMgi8cpXKQvz9FoXhXe6U+a8g8K3UInTcMVaevKTjDtjcv2MIoHWEbnCYCBMRSaKP1xm+vt97YDpy9ORJkydPmfD6F/fu3fvuy7ed/by9vLxQCC5ZKcLg0qX0ijGrHCgfWFkJ7efOpRcfIgLOzo4OTqtoqnwlEWD7X/v2JwAg9L/6yqSJk5+ZOHHyZAYwedqUV06DwS2pOtaKyI96PdIw0S2MjKsdNi0d8m6brp77PY9u2MMwp0yZQgAmvv7FLXKCK842EbQMQrWwlAgYQICfn6MzANjY6b2klKeLSxBywCoGQPovWb0iyGXta1e++EI2gKuvT5w4EQAmCgATn5kCM3j99C2Sb/Qg3NHVSHfGD6D1yQDQL+x5eHc5RT88rSnTQWGCAPDdX/bOWRXhpU+AAQQAgC/dBiqsX3pRqbX0KktB1PkEMQFUAD5BzluvfPnFF198IgBceR16ywAYwUQOh69fvXcPniAbgqw19Ygdd0w5gB4A2tEh9G81UQiNDaCz57vvvzu9fvosuP9kCcBkBkAm8LX/nABvfQJaC/D1d+QgwLWAAEAEaHsgL5VA/9VLgmgqkPTXApjIWrMQAY6HVBwvR1ZE8cV28M3dkQvDcQFofxwH6P/u6rZ50H3i9Elk/OQCGBMAEASuzHQM8GICq7kaXLpasgA/AcBfekUxPjvKq2PSWXJ82eqgtUJ/fQBT2AKE+hMpI056jh5PmTbvlfcp8HwjtYo64+/oGN0FWoWwC4wnCIrZwk7k1c5vv+3/9ti8Gc/PeH4KD74MgGMAA/j+L+/a2TjwZgDaIOsSpAUAC+CewD+Sh54MYCXrDe/3Wb0RX+Ybufalt7/85BMCAPcXAJ6XgoCIAgyA/zlh8vMzZszjrIC3u2LCwJTtm7IAAaB1fACkydI7d3sQZa9us5j+PGTKlCnCKwnAcyIGSCbwlwN2VM6sIBNwkSyAXSDITwAg5bUA0BYG0RUSq1fjsb/na6Q9W4A+gIkmAMA1JuCJzFuOcPCN7Ah3jSaKxgWAPozDAXp67n5zdT2aUzY/AwCyC5BTEoFtdo70+gBL0dXouwAiviN3QXxYkvRf60MAfIQJbAyKXPsaJUDIJ5QA8PeT0wYAJrIPPCOEsiKeyeQp816hcPCNPG00niygD4AejUd/qL+cww9Ufm7alMkSgMlUB0yZOIUBCCf47sutds5BS7itC9JzgSCKA7QoSmfm6LW4Nmyg19YTAGAFG9aiAvzTn/4sAWB5/5XnJ2gB0HtoTn+JAxkDKoMZkyc8j6wgUsLI4XA4AAGBH4/DBe4emIeCDzY3ecJzEBp6HYBpAHD1lmQC97777sttnv5BIqjjAwMIIAsI8uPJkK38SnwAQC4QSa+wQDdUbli54e0//fGPfwaAP34ix4DTOgCSiOGfJAs+8/zzzz777D+88votKR6O1wW0jtDaajLma+fI7nT03Tg9HYLIN2HChCkE4DnJB6ZIAJ5/5ZNbEoF79/5y69Y2O/8g9PY+lN1pjtfXTw724sU2AGDlyrUrfQhA5EYygA0rX3r/iz/9+c9//uMfAUBnAc8OAzBRT/9JlCUpHlI4eP2qZAQG9ZAoj+6jCKZIph8DTMU/URF0tLYr2yUuHf3f3thmMWkaRDfoZAJ4L4LAJCSBZ5GSvgSA7767d++vqIlvbfNEpKPaBrqJNC8+boyUBbrjUz6Rkb4bN25YufKl196n4f8zewCJAPC//9ezz0/U6TtJb/z5obZCosGYRnWyVCZ/q98j4RNaIKMAaL1Dn7jTKnykvb0L9X5Pz431GPxJWvV1vi9FQaoGJvzD/waAL6E/Afiv77+79+XbnkjzVNxAfEWyj9S3AHo1EaISGbklCMO/mPT/k9BfC+Dq+8MA6LPQJgetTKQakVzhlmQDX3MXIxfLhgAkEarfb6W3dr3MgM9+fRft/vqp6Pam6YX9yQYfp9C87eRn/+Ff3v9EAvDXvyIS/vWvV972RAj0XS0hIAaR+vpvlC8TQvj3Wbn4pdf++GdjAFcFgAkTnxkFgAECPKnnKDF+872ojUwFA2MAHB30AkK7DAXa3z22fNb0eVOQ9WSfnyw+TmER6sMCJgDAv3zy5a17wgJA4N5fvwQBO9i3loCoeMn06YSYnviw/u9T+B8G4F/GAYATpB4EURzcEtEAGgtzHsMCtPFQC6Dnu6+3LafIN3HaNFjWZF3el/Un3HAOWAAA/D///v4V2QIQBP7rv/765ZdvU9WDKCAB8AvSiZ72pP/i14T9CwB/FACuXpEBTBodgE57elIT6f20KctPX/1Wn8GYALg7QJjkuPB1z93T2+ah5kPNO00/5cnBX9J/0qSpBODZZ/+3AYD/kgmsc/bnKocA+I0AYOVKTwoAf/6zMYArVz8ZL4CJBjZAFoFCBXZwmlMj+4JYWhsJQLvOG6ichutj8OfNmKYteSca6C8ecg1AvcnkZ/+XBOCW5AL0DgCuvL3e2SXIZwkhIAPw0QJA3YPs78Nbpl96UU9/PRegEEAAJo4JwCgUykM07fkZC155X6oStanBtAWAQIcImP3fIu2h6CHtp03RAzBR0nqKHoDnJAD/IAO4JbkAEwCD09s87YKWkBX4+gbpqc+ykkqBlS8h/v3pzwYAuBfQAZj0BADEU0SF9Oy812kO6d4tmcFIFnCH9f8O9f48BP15MHwp9E/Ry7TGAFAQUHtuAEBYAOS/8OCLq9uQDlldfd2DhPoA8NJLHP///J//+Z9GAK4+DgB9DChSnpNywvMs0+bNozpRtM53R4gBYtoPnf4UKnkQ8wjBFFl17khNAeBCkCzg3//9k/+/tnPnbdwI4viK4lKmJdFXJScBLpN0qU6ABbhI4bTGAfkUcUH726S7jo38HQwIBCuCtAAhwCEIQoJhOukbqMjM7HK5y4fkR7LwHQw9eJwf5/GfWZ5EALYIYP8V/rGyLLMy3q5BEFxfKwBCEKH9IH7oA4Xu0P1TE0BE84C3ARBPilo1wfPFZyAcbrEyAAITwO8Y93/9TZd/JTwfl+NyR0h+hGmR5uY9ADgC8AOUrwQgrwEgg+12dSMI/KTHAF7+Hwz7awCJBBARAPZyAFYNAKuz+BVFPHSs2DCAI6wJwD/q2oPT4/q6XX0Gx5+S3pUl3nEdNYejgxu1wFWiGGDZ4yAN8ZRFNyBCAOpADgCyJHq6Qye4VoEATbIw/+7yCvRfKlcNIBIAHh+DJQDgugzQu4Luh8FsGQKSgCpblBg/SQ+g9ojMBye9v51NyPVrAG6d/yq4Lm8BIC9BIfhIAFQ7RFkQCQCCEgwiAr9cEwXcFv0ZP0EKrz+m/5b9EgA4QODPbeYYzc9pALwnI5L90M+B36PMpUZhvfr8aTbzPLLeVeYroWMAaByvAuCYACSCPXiA8IGyzJPn36A3WohvloTELz5WUNqv+z9lgLgB4LUe0LbdwMD+AI1P/dHq1++x2FOeJNMbALgOoNUF1QQQQJhuImm/ILDf72ih/QDg6cvNQn61psRws1ho11+3P45UCkAAfPBeAOZpMzT/z+3qdgYpbwoWT7wR5kv8rWm7DsBtAXA1DwiLTaLbrwDsEAAIgqfV/UJ8+TKG/zV9ptxd0//NGoA50B//twDQA7DYffJGswlmR6e68tU1bdkvAbidACoPWIZFmWjmiySoAGTZNqGbyKpvYRfXP2k6QGX/mlYUggeMmWH/ewHAsww1voca33E6gr5lqMUtq1H1uF4DAIBlLzcKgEKgAOygNcgws4EsXFTfRH91F0WhXv+b1x/sRwC2LTaHG5aqCXELgLpofQwYxH1leMN+t4NYddA3AyAIWZlBaK+fvgCCBX4L96UfqvyX6gCqEigBLG1m9sLahLQTgDrtXidgnujvHVEVXBzvOX0AqNN6AYB5WZT5EQC44niL8v7+6mq59P0gFeqBYgAAA9NJREFUSJvhr6Zh65MAyDOdbsfgJxaDlO840MZP8eRJKuHNiF2xrznAMQCgBG0BgDbrKgK5YX5ZbLDAh49hgOvh4SEw3V94QGIACIJxnwfAnw4AljjtOuC7ANAcA/t4l6PtUiwZ9muRVFWAbgBSCWkAagK54QFFUWzKeBP6/kO1ggaAWFPBsEIJwBm+KgnWBKw+AOj21C+4wgfElL95/Q0NaAIwXuwMHZcxyAFQ6/LsWQB4prFIDUAGQRnOx7TmyyUSKNJCJIJaA+DGeIT3h0GODDAHIgC5GYDzYGOXCB8QW0W68Vom6AOAUc9PpL8KQNP964FgpbcBoB0UxS5PaBQAAHB3TwNQluKnjC/tKntb3ni8BAKpBgC3xSIKArBeAmCWw+XmaDvR6Zfd/F24/xEArgmAvw+Ay3wEkOsAEsMFDuQFt5bHJkLZWpZtj8epAFCrwCgxAEAOlL24YSS3Ggh4oyes9lKPAGjZ0VYMvdLafBsCsJcAgFwAAGTZM9mvETjQzz3zmDfhMmghdY7naVGk7SQAK1YeUG2Pd3iBeuBVANqXtKvyVwdtK6PmIxQCcwJQzYJyuXYGgUdrNILjiTEaHdwGz6E0oBDQ1vgTAYjDwPchZKDvHxjTTy0K+BsBHBWLrwJgSQBjBLDrBXA47A4RNF2Wa/EJlh557x+3fc0DNqEAIEIAAQSUA7nVBFCPKQ0AtQWdOUC8gNVbG+o1bg+G7jSqExl1AqjXvkYwO6tcZjodDjhN1EFCBVAew9LwAAIQIoBQzMOs3mXmwtYTfTmAd9S9NwJwTwDYS/MP96ORFA4IoBrWjEBFb8pSU0IKQEg5gL8fQMOSUyFwbApyxAPSYtdFQAHIrbMzNa6bToQSGQ5cZvvlptTtJwBJHIapD1WA90z/GuZZJ1/xPwHgDQBZdwwcdpfe2dmwBgAEBvA+TDG2DIBYVgEEkIAkwBQwPwaAvx3A6SrQ3nd1tduCOgAEBCDDfVFzCQeIGDsbVbob/x8QDp4x+cCblySH5DTMBDDuAdBzvt2vauBiHT1/DwD+IgADMRYmADvcGm8B2O8P3shjfDqlGTVWAXG7hc0mk+EE3puS92sAYgHAfg+AHuvYCdev3b9/vqo1AnJrBIwoBYGdUIQ5TcdzYf9+bY3c4fl0em5dXHw4P4cCAARoCxN0AQM5lMYgIGNRBcSNYmFBrQDn7W5Qq3C9abBrpvECAB2S++iQVQzd4W8EUIo0SHpIAqCeEADMrNHw/Jtvf7y4+Pjdxw/UiREBZDlwUAwoALFcm9QPcSTMzX2Rqsyr26dfDeBflf6uKaayqh8AAAAASUVORK5CYII=', + gender: 'Male', + birthDate: '1958-08-17', + givenName: 'Louis', + lprNumber: '1958-08-17', + familyName: 'Pasteur', + lprCategory: 'C09', + birthCountry: 'France', + residentSince: '2015-01-01', + commuterClassification: 'C1', + }, + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + { + '@vocab': 'https://w3id.org/security/undefinedTerm#', + }, + 'https://mattr.global/contexts/vc-extensions/v1', + 'https://schema.org', + 'https://w3id.org/vc-revocation-list-2020/v1', + ], + credentialStatus: { + id: 'https://launchpad.vii.electron.mattrlabs.io/core/v1/revocation-lists/25ce0f22-975a-43f8-8936-b93983b3e8f0#79', + type: 'RevocationList2020Status', + revocationListIndex: '79', + revocationListCredential: 'https://launchpad.vii.electron.mattrlabs.io/core/v1/revocation-lists/25ce0f22-975a-43f8-8936-b93983b3e8f0', + }, + proof: { + type: 'Ed25519Signature2018', + created: '2023-04-24T18:13:51Z', + jws: 'eyJhbGciOiJFZERTQSIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..6QxpmD1apUezx-_0zNNBEuRDCohh0EDuSQyWPPG_VgFx-eDtDfgpfm7-JcErW2xn0FihqMzxCxgMvRL2lzJJDQ', + proofPurpose: 'assertionMethod', + verificationMethod: 'did:web:launchpad.vii.electron.mattrlabs.io#6BhFMCGTJg', + }, +} diff --git a/packages/siop-oid4vp/lib/__tests__/modules.d.ts b/packages/siop-oid4vp/lib/__tests__/modules.d.ts new file mode 100644 index 00000000..12117752 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/modules.d.ts @@ -0,0 +1,3 @@ +declare module '@digitalcredentials/vc' +declare module '@digitalcredentials/jsonld-signatures' +declare module '@digitalcredentials/ed25519-signature-2020' diff --git a/packages/siop-oid4vp/lib/__tests__/regressions/ClientIdIsObject.spec.ts b/packages/siop-oid4vp/lib/__tests__/regressions/ClientIdIsObject.spec.ts new file mode 100644 index 00000000..ab842788 --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/regressions/ClientIdIsObject.spec.ts @@ -0,0 +1,59 @@ +import { PassBy, ResponseType, RevocationVerification, RP, Scope, SigningAlgo, SubjectType, SupportedVersion } from '../..' +import { parseJWT } from '../../helpers/jwtUtils' +import { internalSignature } from '../DidJwtTestUtils' + +const EXAMPLE_REDIRECT_URL = 'https://acme.com/hello' +// const EXAMPLE_REFERENCE_URL = 'https://rp.acme.com/siop/jwts'; +const HEX_KEY = 'f857544a9d1097e242ff0b287a7e6e90f19cf973efe2317f2a4678739664420f' +const DID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0' +const KID = 'did:ethr:0x0106a2e985b1E1De9B5ddb4aF6dC9e928F4e99D0#keys-1' + +const rp = RP.builder() + // .withClientId('test') + .withRedirectUri(EXAMPLE_REDIRECT_URL) + .withRequestByValue() + .withRevocationVerification(RevocationVerification.NEVER) + .withCreateJwtCallback(internalSignature(HEX_KEY, DID, KID, SigningAlgo.ES256K)) + .withSupportedVersions([SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1]) + .withClientMetadata({ + idTokenSigningAlgValuesSupported: [SigningAlgo.EDDSA], + passBy: PassBy.VALUE, + requestObjectSigningAlgValuesSupported: [SigningAlgo.EDDSA, SigningAlgo.ES256], + responseTypesSupported: [ResponseType.ID_TOKEN], + vpFormatsSupported: { jwt_vc: { alg: [SigningAlgo.EDDSA] } }, + scopesSupported: [Scope.OPENID_DIDAUTHN, Scope.OPENID], + subjectTypesSupported: [SubjectType.PAIRWISE], + subject_syntax_types_supported: ['did:ethr:', 'did:key:', 'did'], + }) + .withPresentationDefinition({ + definition: { + id: '1234-1234-1234-1234', + input_descriptors: [ + { + id: 'ExampleInputDescriptor', + schema: [ + { + uri: 'https://did.itsourweb.org:3000/smartcredential/Ontario-Health-Insurance-Plan', + }, + ], + }, + ], + }, + }) + .build() + +describe('Creating an AuthRequest with an RP from builder', () => { + it('should have a client_id that is a string when not explicitly provided', async () => { + // see: https://github.com/Sphereon-Opensource/SIOP-OID4VP/issues/54 + // When not supplying a clientId to the builder, the request object creates an object of the clientId + const authRequest = await rp.createAuthorizationRequest({ + correlationId: '1', + nonce: 'qBrR7mqnY3Qr49dAZycPF8FzgE83m6H0c2l0bzP4xSg', + state: 'b32f0087fc9816eb813fd11f', + }) + + const requestObjectJwt = await authRequest.requestObject?.toJwt() + const { payload } = parseJWT(requestObjectJwt!) + await expect(payload.client_id).toEqual(DID) + }) +}) diff --git a/packages/siop-oid4vp/lib/__tests__/spec-compliance/jwtVCPresentationProfile.spec.ts b/packages/siop-oid4vp/lib/__tests__/spec-compliance/jwtVCPresentationProfile.spec.ts new file mode 100644 index 00000000..1f75d92c --- /dev/null +++ b/packages/siop-oid4vp/lib/__tests__/spec-compliance/jwtVCPresentationProfile.spec.ts @@ -0,0 +1,578 @@ +import { PresentationSignCallBackParams } from '@sphereon/pex' +import { IProofType } from '@sphereon/ssi-types' +import * as jose from 'jose' +import { KeyLike } from 'jose' +import nock from 'nock' +import * as u8a from 'uint8arrays' + +import { + AuthorizationRequest, + AuthorizationResponse, + IDToken, + OP, + PassBy, + PresentationDefinitionLocation, + PresentationExchange, + PresentationSignCallback, + PresentationVerificationCallback, + PropertyTarget, + ResponseMode, + ResponseType, + RevocationVerification, + RP, + SigningAlgo, + SupportedVersion, + VPTokenLocation, +} from '../..' +import { getVerifyJwtCallback, internalSignature } from '../DidJwtTestUtils' +import { getResolver } from '../ResolverTestUtils' + +let rp: RP +let op: OP + +afterEach(() => { + nock.cleanAll() +}) + +const presentationVerificationCallback: PresentationVerificationCallback = async () => ({ verified: true }) +// eslint-disable-next-line @typescript-eslint/no-unused-vars +const presentationSignCallback: PresentationSignCallback = async (_args: PresentationSignCallBackParams) => + TestVectors.authorizationResponsePayload.vp_token + +const verifyJwtCallback = getVerifyJwtCallback(getResolver('ion'), { + policies: { exp: false, iat: false, aud: false, nbf: false }, + checkLinkedDomain: 'if_present', +}) + +beforeEach(async () => { + await TestVectors.init() + + TestVectors.mockDID(TestVectors.issuerDID, TestVectors.issuerKID, TestVectors.issuerJwk) + TestVectors.mockDID(TestVectors.holderDID, TestVectors.holderKID, TestVectors.holderJwk) + TestVectors.mockDID(TestVectors.verifierDID, TestVectors.verifierKID, TestVectors.verifierJwk) + + rp = RP.builder({ requestVersion: SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1 }) + .withResponseType(ResponseType.ID_TOKEN, PropertyTarget.REQUEST_OBJECT) + .withClientId(TestVectors.issuerDID, PropertyTarget.REQUEST_OBJECT) + .withScope('openid', PropertyTarget.REQUEST_OBJECT) + .withResponseMode(ResponseMode.POST, PropertyTarget.REQUEST_OBJECT) + .withClientMetadata( + { + passBy: PassBy.VALUE, + // targets: [PropertyTarget.REQUEST_OBJECT], + logo_uri: 'https://example.com/verifier-icon.png', + tos_uri: 'https://example.com/verifier-info', + clientName: 'Example Verifier', + vpFormatsSupported: { + jwt_vc: { + alg: ['EdDSA', 'ES256K'], + }, + jwt_vp: { + alg: ['EdDSA', 'ES256K'], + }, + }, + subject_syntax_types_supported: ['did:ion'], + }, + PropertyTarget.REQUEST_OBJECT, + ) + .withRedirectUri('https://example.com/siop-response', PropertyTarget.REQUEST_OBJECT) + .withRequestBy(PassBy.REFERENCE, TestVectors.request_uri) + .withCreateJwtCallback(internalSignature(TestVectors.verifierHexPrivateKey, TestVectors.verifierDID, TestVectors.verifierKID, SigningAlgo.EDDSA)) + .withVerifyJwtCallback(verifyJwtCallback) + .build() + + op = OP.builder() + .withCreateJwtCallback(internalSignature(TestVectors.holderHexPrivateKey, TestVectors.holderDID, TestVectors.holderKID, SigningAlgo.EDDSA)) + .withVerifyJwtCallback(verifyJwtCallback) + .addSupportedVersion(SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1) + .build() +}) + +describe('RP using test vectors', () => { + it('should create matching auth request and URI', async () => { + const authRequest = await createAuthRequest() + expect(await authRequest.requestObject?.getPayload()).toMatchObject({ + response_type: 'id_token', + nonce: '40252afc-6a82-4a2e-905f-e41f122ef575', + client_id: + 'did:ion:EiBAA99TAezxKRc2wuuBnr4zzGsS2YcsOA4IPQV0KY64Xg:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkdnWkdUZzhlQ2E3bFYyOE1MOUpUbUJVdms3RFlCYmZSS1dMaHc2NUpvMXMiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaURKV0Z2WUJ5Qzd2azA2MXAzdHYwd29WSTk5MTFQTGgwUVp4cWpZM2Y4MVFRIn0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlBX1RvVlNBZDBTRWxOU2VrQ1k1UDVHZ01KQy1MTVpFY2ZSV2ZqZGNaYXJFQSIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpRDN0ZTV4eFliemJod0pYdEUwZ2tZV3Z3MlZ2VFB4MU9la0RTcXduZzRTWmcifX0', + response_mode: 'post', + // "nbf" : 1674772063, + scope: 'openid', + claims: { + vp_token: { + presentation_definition: { + input_descriptors: [ + { + schema: [ + { + uri: 'VerifiedEmployee', + }, + ], + purpose: 'We need to verify that you have a valid VerifiedEmployee Verifiable Credential.', + name: 'VerifiedEmployeeVC', + id: 'VerifiedEmployeeVC', + }, + ], + id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + }, + }, + }, + registration: { + logo_uri: 'https://example.com/verifier-icon.png', + tos_uri: 'https://example.com/verifier-info', + client_name: 'Example Verifier', + vp_formats: { + jwt_vc: { + alg: ['EdDSA', 'ES256K'], + }, + jwt_vp: { + alg: ['EdDSA', 'ES256K'], + }, + }, + subject_syntax_types_supported: ['did:ion'], + }, + state: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + redirect_uri: 'https://example.com/siop-response' /*, + "exp" : 1674775663, + "iat" : 1674772063, + "jti" : "f0e6dcf5-3fe6-4507-adc9-b496daf34512"*/, + }) + }) + it('should re-create uri', async () => { + const authRequest = await createAuthRequest() + const uri = await authRequest.uri() + expect(uri.encodedUri).toEqual( + 'openid-vc://?request_uri=https%3A%2F%2Fexample%2Fservice%2Fapi%2Fv1%2Fpresentation-request%2F649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + ) + }) + it('should get presentation definition', async () => { + const authRequest = await createAuthRequest() + const defs = await authRequest.getPresentationDefinitions() + expect(defs).toBeDefined() + expect(defs).toHaveLength(1) + }) + it('should decode id token jwt', async () => { + const idToken = await IDToken.fromIDToken(TestVectors.idTokenJwt) + expect(idToken).toBeDefined() + const payload = await idToken.payload() + expect(payload).toEqual(TestVectors.idTokenPayload) + expect( + await idToken.verify({ + correlationId: '1234', + audience: + 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + verifyJwtCallback: verifyJwtCallback, + verification: { + presentationVerificationCallback, + }, + }), + ).toBeTruthy() + }) + + it('should decode auth response', async () => { + const authorizationResponse = await AuthorizationResponse.fromPayload(TestVectors.authorizationResponsePayload) + expect(authorizationResponse).toBeDefined() + expect(authorizationResponse.payload).toEqual(TestVectors.authorizationResponsePayload) + expect(await authorizationResponse.idToken?.payload()).toEqual(TestVectors.idTokenPayload) + expect( + await authorizationResponse.idToken?.verify({ + verifyJwtCallback: verifyJwtCallback, + correlationId: '1234', + audience: + 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + verification: { + presentationVerificationCallback, + revocationOpts: { + revocationVerification: RevocationVerification.NEVER, + }, + }, + }), + ).toBeTruthy() + + const authRequest = await createAuthRequest() + const presentationDefinitions = await authRequest.getPresentationDefinitions() + + const verified = await authorizationResponse.verify({ + correlationId: '1234', + verifyJwtCallback: verifyJwtCallback, + audience: + 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + verification: { + presentationVerificationCallback, + revocationOpts: { + revocationVerification: RevocationVerification.NEVER, + }, + }, + presentationDefinitions, + }) + expect(verified).toBeDefined() + }) +}) + +describe('OP using test vectors', () => { + it('should import auth request and be able to provide the auth request unaltered', async () => { + nock('https://example').get('/service/api/v1/presentation-request/649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9').reply(200, TestVectors.requestObjectJwt) + // expect.assertions(1); + const result = await op.verifyAuthorizationRequest(TestVectors.auth_request, { + verification: {}, + }) + expect(result).toBeDefined() + }) + + it('should use test vector auth response', async () => { + const authorizationResponse = await AuthorizationResponse.fromPayload(TestVectors.authorizationResponsePayload) + + expect(authorizationResponse.payload.vp_token).toBeDefined() + expect(authorizationResponse.payload.id_token).toBeDefined() + expect(await authorizationResponse.idToken?.payload()).toEqual({ + _vp_token: { + presentation_submission: { + definition_id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + descriptor_map: [ + { + format: 'jwt_vp', + id: 'VerifiedEmployeeVC', + path: '$', + path_nested: { + format: 'jwt_vc', + id: 'VerifiedEmployeeVC', + path: '$.verifiableCredential[0]', + }, + }, + ], + id: '9af24e8a-c8f3-4b9a-9161-b715e77a6010', + }, + }, + aud: 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + exp: 1674786463, + iat: 1674772063, + iss: 'https://self-issued.me/v2/openid-vc', + jti: '0f5dafed-0d82-43b1-af79-40440e3f1366', + nonce: '40252afc-6a82-4a2e-905f-e41f122ef575', + sub: 'did:ion:EiAeM6No9kdpos6_ehBUDh4RINY4USDMh-QdWksmsI3WkA:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IncwNk9WN2U2blR1cnQ2RzlWcFZYeEl3WW55amZ1cHhlR3lLQlMtYmxxdmciLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUFSNGRVQmxqNWNGa3dMdkpTWUYzVExjLV81MWhDX2xZaGxXZkxWZ29seTRRIn0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlEcVJyWU5fV3JTakFQdnlFYlJQRVk4WVhPRmNvT0RTZExUTWItM2FKVElGQSIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQUwyMFdYakpQQW54WWdQY1U5RV9POE1OdHNpQk00QktpaVNwT3ZFTWpVOUEifX0', + }) + await rp.verifyAuthorizationResponse(TestVectors.authorizationResponsePayload, { + audience: + 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + verification: { + revocationOpts: { + revocationVerification: RevocationVerification.NEVER, + }, + presentationVerificationCallback, + }, + presentationDefinitions: [ + { + definition: TestVectors.presentationDef, + location: PresentationDefinitionLocation.CLAIMS_VP_TOKEN, + }, + ], + }) + + nock('https://example', {}).post('/resp').reply(200, {}) + await op.submitAuthorizationResponse({ + response: authorizationResponse, + correlationId: '12345', + responseURI: 'https://example/resp', + }) + }) + it('should create auth response', async () => { + nock('https://example') + .get('/service/api/v1/presentation-request/649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9') + .times(1) + .reply(200, TestVectors.requestObjectJwt) + const result = await op.verifyAuthorizationRequest(TestVectors.auth_request, { + verification: {}, + }) + const presentationExchange = new PresentationExchange({ + allDIDs: [TestVectors.holderDID], + allVerifiableCredentials: [TestVectors.jwtVCFromVPToken], + }) + const verifiablePresentationResult = await presentationExchange.createVerifiablePresentation( + TestVectors.presentationDef, + [TestVectors.jwtVCFromVPToken], + presentationSignCallback, + { + holderDID: TestVectors.holderDID, + signatureOptions: {}, + proofOptions: { + type: IProofType.JwtProof2020, + }, + }, + ) + await op.createAuthorizationResponse(result, { + presentationExchange: { + verifiablePresentations: [verifiablePresentationResult.verifiablePresentation], + presentationSubmission: TestVectors.presentation_submission, + vpTokenLocation: VPTokenLocation.ID_TOKEN, + }, + }) + }) +}) + +async function createAuthRequest(): Promise { + return await rp.createAuthorizationRequest({ + correlationId: '1234', + nonce: { propertyValue: '40252afc-6a82-4a2e-905f-e41f122ef575', targets: PropertyTarget.REQUEST_OBJECT }, + state: { propertyValue: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', targets: PropertyTarget.REQUEST_OBJECT }, + jwtIssuer: { method: 'did', alg: SigningAlgo.EDDSA, didUrl: TestVectors.verifierKID }, + claims: { + propertyValue: { + vp_token: { + presentation_definition: { + input_descriptors: [ + { + schema: [ + { + uri: 'VerifiedEmployee', + }, + ], + purpose: 'We need to verify that you have a valid VerifiedEmployee Verifiable Credential.', + name: 'VerifiedEmployeeVC', + id: 'VerifiedEmployeeVC', + }, + ], + id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + }, + }, + }, + targets: PropertyTarget.REQUEST_OBJECT, + }, + }) +} + +class TestVectors { + public static issuerDID = + 'did:ion:EiBAA99TAezxKRc2wuuBnr4zzGsS2YcsOA4IPQV0KY64Xg:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkdnWkdUZzhlQ2E3bFYyOE1MOUpUbUJVdms3RFlCYmZSS1dMaHc2NUpvMXMiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaURKV0Z2WUJ5Qzd2azA2MXAzdHYwd29WSTk5MTFQTGgwUVp4cWpZM2Y4MVFRIn0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlBX1RvVlNBZDBTRWxOU2VrQ1k1UDVHZ01KQy1MTVpFY2ZSV2ZqZGNaYXJFQSIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpRDN0ZTV4eFliemJod0pYdEUwZ2tZV3Z3MlZ2VFB4MU9la0RTcXduZzRTWmcifX0' + public static issuerKID = `${TestVectors.issuerDID}#key-1` + public static issuerJwk = { + kty: 'OKP', + d: 'jGLXxgOFN5DuQQFrRBN58Xll5SRizDXyVL5uiDY60_4', + crv: 'Ed25519', + kid: 'key-1', + x: 'GgZGTg8eCa7lV28ML9JTmBUvk7DYBbfRKWLhw65Jo1s', + } + public static issuerKey + public static issuerPrivateKey + public static issuerPublicKey + public static issuerHexPrivateKey + + public static holderJwk = { + kty: 'OKP', + d: 'ZeDOVmemqzPAK0R2F1BHVfRYC7g65p_UpyXhEaX03N4', + crv: 'Ed25519', + kid: 'key-1', + x: 'w06OV7e6nTurt6G9VpVXxIwYnyjfupxeGyKBS-blqvg', + } + public static holderDID = + 'did:ion:EiAeM6No9kdpos6_ehBUDh4RINY4USDMh-QdWksmsI3WkA:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IncwNk9WN2U2blR1cnQ2RzlWcFZYeEl3WW55amZ1cHhlR3lLQlMtYmxxdmciLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUFSNGRVQmxqNWNGa3dMdkpTWUYzVExjLV81MWhDX2xZaGxXZkxWZ29seTRRIn0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlEcVJyWU5fV3JTakFQdnlFYlJQRVk4WVhPRmNvT0RTZExUTWItM2FKVElGQSIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQUwyMFdYakpQQW54WWdQY1U5RV9POE1OdHNpQk00QktpaVNwT3ZFTWpVOUEifX0' + public static holderKID = `${TestVectors.holderDID}#key-1` + public static holderKey + public static holderPrivateKey + public static holderPublicKey + public static holderHexPrivateKey + + public static verifierJwk = { + kty: 'OKP', + d: 'SP18SnbU9f-Rph0GwulyvmLFyCXDHqZVKWDo2E41llQ', + crv: 'Ed25519', + kid: 'key-1', + x: 'C_OUJxH6iIcC6XdNh7JmC-THXAVaXnvu9OEEZ8tq9NI', + } + public static verifierDID = + 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0' + + public static verifierKID = `${TestVectors.verifierDID}#key-1` + public static verifierKey: jose.KeyLike | Uint8Array + public static verifierPrivateKey: string + public static verifierPublicKey: string + public static verifierHexPrivateKey: string + + public static async init() { + TestVectors.issuerKey = (await jose.importJWK(TestVectors.issuerJwk, 'EdDSA', true)) as KeyLike + TestVectors.issuerPrivateKey = u8a.toString(u8a.fromString(TestVectors.issuerJwk.d, 'base64url'), 'hex') + TestVectors.issuerPublicKey = u8a.toString(u8a.fromString(TestVectors.issuerJwk.x, 'base64url'), 'hex') + TestVectors.issuerHexPrivateKey = `${TestVectors.issuerPrivateKey}${TestVectors.issuerPublicKey}` + + TestVectors.holderKey = (await jose.importJWK(TestVectors.holderJwk, 'EdDSA', true)) as KeyLike + TestVectors.holderPrivateKey = u8a.toString(u8a.fromString(TestVectors.holderJwk.d, 'base64url'), 'hex') + TestVectors.holderPublicKey = u8a.toString(u8a.fromString(TestVectors.holderJwk.x, 'base64url'), 'hex') + TestVectors.holderHexPrivateKey = `${TestVectors.holderPrivateKey}${TestVectors.holderPublicKey}` + + TestVectors.verifierKey = (await jose.importJWK(TestVectors.verifierJwk, 'EdDSA', true)) as KeyLike + TestVectors.verifierPrivateKey = u8a.toString(u8a.fromString(TestVectors.verifierJwk.d, 'base64url'), 'hex') + TestVectors.verifierPublicKey = u8a.toString(u8a.fromString(TestVectors.verifierJwk.x, 'base64url'), 'hex') + TestVectors.verifierHexPrivateKey = `${TestVectors.verifierPrivateKey}${TestVectors.verifierPublicKey}` + } + + public static auth_request = 'openid-vc://?request_uri=https://example/service/api/v1/presentation-request/649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9' + public static request_uri = 'https://example/service/api/v1/presentation-request/649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9' + + public static idTokenJwt = + 'eyJraWQiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCNrZXktMSIsImFsZyI6IkVkRFNBIn0.eyJzdWIiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCIsImF1ZCI6ImRpZDppb246RWlCV2U5UnRIVDdWWi1KdWZmOE9ubkpBeUZKdENva2NZSHgxQ1FrRnRwbDdwdzpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUpyWlhrdE1TSXNJbkIxWW14cFkwdGxlVXAzYXlJNmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SWtOZlQxVktlRWcyYVVsalF6WllaRTVvTjBwdFF5MVVTRmhCVm1GWWJuWjFPVTlGUlZvNGRIRTVUa2tpTENKcmFXUWlPaUpyWlhrdE1TSjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjE5ZlYwc0luVndaR0YwWlVOdmJXMXBkRzFsYm5RaU9pSkZhVU5ZVGtKcVNXWk1WR1pPVjBOSE1GUTJNMlZhWW1KRVpGWm9TbUpVVGpndFNtWmxhVXg0ZFcxb1pXNTNJbjBzSW5OMVptWnBlRVJoZEdFaU9uc2laR1ZzZEdGSVlYTm9Jam9pUldsQ1pWWjVSWEJEYjBOUGVYSjZWRGhEU0hsdlFXMWFjVTFDVDFvMFZUWnFjbTFzZFV0MVNqbHhTMHBrWnlJc0luSmxZMjkyWlhKNVEyOXRiV2wwYldWdWRDSTZJa1ZwUW5oa2NIbHlhbWxWU0ZaMWFrTlJXVEJLTWtoQlVGRllabk53V0ZCS1lXbHVWMjFtVjNSTmNGaG5lRkVpZlgwIiwiaXNzIjoiaHR0cHM6XC9cL3NlbGYtaXNzdWVkLm1lXC92Mlwvb3BlbmlkLXZjIiwiZXhwIjoxNjc0Nzg2NDYzLCJpYXQiOjE2NzQ3NzIwNjMsIm5vbmNlIjoiNDAyNTJhZmMtNmE4Mi00YTJlLTkwNWYtZTQxZjEyMmVmNTc1IiwianRpIjoiMGY1ZGFmZWQtMGQ4Mi00M2IxLWFmNzktNDA0NDBlM2YxMzY2IiwiX3ZwX3Rva2VuIjp7InByZXNlbnRhdGlvbl9zdWJtaXNzaW9uIjp7ImlkIjoiOWFmMjRlOGEtYzhmMy00YjlhLTkxNjEtYjcxNWU3N2E2MDEwIiwiZGVmaW5pdGlvbl9pZCI6IjY0OWQ4YzNjLWY1YWMtNDFiZC05YzE5LTU4MDRlYTFiOGZlOSIsImRlc2NyaXB0b3JfbWFwIjpbeyJpZCI6IlZlcmlmaWVkRW1wbG95ZWVWQyIsImZvcm1hdCI6Imp3dF92cCIsInBhdGgiOiIkIiwicGF0aF9uZXN0ZWQiOnsiaWQiOiJWZXJpZmllZEVtcGxveWVlVkMiLCJmb3JtYXQiOiJqd3RfdmMiLCJwYXRoIjoiJC52ZXJpZmlhYmxlQ3JlZGVudGlhbFswXSJ9fV19fX0.jh-SnpQcYPGEb_N5mqKUKCi9pA2OqxXw7BbAYuQwQat69KqpHA0sEZ1tOTOwsVP9UCfjmVg_8z0I_TvKkEkCBA' + + public static presentation_submission = { + descriptor_map: [ + { + path: '$', + format: 'jwt_vp', + path_nested: { + path: '$.verifiableCredential[0]', + format: 'jwt_vc', + id: 'VerifiedEmployeeVC', + }, + id: 'VerifiedEmployeeVC', + }, + ], + definition_id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + id: '9af24e8a-c8f3-4b9a-9161-b715e77a6010', + } + + public static idTokenPayload = { + sub: 'did:ion:EiAeM6No9kdpos6_ehBUDh4RINY4USDMh-QdWksmsI3WkA:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IncwNk9WN2U2blR1cnQ2RzlWcFZYeEl3WW55amZ1cHhlR3lLQlMtYmxxdmciLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUFSNGRVQmxqNWNGa3dMdkpTWUYzVExjLV81MWhDX2xZaGxXZkxWZ29seTRRIn0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlEcVJyWU5fV3JTakFQdnlFYlJQRVk4WVhPRmNvT0RTZExUTWItM2FKVElGQSIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQUwyMFdYakpQQW54WWdQY1U5RV9POE1OdHNpQk00QktpaVNwT3ZFTWpVOUEifX0', + aud: 'did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0', + iss: 'https://self-issued.me/v2/openid-vc', + exp: 1674786463, + iat: 1674772063, + nonce: '40252afc-6a82-4a2e-905f-e41f122ef575', + jti: '0f5dafed-0d82-43b1-af79-40440e3f1366', + _vp_token: { + presentation_submission: { + descriptor_map: [ + { + path: '$', + format: 'jwt_vp', + path_nested: { + path: '$.verifiableCredential[0]', + format: 'jwt_vc', + id: 'VerifiedEmployeeVC', + }, + id: 'VerifiedEmployeeVC', + }, + ], + definition_id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + id: '9af24e8a-c8f3-4b9a-9161-b715e77a6010', + }, + }, + } + public static presentationDef = { + input_descriptors: [ + { + schema: [ + { + uri: 'VerifiedEmployee', + }, + ], + purpose: 'We need to verify that you have a valid VerifiedEmployee Verifiable Credential.', + name: 'VerifiedEmployeeVC', + id: 'VerifiedEmployeeVC', + }, + ], + id: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + } + + public static requestObjectJwt = + 'eyJraWQiOiJkaWQ6aW9uOkVpQldlOVJ0SFQ3VlotSnVmZjhPbm5KQXlGSnRDb2tjWUh4MUNRa0Z0cGw3cHc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNklrTmZUMVZLZUVnMmFVbGpRelpZWkU1b04wcHRReTFVU0ZoQlZtRllibloxT1U5RlJWbzRkSEU1VGtraUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVOWVRrSnFTV1pNVkdaT1YwTkhNRlEyTTJWYVltSkVaRlpvU21KVVRqZ3RTbVpsYVV4NGRXMW9aVzUzSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbENaVlo1UlhCRGIwTlBlWEo2VkRoRFNIbHZRVzFhY1UxQ1QxbzBWVFpxY20xc2RVdDFTamx4UzBwa1p5SXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFuaGtjSGx5YW1sVlNGWjFha05SV1RCS01raEJVRkZZWm5Od1dGQktZV2x1VjIxbVYzUk5jRmhuZUZFaWZYMCNrZXktMSIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJyZXNwb25zZV90eXBlIjoiaWRfdG9rZW4iLCJub25jZSI6IjQwMjUyYWZjLTZhODItNGEyZS05MDVmLWU0MWYxMjJlZjU3NSIsImNsaWVudF9pZCI6ImRpZDppb246RWlCV2U5UnRIVDdWWi1KdWZmOE9ubkpBeUZKdENva2NZSHgxQ1FrRnRwbDdwdzpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUpyWlhrdE1TSXNJbkIxWW14cFkwdGxlVXAzYXlJNmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SWtOZlQxVktlRWcyYVVsalF6WllaRTVvTjBwdFF5MVVTRmhCVm1GWWJuWjFPVTlGUlZvNGRIRTVUa2tpTENKcmFXUWlPaUpyWlhrdE1TSjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjE5ZlYwc0luVndaR0YwWlVOdmJXMXBkRzFsYm5RaU9pSkZhVU5ZVGtKcVNXWk1WR1pPVjBOSE1GUTJNMlZhWW1KRVpGWm9TbUpVVGpndFNtWmxhVXg0ZFcxb1pXNTNJbjBzSW5OMVptWnBlRVJoZEdFaU9uc2laR1ZzZEdGSVlYTm9Jam9pUldsQ1pWWjVSWEJEYjBOUGVYSjZWRGhEU0hsdlFXMWFjVTFDVDFvMFZUWnFjbTFzZFV0MVNqbHhTMHBrWnlJc0luSmxZMjkyWlhKNVEyOXRiV2wwYldWdWRDSTZJa1ZwUW5oa2NIbHlhbWxWU0ZaMWFrTlJXVEJLTWtoQlVGRllabk53V0ZCS1lXbHVWMjFtVjNSTmNGaG5lRkVpZlgwIiwicmVzcG9uc2VfbW9kZSI6InBvc3QiLCJuYmYiOjE2NzQ3NzIwNjMsInNjb3BlIjoib3BlbmlkIiwiY2xhaW1zIjp7InZwX3Rva2VuIjp7InByZXNlbnRhdGlvbl9kZWZpbml0aW9uIjp7ImlkIjoiNjQ5ZDhjM2MtZjVhYy00MWJkLTljMTktNTgwNGVhMWI4ZmU5IiwiaW5wdXRfZGVzY3JpcHRvcnMiOlt7ImlkIjoiVmVyaWZpZWRFbXBsb3llZVZDIiwibmFtZSI6IlZlcmlmaWVkRW1wbG95ZWVWQyIsInB1cnBvc2UiOiJXZSBuZWVkIHRvIHZlcmlmeSB0aGF0IHlvdSBoYXZlIGEgVmVyaWZpZWRFbXBsb3llZSBWZXJpZmlhYmxlIENyZWRlbnRpYWwuIiwic2NoZW1hIjpbeyJ1cmkiOiJWZXJpZmllZEVtcGxveWVlIn1dfV19fX0sInJlZ2lzdHJhdGlvbiI6eyJjbGllbnRfbmFtZSI6IkV4YW1wbGUgVmVyaWZpZXIiLCJ0b3NfdXJpIjoiaHR0cHM6XC9cL2V4YW1wbGUuY29tXC92ZXJpZmllci1pbmZvIiwibG9nb191cmkiOiJodHRwczpcL1wvZXhhbXBsZS5jb21cL3ZlcmlmaWVyLWljb24ucG5nIiwic3ViamVjdF9zeW50YXhfdHlwZXNfc3VwcG9ydGVkIjpbImRpZDppb24iXSwidnBfZm9ybWF0cyI6eyJqd3RfdnAiOnsiYWxnIjpbIkVkRFNBIiwiRVMyNTZLIl19LCJqd3RfdmMiOnsiYWxnIjpbIkVkRFNBIiwiRVMyNTZLIl19fX0sInN0YXRlIjoiNjQ5ZDhjM2MtZjVhYy00MWJkLTljMTktNTgwNGVhMWI4ZmU5IiwicmVkaXJlY3RfdXJpIjoiaHR0cHM6XC9cL2V4YW1wbGUuY29tXC9zaW9wLXJlc3BvbnNlIiwiZXhwIjoxNjc0Nzc1NjYzLCJpYXQiOjE2NzQ3NzIwNjMsImp0aSI6ImYwZTZkY2Y1LTNmZTYtNDUwNy1hZGM5LWI0OTZkYWYzNDUxMiJ9.znX9h8l8JYoy8BHlnZzRDBEpaAv3hkb_XfUEzG-9eZID3tJjJdrO7PAr4kTay-nxvMhkzNsQg1rCZsjOMbKbBg' + public static requestObjectPayload = + '\n' + + ' {\n' + + ' "kid" : "did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0#key-1",\n' + + ' "typ" : "JWT",\n' + + ' "alg" : "EdDSA"\n' + + ' }.\n' + + ' {\n' + + ' "response_type" : "id_token",\n' + + ' "nonce" : "40252afc-6a82-4a2e-905f-e41f122ef575",\n' + + ' "client_id" : "did:ion:EiBWe9RtHT7VZ-Juff8OnnJAyFJtCokcYHx1CQkFtpl7pw:eyJkZWx0YSI6eyJwYXRjaGVzIjpbeyJhY3Rpb24iOiJyZXBsYWNlIiwiZG9jdW1lbnQiOnsicHVibGljS2V5cyI6W3siaWQiOiJrZXktMSIsInB1YmxpY0tleUp3ayI6eyJjcnYiOiJFZDI1NTE5Iiwia3R5IjoiT0tQIiwieCI6IkNfT1VKeEg2aUljQzZYZE5oN0ptQy1USFhBVmFYbnZ1OU9FRVo4dHE5TkkiLCJraWQiOiJrZXktMSJ9LCJwdXJwb3NlcyI6WyJhdXRoZW50aWNhdGlvbiJdLCJ0eXBlIjoiSnNvbldlYktleTIwMjAifV19fV0sInVwZGF0ZUNvbW1pdG1lbnQiOiJFaUNYTkJqSWZMVGZOV0NHMFQ2M2VaYmJEZFZoSmJUTjgtSmZlaUx4dW1oZW53In0sInN1ZmZpeERhdGEiOnsiZGVsdGFIYXNoIjoiRWlCZVZ5RXBDb0NPeXJ6VDhDSHlvQW1acU1CT1o0VTZqcm1sdUt1SjlxS0pkZyIsInJlY292ZXJ5Q29tbWl0bWVudCI6IkVpQnhkcHlyamlVSFZ1akNRWTBKMkhBUFFYZnNwWFBKYWluV21mV3RNcFhneFEifX0",\n' + + ' "response_mode" : "post",\n' + + ' "nbf" : 1674772063,\n' + + ' "scope" : "openid",\n' + + ' "claims" : {\n' + + ' "vp_token" : {\n' + + ' "presentation_definition" : {\n' + + ' "input_descriptors" : [ {\n' + + ' "schema" : [ {\n' + + ' "uri" : "VerifiedEmployee"\n' + + ' } ],\n' + + ' "purpose" : "We need to verify that you have a valid VerifiedEmployee Verifiable Credential.",\n' + + ' "name" : "VerifiedEmployeeVC",\n' + + ' "id" : "VerifiedEmployeeVC"\n' + + ' } ],\n' + + ' "id" : "649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9"\n' + + ' }\n' + + ' }\n' + + ' },\n' + + ' "registration" : {\n' + + ' "logo_uri" : "https://example.com/verifier-icon.png",\n' + + ' "tos_uri" : "https://example.com/verifier-info",\n' + + ' "client_name" : "Example Verifier",\n' + + ' "vp_formats" : {\n' + + ' "jwt_vc" : {\n' + + ' "alg" : [ "EdDSA", "ES256K" ]\n' + + ' },\n' + + ' "jwt_vp" : {\n' + + ' "alg" : [ "EdDSA", "ES256K" ]\n' + + ' }\n' + + ' },\n' + + ' "subject_syntax_types_supported" : [ "did:ion" ]\n' + + ' },\n' + + ' "state" : "649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9",\n' + + ' "redirect_uri" : "https://example.com/siop-response",\n' + + ' "exp" : 1674775663,\n' + + ' "iat" : 1674772063,\n' + + ' "jti" : "f0e6dcf5-3fe6-4507-adc9-b496daf34512"\n' + + ' }.\n' + + ' [withSignature]\n' + + public static authorizationResponsePayload = { + state: '649d8c3c-f5ac-41bd-9c19-5804ea1b8fe9', + id_token: + 'eyJraWQiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCNrZXktMSIsImFsZyI6IkVkRFNBIn0.eyJzdWIiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCIsImF1ZCI6ImRpZDppb246RWlCV2U5UnRIVDdWWi1KdWZmOE9ubkpBeUZKdENva2NZSHgxQ1FrRnRwbDdwdzpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUpyWlhrdE1TSXNJbkIxWW14cFkwdGxlVXAzYXlJNmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SWtOZlQxVktlRWcyYVVsalF6WllaRTVvTjBwdFF5MVVTRmhCVm1GWWJuWjFPVTlGUlZvNGRIRTVUa2tpTENKcmFXUWlPaUpyWlhrdE1TSjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjE5ZlYwc0luVndaR0YwWlVOdmJXMXBkRzFsYm5RaU9pSkZhVU5ZVGtKcVNXWk1WR1pPVjBOSE1GUTJNMlZhWW1KRVpGWm9TbUpVVGpndFNtWmxhVXg0ZFcxb1pXNTNJbjBzSW5OMVptWnBlRVJoZEdFaU9uc2laR1ZzZEdGSVlYTm9Jam9pUldsQ1pWWjVSWEJEYjBOUGVYSjZWRGhEU0hsdlFXMWFjVTFDVDFvMFZUWnFjbTFzZFV0MVNqbHhTMHBrWnlJc0luSmxZMjkyWlhKNVEyOXRiV2wwYldWdWRDSTZJa1ZwUW5oa2NIbHlhbWxWU0ZaMWFrTlJXVEJLTWtoQlVGRllabk53V0ZCS1lXbHVWMjFtVjNSTmNGaG5lRkVpZlgwIiwiaXNzIjoiaHR0cHM6XC9cL3NlbGYtaXNzdWVkLm1lXC92Mlwvb3BlbmlkLXZjIiwiZXhwIjoxNjc0Nzg2NDYzLCJpYXQiOjE2NzQ3NzIwNjMsIm5vbmNlIjoiNDAyNTJhZmMtNmE4Mi00YTJlLTkwNWYtZTQxZjEyMmVmNTc1IiwianRpIjoiMGY1ZGFmZWQtMGQ4Mi00M2IxLWFmNzktNDA0NDBlM2YxMzY2IiwiX3ZwX3Rva2VuIjp7InByZXNlbnRhdGlvbl9zdWJtaXNzaW9uIjp7ImlkIjoiOWFmMjRlOGEtYzhmMy00YjlhLTkxNjEtYjcxNWU3N2E2MDEwIiwiZGVmaW5pdGlvbl9pZCI6IjY0OWQ4YzNjLWY1YWMtNDFiZC05YzE5LTU4MDRlYTFiOGZlOSIsImRlc2NyaXB0b3JfbWFwIjpbeyJpZCI6IlZlcmlmaWVkRW1wbG95ZWVWQyIsImZvcm1hdCI6Imp3dF92cCIsInBhdGgiOiIkIiwicGF0aF9uZXN0ZWQiOnsiaWQiOiJWZXJpZmllZEVtcGxveWVlVkMiLCJmb3JtYXQiOiJqd3RfdmMiLCJwYXRoIjoiJC52ZXJpZmlhYmxlQ3JlZGVudGlhbFswXSJ9fV19fX0.jh-SnpQcYPGEb_N5mqKUKCi9pA2OqxXw7BbAYuQwQat69KqpHA0sEZ1tOTOwsVP9UCfjmVg_8z0I_TvKkEkCBA', + vp_token: + 'eyJraWQiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCNrZXktMSIsImFsZyI6IkVkRFNBIn0.eyJhdWQiOiJkaWQ6aW9uOkVpQldlOVJ0SFQ3VlotSnVmZjhPbm5KQXlGSnRDb2tjWUh4MUNRa0Z0cGw3cHc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNklrTmZUMVZLZUVnMmFVbGpRelpZWkU1b04wcHRReTFVU0ZoQlZtRllibloxT1U5RlJWbzRkSEU1VGtraUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVOWVRrSnFTV1pNVkdaT1YwTkhNRlEyTTJWYVltSkVaRlpvU21KVVRqZ3RTbVpsYVV4NGRXMW9aVzUzSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbENaVlo1UlhCRGIwTlBlWEo2VkRoRFNIbHZRVzFhY1UxQ1QxbzBWVFpxY20xc2RVdDFTamx4UzBwa1p5SXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFuaGtjSGx5YW1sVlNGWjFha05SV1RCS01raEJVRkZZWm5Od1dGQktZV2x1VjIxbVYzUk5jRmhuZUZFaWZYMCIsImlzcyI6ImRpZDppb246RWlBZU02Tm85a2Rwb3M2X2VoQlVEaDRSSU5ZNFVTRE1oLVFkV2tzbXNJM1drQTpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUpyWlhrdE1TSXNJbkIxWW14cFkwdGxlVXAzYXlJNmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SW5jd05rOVdOMlUyYmxSMWNuUTJSemxXY0ZaWWVFbDNXVzU1YW1aMWNIaGxSM2xMUWxNdFlteHhkbWNpTENKcmFXUWlPaUpyWlhrdE1TSjlMQ0p3ZFhKd2IzTmxjeUk2V3lKaGRYUm9aVzUwYVdOaGRHbHZiaUpkTENKMGVYQmxJam9pU25OdmJsZGxZa3RsZVRJd01qQWlmVjE5ZlYwc0luVndaR0YwWlVOdmJXMXBkRzFsYm5RaU9pSkZhVUZTTkdSVlFteHFOV05HYTNkTWRrcFRXVVl6VkV4akxWODFNV2hEWDJ4WmFHeFhaa3hXWjI5c2VUUlJJbjBzSW5OMVptWnBlRVJoZEdFaU9uc2laR1ZzZEdGSVlYTm9Jam9pUldsRWNWSnlXVTVmVjNKVGFrRlFkbmxGWWxKUVJWazRXVmhQUm1OdlQwUlRaRXhVVFdJdE0yRktWRWxHUVNJc0luSmxZMjkyWlhKNVEyOXRiV2wwYldWdWRDSTZJa1ZwUVV3eU1GZFlha3BRUVc1NFdXZFFZMVU1UlY5UE9FMU9kSE5wUWswMFFrdHBhVk53VDNaRlRXcFZPVUVpZlgwIiwidnAiOnsiQGNvbnRleHQiOlsiaHR0cHM6XC9cL3d3dy53My5vcmdcLzIwMThcL2NyZWRlbnRpYWxzXC92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKcmFXUWlPaUprYVdRNmFXOXVPa1ZwUWtGQk9UbFVRV1Y2ZUV0U1l6SjNkWFZDYm5JMGVucEhjMU15V1dOelQwRTBTVkJSVmpCTFdUWTBXR2M2WlhsS2ExcFhlREJaVTBrMlpYbEtkMWxZVW1waFIxWjZTV3B3WW1WNVNtaFpNMUp3WWpJMGFVOXBTbmxhV0VKeldWZE9iRWxwZDJsYVJ6bHFaRmN4YkdKdVVXbFBibk5wWTBoV2FXSkhiR3BUTWxZMVkzbEpObGN6YzJsaFYxRnBUMmxLY2xwWWEzUk5VMGx6U1c1Q01WbHRlSEJaTUhSc1pWVndNMkY1U1RabGVVcHFZMjVaYVU5cFNrWmFSRWt4VGxSRk5VbHBkMmxoTTFJMVNXcHZhVlF3ZEZGSmFYZHBaVU5KTmtsclpHNVhhMlJWV25wb2JGRXlSVE5pUmxsNVQwVXhUVTlWY0ZWaVZVcFdaRzF6TTFKR2JFTlpiVnBUVXpGa1RXRklZekpPVlhCMlRWaE5hVXhEU25KaFYxRnBUMmxLY2xwWWEzUk5VMG81VEVOS2QyUllTbmRpTTA1c1kzbEpObGQ1U21oa1dGSnZXbGMxTUdGWFRtaGtSMngyWW1sS1pFeERTakJsV0VKc1NXcHZhVk51VG5aaWJHUnNXV3QwYkdWVVNYZE5ha0ZwWmxZeE9XWldNSE5KYmxaM1drZEdNRnBWVG5aaVZ6RndaRWN4YkdKdVVXbFBhVXBHWVZWU1MxWXdXakpYVlVvMVVYcGtNbUY2UVRKTldFRjZaRWhaZDJReU9WZFRWR3MxVFZSR1VWUkhaM2RWVm5BMFkxZHdXazB5V1RSTlZrWlNTVzR3YzBsdVRqRmFiVnB3WlVWU2FHUkhSV2xQYm5OcFdrZFdjMlJIUmtsWldFNXZTV3B2YVZKWGJFSllNVkoyVm14T1FscEVRbFJTVjNoUFZUSldjbEV4YXpGVlJGWklXakF4UzFGNU1VMVVWbkJHV1RKYVUxWXlXbkZhUjA1aFdWaEtSbEZUU1hOSmJrcHNXVEk1TWxwWVNqVlJNamwwWWxkc01HSlhWblZrUTBrMlNXdFdjRkpFVGpCYVZGWTBaVVpzYVdWdFNtOWtNSEJaWkVWVmQxb3lkRnBXTTFvelRXeGFNbFpHUWpSTlZUbHNZVEJTVkdOWVpIVmFlbEpVVjIxamFXWllNQ05yWlhrdE1TSXNJblI1Y0NJNklrcFhWQ0lzSW1Gc1p5STZJa1ZrUkZOQkluMC5leUp6ZFdJaU9pSmthV1E2YVc5dU9rVnBRV1ZOTms1dk9XdGtjRzl6Tmw5bGFFSlZSR2cwVWtsT1dUUlZVMFJOYUMxUlpGZHJjMjF6U1ROWGEwRTZaWGxLYTFwWGVEQlpVMGsyWlhsS2QxbFlVbXBoUjFaNlNXcHdZbVY1U21oWk0xSndZakkwYVU5cFNubGFXRUp6V1ZkT2JFbHBkMmxhUnpscVpGY3hiR0p1VVdsUGJuTnBZMGhXYVdKSGJHcFRNbFkxWTNsSk5sY3pjMmxoVjFGcFQybEtjbHBZYTNSTlUwbHpTVzVDTVZsdGVIQlpNSFJzWlZWd00yRjVTVFpsZVVwcVkyNVphVTlwU2taYVJFa3hUbFJGTlVscGQybGhNMUkxU1dwdmFWUXdkRkZKYVhkcFpVTkpOa2x1WTNkT2F6bFhUakpWTW1Kc1VqRmpibEV5VW5wc1YyTkdXbGxsUld3elYxYzFOV0Z0V2pGalNHaHNVak5zVEZGc1RYUlpiWGg0WkcxamFVeERTbkpoVjFGcFQybEtjbHBZYTNSTlUwbzVURU5LZDJSWVNuZGlNMDVzWTNsSk5sZDVTbWhrV0ZKdldsYzFNR0ZYVG1oa1IyeDJZbWxLWkV4RFNqQmxXRUpzU1dwdmFWTnVUblppYkdSc1dXdDBiR1ZVU1hkTmFrRnBabFl4T1daV01ITkpibFozV2tkR01GcFZUblppVnpGd1pFY3hiR0p1VVdsUGFVcEdZVlZHVTA1SFVsWlJiWGh4VGxkT1IyRXpaRTFrYTNCVVYxVlplbFpGZUdwTVZqZ3hUVmRvUkZneWVGcGhSM2hZV210NFYxb3lPWE5sVkZKU1NXNHdjMGx1VGpGYWJWcHdaVVZTYUdSSFJXbFBibk5wV2tkV2MyUkhSa2xaV0U1dlNXcHZhVkpYYkVWalZrcDVWMVUxWmxZelNsUmhhMFpSWkc1c1JsbHNTbEZTVm1zMFYxWm9VRkp0VG5aVU1GSlVXa1Y0VlZSWFNYUk5Na1pMVmtWc1IxRlRTWE5KYmtwc1dUSTVNbHBZU2pWUk1qbDBZbGRzTUdKWFZuVmtRMGsyU1d0V2NGRlZkM2xOUm1SWllXdHdVVkZYTlRSWFYyUlJXVEZWTlZKV09WQlBSVEZQWkVoT2NGRnJNREJSYTNSd1lWWk9kMVF6V2taVVYzQldUMVZGYVdaWU1DSXNJbTVpWmlJNk1UWTNORGMzTWpBMk15d2lhWE56SWpvaVpHbGtPbWx2YmpwRmFVSkJRVGs1VkVGbGVuaExVbU15ZDNWMVFtNXlOSHA2UjNOVE1sbGpjMDlCTkVsUVVWWXdTMWsyTkZobk9tVjVTbXRhVjNnd1dWTkpObVY1U25kWldGSnFZVWRXZWtscWNHSmxlVXBvV1ROU2NHSXlOR2xQYVVwNVdsaENjMWxYVG14SmFYZHBXa2M1YW1SWE1XeGlibEZwVDI1emFXTklWbWxpUjJ4cVV6SldOV041U1RaWE0zTnBZVmRSYVU5cFNuSmFXR3QwVFZOSmMwbHVRakZaYlhod1dUQjBiR1ZWY0ROaGVVazJaWGxLYW1OdVdXbFBhVXBHV2tSSk1VNVVSVFZKYVhkcFlUTlNOVWxxYjJsVU1IUlJTV2wzYVdWRFNUWkphMlJ1VjJ0a1ZWcDZhR3hSTWtVellrWlplVTlGTVUxUFZYQlZZbFZLVm1SdGN6TlNSbXhEV1cxYVUxTXhaRTFoU0dNeVRsVndkazFZVFdsTVEwcHlZVmRSYVU5cFNuSmFXR3QwVFZOS09VeERTbmRrV0VwM1lqTk9iR041U1RaWGVVcG9aRmhTYjFwWE5UQmhWMDVvWkVkc2RtSnBTbVJNUTBvd1pWaENiRWxxYjJsVGJrNTJZbXhrYkZscmRHeGxWRWwzVFdwQmFXWldNVGxtVmpCelNXNVdkMXBIUmpCYVZVNTJZbGN4Y0dSSE1XeGlibEZwVDJsS1JtRlZVa3RXTUZveVYxVktOVkY2WkRKaGVrRXlUVmhCZW1SSVdYZGtNamxYVTFSck5VMVVSbEZVUjJkM1ZWWndOR05YY0ZwTk1sazBUVlpHVWtsdU1ITkpiazR4V20xYWNHVkZVbWhrUjBWcFQyNXphVnBIVm5Oa1IwWkpXVmhPYjBscWIybFNWMnhDV0RGU2RsWnNUa0phUkVKVVVsZDRUMVV5Vm5KUk1Xc3hWVVJXU0Zvd01VdFJlVEZOVkZad1Jsa3lXbE5XTWxweFdrZE9ZVmxZU2taUlUwbHpTVzVLYkZreU9USmFXRW8xVVRJNWRHSlhiREJpVjFaMVpFTkpOa2xyVm5CU1JFNHdXbFJXTkdWR2JHbGxiVXB2WkRCd1dXUkZWWGRhTW5SYVZqTmFNMDFzV2pKV1JrSTBUVlU1YkdFd1VsUmpXR1IxV25wU1ZGZHRZMmxtV0RBaUxDSnBZWFFpT2pFMk56UTNOekl3TmpNc0luWmpJanA3SWtCamIyNTBaWGgwSWpwYkltaDBkSEJ6T2x3dlhDOTNkM2N1ZHpNdWIzSm5YQzh5TURFNFhDOWpjbVZrWlc1MGFXRnNjMXd2ZGpFaVhTd2lkSGx3WlNJNld5SldaWEpwWm1saFlteGxRM0psWkdWdWRHbGhiQ0lzSWxabGNtbG1hV1ZrUlcxd2JHOTVaV1VpWFN3aVkzSmxaR1Z1ZEdsaGJGTjFZbXBsWTNRaU9uc2laR2x6Y0d4aGVVNWhiV1VpT2lKUVlYUWdVMjFwZEdnaUxDSm5hWFpsYms1aGJXVWlPaUpRWVhRaUxDSnFiMkpVYVhSc1pTSTZJbGR2Y210bGNpSXNJbk4xY201aGJXVWlPaUpUYldsMGFDSXNJbkJ5WldabGNuSmxaRXhoYm1kMVlXZGxJam9pWlc0dFZWTWlMQ0p0WVdsc0lqb2ljR0YwTG5OdGFYUm9RR1Y0WVcxd2JHVXVZMjl0SW4wc0ltTnlaV1JsYm5ScFlXeFRkR0YwZFhNaU9uc2lhV1FpT2lKb2RIUndjenBjTDF3dlpYaGhiWEJzWlM1amIyMWNMMkZ3YVZ3dllYTjBZWFIxYzJ4cGMzUmNMMlJwWkRwcGIyNDZSV2xDUVVFNU9WUkJaWHA0UzFKak1uZDFkVUp1Y2pSNmVrZHpVekpaWTNOUFFUUkpVRkZXTUV0Wk5qUllaMXd2TVNNd0lpd2lkSGx3WlNJNklsSmxkbTlqWVhScGIyNU1hWE4wTWpBeU1WTjBZWFIxY3lJc0luTjBZWFIxYzB4cGMzUkpibVJsZUNJNklqQWlMQ0p6ZEdGMGRYTk1hWE4wUTNKbFpHVnVkR2xoYkNJNkltaDBkSEJ6T2x3dlhDOWxlR0Z0Y0d4bExtTnZiVnd2WVhCcFhDOWhjM1JoZEhWemJHbHpkRnd2Wkdsa09tbHZianBGYVVKQlFUazVWRUZsZW5oTFVtTXlkM1YxUW01eU5IcDZSM05UTWxsamMwOUJORWxRVVZZd1MxazJORmhuWEM4eEluMTlMQ0pxZEdraU9pSmlPREExTW1ZNVl5MDBaamhqTFRRek16QXRZbUpqTVMwME1ETXpZamhsWlRWa05tSWlmUS5WRWlLQ3IzUlZTY1VNRjgxRnhnckdDbGRZeEtJSmM0dWNMWDN6MHhha21sX0dPeG5udndrbzNDNlFxajdKTVVJOUs3dlFVVU1Wakk4MUt4a3RZdDBBUSJdfSwiZXhwIjoxNjc0Nzg2NDYzLCJpYXQiOjE2NzQ3NzIwNjMsIm5vbmNlIjoiNDAyNTJhZmMtNmE4Mi00YTJlLTkwNWYtZTQxZjEyMmVmNTc1IiwianRpIjoiOWNlZGFjODYtYWU1MS00MWQwLWFlNmYtOTI5NjZhNjFlMWY1In0.X9q1amromvW0WuA7bkanc-8BC9axhXh8RhN9i87FluTBzK3SRtKBS0O0alHU3Ii5HixENljCnncTKxi5_rbvDg', + } + + public static jwtVCFromVPToken = + 'eyJraWQiOiJkaWQ6aW9uOkVpQkFBOTlUQWV6eEtSYzJ3dXVCbnI0enpHc1MyWWNzT0E0SVBRVjBLWTY0WGc6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNklrZG5Xa2RVWnpobFEyRTNiRll5T0UxTU9VcFViVUpWZG1zM1JGbENZbVpTUzFkTWFIYzJOVXB2TVhNaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVSS1YwWjJXVUo1UXpkMmF6QTJNWEF6ZEhZd2QyOVdTVGs1TVRGUVRHZ3dVVnA0Y1dwWk0yWTRNVkZSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEJYMVJ2VmxOQlpEQlRSV3hPVTJWclExazFVRFZIWjAxS1F5MU1UVnBGWTJaU1YyWnFaR05hWVhKRlFTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFJETjBaVFY0ZUZsaWVtSm9kMHBZZEVVd1oydFpWM1ozTWxaMlZGQjRNVTlsYTBSVGNYZHVaelJUV21jaWZYMCNrZXktMSIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJzdWIiOiJkaWQ6aW9uOkVpQWVNNk5vOWtkcG9zNl9laEJVRGg0UklOWTRVU0RNaC1RZFdrc21zSTNXa0E6ZXlKa1pXeDBZU0k2ZXlKd1lYUmphR1Z6SWpwYmV5SmhZM1JwYjI0aU9pSnlaWEJzWVdObElpd2laRzlqZFcxbGJuUWlPbnNpY0hWaWJHbGpTMlY1Y3lJNlczc2lhV1FpT2lKclpYa3RNU0lzSW5CMVlteHBZMHRsZVVwM2F5STZleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNkluY3dOazlXTjJVMmJsUjFjblEyUnpsV2NGWlllRWwzV1c1NWFtWjFjSGhsUjNsTFFsTXRZbXh4ZG1jaUxDSnJhV1FpT2lKclpYa3RNU0o5TENKd2RYSndiM05sY3lJNld5SmhkWFJvWlc1MGFXTmhkR2x2YmlKZExDSjBlWEJsSWpvaVNuTnZibGRsWWt0bGVUSXdNakFpZlYxOWZWMHNJblZ3WkdGMFpVTnZiVzFwZEcxbGJuUWlPaUpGYVVGU05HUlZRbXhxTldOR2EzZE1ka3BUV1VZelZFeGpMVjgxTVdoRFgyeFphR3hYWmt4V1oyOXNlVFJSSW4wc0luTjFabVpwZUVSaGRHRWlPbnNpWkdWc2RHRklZWE5vSWpvaVJXbEVjVkp5V1U1ZlYzSlRha0ZRZG5sRllsSlFSVms0V1ZoUFJtTnZUMFJUWkV4VVRXSXRNMkZLVkVsR1FTSXNJbkpsWTI5MlpYSjVRMjl0YldsMGJXVnVkQ0k2SWtWcFFVd3lNRmRZYWtwUVFXNTRXV2RRWTFVNVJWOVBPRTFPZEhOcFFrMDBRa3RwYVZOd1QzWkZUV3BWT1VFaWZYMCIsIm5iZiI6MTY3NDc3MjA2MywiaXNzIjoiZGlkOmlvbjpFaUJBQTk5VEFlenhLUmMyd3V1Qm5yNHp6R3NTMlljc09BNElQUVYwS1k2NFhnOmV5SmtaV3gwWVNJNmV5SndZWFJqYUdWeklqcGJleUpoWTNScGIyNGlPaUp5WlhCc1lXTmxJaXdpWkc5amRXMWxiblFpT25zaWNIVmliR2xqUzJWNWN5STZXM3NpYVdRaU9pSnJaWGt0TVNJc0luQjFZbXhwWTB0bGVVcDNheUk2ZXlKamNuWWlPaUpGWkRJMU5URTVJaXdpYTNSNUlqb2lUMHRRSWl3aWVDSTZJa2RuV2tkVVp6aGxRMkUzYkZZeU9FMU1PVXBVYlVKVmRtczNSRmxDWW1aU1MxZE1hSGMyTlVwdk1YTWlMQ0pyYVdRaU9pSnJaWGt0TVNKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZWMTlmVjBzSW5Wd1pHRjBaVU52YlcxcGRHMWxiblFpT2lKRmFVUktWMFoyV1VKNVF6ZDJhekEyTVhBemRIWXdkMjlXU1RrNU1URlFUR2d3VVZwNGNXcFpNMlk0TVZGUkluMHNJbk4xWm1acGVFUmhkR0VpT25zaVpHVnNkR0ZJWVhOb0lqb2lSV2xCWDFSdlZsTkJaREJUUld4T1UyVnJRMWsxVURWSFowMUtReTFNVFZwRlkyWlNWMlpxWkdOYVlYSkZRU0lzSW5KbFkyOTJaWEo1UTI5dGJXbDBiV1Z1ZENJNklrVnBSRE4wWlRWNGVGbGllbUpvZDBwWWRFVXdaMnRaVjNaM01sWjJWRkI0TVU5bGEwUlRjWGR1WnpSVFdtY2lmWDAiLCJpYXQiOjE2NzQ3NzIwNjMsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOlwvXC93d3cudzMub3JnXC8yMDE4XC9jcmVkZW50aWFsc1wvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWVkRW1wbG95ZWUiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZGlzcGxheU5hbWUiOiJQYXQgU21pdGgiLCJnaXZlbk5hbWUiOiJQYXQiLCJqb2JUaXRsZSI6IldvcmtlciIsInN1cm5hbWUiOiJTbWl0aCIsInByZWZlcnJlZExhbmd1YWdlIjoiZW4tVVMiLCJtYWlsIjoicGF0LnNtaXRoQGV4YW1wbGUuY29tIn0sImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczpcL1wvZXhhbXBsZS5jb21cL2FwaVwvYXN0YXR1c2xpc3RcL2RpZDppb246RWlCQUE5OVRBZXp4S1JjMnd1dUJucjR6ekdzUzJZY3NPQTRJUFFWMEtZNjRYZ1wvMSMwIiwidHlwZSI6IlJldm9jYXRpb25MaXN0MjAyMVN0YXR1cyIsInN0YXR1c0xpc3RJbmRleCI6IjAiLCJzdGF0dXNMaXN0Q3JlZGVudGlhbCI6Imh0dHBzOlwvXC9leGFtcGxlLmNvbVwvYXBpXC9hc3RhdHVzbGlzdFwvZGlkOmlvbjpFaUJBQTk5VEFlenhLUmMyd3V1Qm5yNHp6R3NTMlljc09BNElQUVYwS1k2NFhnXC8xIn19LCJqdGkiOiJiODA1MmY5Yy00ZjhjLTQzMzAtYmJjMS00MDMzYjhlZTVkNmIifQ.VEiKCr3RVScUMF81FxgrGCldYxKIJc4ucLX3z0xakml_GOxnnvwko3C6Qqj7JMUI9K7vQUUMVjI81KxktYt0AQ' + + public static didDocument(did: string, vm: string, publicKeyJwk: JsonWebKey) { + return { + id: did, + '@context': [ + 'https://www.w3.org/ns/did/v1', + { + '@base': did, + }, + ], + service: [ + { + id: '#linkedin', + type: 'linkedin', + serviceEndpoint: 'linkedin.com/in/henry-tsai-6b884014', + }, + { + id: '#github', + type: 'github', + serviceEndpoint: 'github.com/thehenrytsai', + }, + ], + verificationMethod: [ + { + id: vm, + controller: did, + type: 'JsonWebKey2020', + publicKeyJwk, + }, + ], + authentication: [vm], + assertionMethod: [vm], + } + } + + public static mockDID(did: string, vm: string, publickKeyJwk: JsonWebKey) { + nock('https://dev.uniresolver.io') + .get(`/1.0/identifiers/${did}`) + .times(100) + .reply(200, TestVectors.didDocument(did, vm, publickKeyJwk)) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-request/AuthorizationRequest.ts b/packages/siop-oid4vp/lib/authorization-request/AuthorizationRequest.ts new file mode 100644 index 00000000..552a3667 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/AuthorizationRequest.ts @@ -0,0 +1,264 @@ +import { PresentationDefinitionWithLocation } from '../authorization-response' +import { PresentationExchange } from '../authorization-response/PresentationExchange' +import { fetchByReferenceOrUseByValue, removeNullUndefined } from '../helpers' +import { authorizationRequestVersionDiscovery } from '../helpers/SIOPSpecVersion' +import { parseJWT } from '../helpers/jwtUtils' +import { RequestObject } from '../request-object' +import { + AuthorizationRequestPayload, + getJwtVerifierWithContext, + getRequestObjectJwtVerifier, + PassBy, + RequestObjectJwt, + RequestObjectPayload, + RequestStateInfo, + ResponseType, + ResponseURIType, + RPRegistrationMetadataPayload, + Schema, + SIOPErrors, + SupportedVersion, + VerifiedAuthorizationRequest, +} from '../types' + +import { assertValidAuthorizationRequestOpts, assertValidVerifyAuthorizationRequestOpts } from './Opts' +import { assertValidRPRegistrationMedataPayload, createAuthorizationRequestPayload } from './Payload' +import { URI } from './URI' +import { CreateAuthorizationRequestOpts, VerifyAuthorizationRequestOpts } from './types' + +export class AuthorizationRequest { + private readonly _requestObject?: RequestObject + private readonly _payload: AuthorizationRequestPayload + private readonly _options: CreateAuthorizationRequestOpts + private _uri: URI + + private constructor(payload: AuthorizationRequestPayload, requestObject?: RequestObject, opts?: CreateAuthorizationRequestOpts, uri?: URI) { + this._options = opts + this._payload = removeNullUndefined(payload) + this._requestObject = requestObject + this._uri = uri + } + + public static async fromUriOrJwt(jwtOrUri: string | URI): Promise { + if (!jwtOrUri) { + throw Error(SIOPErrors.NO_REQUEST) + } + return typeof jwtOrUri === 'string' && jwtOrUri.startsWith('ey') + ? await AuthorizationRequest.fromJwt(jwtOrUri) + : await AuthorizationRequest.fromURI(jwtOrUri) + } + + public static async fromPayload(payload: AuthorizationRequestPayload): Promise { + if (!payload) { + throw Error(SIOPErrors.NO_REQUEST) + } + const requestObject = await RequestObject.fromAuthorizationRequestPayload(payload) + return new AuthorizationRequest(payload, requestObject) + } + + public static async fromOpts(opts: CreateAuthorizationRequestOpts, requestObject?: RequestObject): Promise { + // todo: response_uri/redirect_uri is not hooked up from opts! + if (!opts || !opts.requestObject) { + throw Error(SIOPErrors.BAD_PARAMS) + } + assertValidAuthorizationRequestOpts(opts) + + const requestObjectArg = + opts.requestObject.passBy !== PassBy.NONE ? (requestObject ? requestObject : await RequestObject.fromOpts(opts)) : undefined + const requestPayload = opts?.payload ? await createAuthorizationRequestPayload(opts, requestObjectArg) : undefined + return new AuthorizationRequest(requestPayload, requestObjectArg, opts) + } + + get payload(): AuthorizationRequestPayload { + return this._payload + } + + get requestObject(): RequestObject | undefined { + return this._requestObject + } + + get options(): CreateAuthorizationRequestOpts | undefined { + return this._options + } + + public hasRequestObject(): boolean { + return this.requestObject !== undefined + } + + public async getSupportedVersion() { + if (this.options?.version) { + return this.options.version + } else if (this._uri?.encodedUri?.startsWith(Schema.OPENID_VC) || this._uri?.scheme?.startsWith(Schema.OPENID_VC)) { + return SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1 + } + + return (await this.getSupportedVersionsFromPayload())[0] + } + + public async getSupportedVersionsFromPayload(): Promise { + const mergedPayload = { ...this.payload, ...(await this.requestObject?.getPayload()) } + return authorizationRequestVersionDiscovery(mergedPayload) + } + + async uri(): Promise { + if (!this._uri) { + this._uri = await URI.fromAuthorizationRequest(this) + } + return this._uri + } + + /** + * Verifies a SIOP Request JWT on OP side + * + * @param opts + */ + async verify(opts: VerifyAuthorizationRequestOpts): Promise { + assertValidVerifyAuthorizationRequestOpts(opts) + + let requestObjectPayload: RequestObjectPayload + + const jwt = await this.requestObjectJwt() + const parsedJwt = jwt ? parseJWT(jwt) : undefined + + if (parsedJwt) { + requestObjectPayload = parsedJwt.payload as RequestObjectPayload + + const jwtVerifier = await getRequestObjectJwtVerifier({ ...parsedJwt, payload: requestObjectPayload }, { type: 'request-object', raw: jwt }) + const result = await opts.verifyJwtCallback(jwtVerifier, { ...parsedJwt, raw: jwt }) + if (!result) { + throw Error(SIOPErrors.ERROR_VERIFYING_SIGNATURE) + } + + // verify the verifier attestation + if (requestObjectPayload.client_id_scheme === 'verifier_attestation') { + const jwtVerifier = await getJwtVerifierWithContext(parsedJwt, { type: 'verifier-attestation' }) + const result = await opts.verifyJwtCallback(jwtVerifier, { ...parsedJwt, raw: jwt }) + if (!result) { + throw Error(SIOPErrors.ERROR_VERIFYING_SIGNATURE) + } + } + + if (this.hasRequestObject() && !this.payload.request_uri) { + // Put back the request object as that won't be present yet + this.payload.request = jwt + } + } + + // AuthorizationRequest.assertValidRequestObject(origAuthenticationRequest); + + // We use the orig request for default values, but the JWT payload contains signed request object properties + const mergedPayload = { ...this.payload, ...requestObjectPayload } + if (opts.state && mergedPayload.state !== opts.state) { + throw new Error(`${SIOPErrors.BAD_STATE} payload: ${mergedPayload.state}, supplied: ${opts.state}`) + } else if (opts.nonce && mergedPayload.nonce !== opts.nonce) { + throw new Error(`${SIOPErrors.BAD_NONCE} payload: ${mergedPayload.nonce}, supplied: ${opts.nonce}`) + } + + const registrationPropertyKey = mergedPayload['registration'] || mergedPayload['registration_uri'] ? 'registration' : 'client_metadata' + let registrationMetadataPayload: RPRegistrationMetadataPayload + if (mergedPayload[registrationPropertyKey] || mergedPayload[`${registrationPropertyKey}_uri`]) { + registrationMetadataPayload = await fetchByReferenceOrUseByValue( + mergedPayload[`${registrationPropertyKey}_uri`], + mergedPayload[registrationPropertyKey], + ) + assertValidRPRegistrationMedataPayload(registrationMetadataPayload) + // TODO: We need to do something with the metadata probably + } + // When the response_uri parameter is present, the redirect_uri Authorization Request parameter MUST NOT be present. If the redirect_uri Authorization Request parameter is present when the Response Mode is direct_post, the Wallet MUST return an invalid_request Authorization Response error. + let responseURIType: ResponseURIType + let responseURI: string + if (mergedPayload.redirect_uri && mergedPayload.response_uri) { + throw new Error(`${SIOPErrors.INVALID_REQUEST}, redirect_uri cannot be used together with response_uri`) + } else if (mergedPayload.redirect_uri) { + responseURIType = 'redirect_uri' + responseURI = mergedPayload.redirect_uri + } else if (mergedPayload.response_uri) { + responseURIType = 'response_uri' + responseURI = mergedPayload.response_uri + } else if (mergedPayload.client_id_scheme === 'redirect_uri' && mergedPayload.client_id) { + responseURIType = 'redirect_uri' + responseURI = mergedPayload.client_id + } else { + throw new Error(`${SIOPErrors.INVALID_REQUEST}, redirect_uri or response_uri is needed`) + } + + // TODO: we need to verify somewhere that if response_mode is direct_post, that the response_uri may be present, + // BUT not both redirect_uri and response_uri. What is the best place to do this? + + const presentationDefinitions = await PresentationExchange.findValidPresentationDefinitions(mergedPayload, await this.getSupportedVersion()) + return { + jwt, + payload: parsedJwt?.payload, + issuer: parsedJwt?.payload.iss, + responseURIType, + responseURI, + clientIdScheme: mergedPayload.client_id_scheme, + correlationId: opts.correlationId, + authorizationRequest: this, + verifyOpts: opts, + presentationDefinitions, + registrationMetadataPayload, + requestObject: this.requestObject, + authorizationRequestPayload: this.payload, + versions: await this.getSupportedVersionsFromPayload(), + } + } + + static async verify(requestOrUri: string, verifyOpts: VerifyAuthorizationRequestOpts) { + assertValidVerifyAuthorizationRequestOpts(verifyOpts) + const authorizationRequest = await AuthorizationRequest.fromUriOrJwt(requestOrUri) + return await authorizationRequest.verify(verifyOpts) + } + + public async requestObjectJwt(): Promise { + return await this.requestObject?.toJwt() + } + + private static async fromJwt(jwt: string): Promise { + if (!jwt) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const requestObject = await RequestObject.fromJwt(jwt) + const payload: AuthorizationRequestPayload = { ...(await requestObject.getPayload()) } as AuthorizationRequestPayload + // Although this was a RequestObject we instantiate it as AuthzRequest and then copy in the JWT as the request Object + payload.request = jwt + return new AuthorizationRequest({ ...payload }, requestObject) + } + + private static async fromURI(uri: URI | string): Promise { + if (!uri) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const uriObject = typeof uri === 'string' ? await URI.fromUri(uri) : uri + const requestObject = await RequestObject.fromJwt(uriObject.requestObjectJwt) + return new AuthorizationRequest(uriObject.authorizationRequestPayload, requestObject, undefined, uriObject) + } + + public async toStateInfo(): Promise { + const requestObject = await this.requestObject.getPayload() + return { + client_id: this.options.clientMetadata.client_id, + iat: requestObject.iat ?? this.payload.iat, + nonce: requestObject.nonce ?? this.payload.nonce, + state: this.payload.state, + } + } + + public async containsResponseType(singleType: ResponseType | string): Promise { + const responseType: string = await this.getMergedProperty('response_type') + return responseType?.includes(singleType) === true + } + + public async getMergedProperty(key: string): Promise { + const merged = await this.mergedPayloads() + return merged[key] as T + } + + public async mergedPayloads(): Promise { + return { ...this.payload, ...(this.requestObject && (await this.requestObject.getPayload())) } + } + + public async getPresentationDefinitions(version?: SupportedVersion): Promise { + return await PresentationExchange.findValidPresentationDefinitions(await this.mergedPayloads(), version) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-request/Opts.ts b/packages/siop-oid4vp/lib/authorization-request/Opts.ts new file mode 100644 index 00000000..77182ba0 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/Opts.ts @@ -0,0 +1,49 @@ +import { assertValidRequestObjectOpts } from '../request-object/Opts' +import { SIOPErrors, Verification } from '../types' + +import { assertValidRequestRegistrationOpts } from './RequestRegistration' +import { CreateAuthorizationRequestOpts, VerifyAuthorizationRequestOpts } from './types' + +export const assertValidVerifyAuthorizationRequestOpts = (opts: VerifyAuthorizationRequestOpts) => { + if (!opts || !opts.verification || !opts.verifyJwtCallback) { + throw new Error(SIOPErrors.VERIFY_BAD_PARAMS) + } + if (!opts.correlationId) { + throw new Error('No correlation id found') + } +} + +export const assertValidAuthorizationRequestOpts = (opts: CreateAuthorizationRequestOpts) => { + if (!opts || !opts.requestObject || (!opts.payload && !opts.requestObject.payload) || (opts.payload?.request_uri && !opts.requestObject.payload)) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + assertValidRequestObjectOpts(opts.requestObject, false) + assertValidRequestRegistrationOpts(opts['registration'] ? opts['registration'] : opts.clientMetadata) +} + +export const mergeVerificationOpts = ( + classOpts: { + verification?: Verification + }, + requestOpts: { + correlationId: string + verification?: Verification + }, +) => { + const presentationVerificationCallback = + requestOpts.verification?.presentationVerificationCallback ?? classOpts.verification?.presentationVerificationCallback + const replayRegistry = requestOpts.verification?.replayRegistry ?? classOpts.verification?.replayRegistry + return { + ...classOpts.verification, + ...requestOpts.verification, + ...(presentationVerificationCallback && { presentationVerificationCallback }), + ...(replayRegistry && { replayRegistry }), + revocationOpts: { + ...classOpts.verification?.revocationOpts, + ...requestOpts.verification?.revocationOpts, + revocationVerificationCallback: + requestOpts.verification?.revocationOpts?.revocationVerificationCallback ?? + classOpts?.verification?.revocationOpts?.revocationVerificationCallback, + }, + } +} diff --git a/packages/siop-oid4vp/lib/authorization-request/Payload.ts b/packages/siop-oid4vp/lib/authorization-request/Payload.ts new file mode 100644 index 00000000..e8f94619 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/Payload.ts @@ -0,0 +1,85 @@ +import { PEX } from '@sphereon/pex' + +import { getNonce, removeNullUndefined } from '../helpers' +import { RequestObject } from '../request-object' +import { isTarget, isTargetOrNoTargets } from '../rp/Opts' +import { RPRegistrationMetadataPayloadSchema } from '../schemas' +import { + AuthorizationRequestPayload, + ClaimPayloadVID1, + ClientMetadataOpts, + PassBy, + RPRegistrationMetadataPayload, + SIOPErrors, + SupportedVersion, +} from '../types' + +import { createRequestRegistration } from './RequestRegistration' +import { ClaimPayloadOptsVID1, CreateAuthorizationRequestOpts, PropertyTarget } from './types' + +export const createPresentationDefinitionClaimsProperties = (opts: ClaimPayloadOptsVID1): ClaimPayloadVID1 => { + if (!opts || !opts.vp_token || (!opts.vp_token.presentation_definition && !opts.vp_token.presentation_definition_uri)) { + return undefined + } + const discoveryResult = PEX.definitionVersionDiscovery(opts.vp_token.presentation_definition) + if (discoveryResult.error) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID) + } + + return { + ...(opts.id_token ? { id_token: opts.id_token } : {}), + ...((opts.vp_token.presentation_definition || opts.vp_token.presentation_definition_uri) && { + vp_token: { + ...(!opts.vp_token.presentation_definition_uri && { presentation_definition: opts.vp_token.presentation_definition }), + ...(opts.vp_token.presentation_definition_uri && { presentation_definition_uri: opts.vp_token.presentation_definition_uri }), + }, + }), + } +} + +export const createAuthorizationRequestPayload = async ( + opts: CreateAuthorizationRequestOpts, + requestObject?: RequestObject, +): Promise => { + const payload = opts.payload + const state = payload?.state ?? undefined + const nonce = payload?.nonce ? getNonce(state, payload.nonce) : undefined + // TODO: if opts['registration] throw Error to get rid of test code using that key + const clientMetadata = opts['registration'] ? opts['registration'] : (opts.clientMetadata as ClientMetadataOpts) + const registration = await createRequestRegistration(clientMetadata, opts) + const claims = opts.version >= SupportedVersion.SIOPv2_ID1 ? opts.payload.claims : createPresentationDefinitionClaimsProperties(opts.payload.claims) + const isRequestTarget = isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, opts.requestObject.targets) + const isRequestByValue = opts.requestObject.passBy === PassBy.VALUE + + if (isRequestTarget && isRequestByValue && !requestObject) { + throw Error(SIOPErrors.NO_JWT) + } + const request = isRequestByValue ? await requestObject.toJwt() : undefined + + const authRequestPayload = { + ...payload, + //TODO implement /.well-known/openid-federation support in the OP side to resolve the client_id (URL) and retrieve the metadata + ...(isRequestTarget && opts.requestObject.passBy === PassBy.REFERENCE ? { request_uri: opts.requestObject.reference_uri } : {}), + ...(isRequestTarget && isRequestByValue && { request }), + ...(nonce && { nonce }), + ...(state && { state }), + ...(registration.payload && isTarget(PropertyTarget.AUTHORIZATION_REQUEST, registration.clientMetadataOpts.targets) ? registration.payload : {}), + ...(claims && { claims }), + } + + return removeNullUndefined(authRequestPayload) +} + +export const assertValidRPRegistrationMedataPayload = (regObj: RPRegistrationMetadataPayload) => { + if (regObj) { + const valid = RPRegistrationMetadataPayloadSchema(regObj) + if (!valid) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + throw new Error('Registration data validation error: ' + JSON.stringify(RPRegistrationMetadataPayloadSchema.errors)) + } + } + if (regObj?.subject_syntax_types_supported && regObj.subject_syntax_types_supported.length == 0) { + throw new Error(`${SIOPErrors.VERIFY_BAD_PARAMS}`) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-request/RequestRegistration.ts b/packages/siop-oid4vp/lib/authorization-request/RequestRegistration.ts new file mode 100644 index 00000000..5915201c --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/RequestRegistration.ts @@ -0,0 +1,101 @@ +import { LanguageTagUtils, removeNullUndefined } from '../helpers' +import { + ClientMetadataOpts, + PassBy, + RequestClientMetadataPayloadProperties, + RequestRegistrationPayloadProperties, + RPRegistrationMetadataOpts, + RPRegistrationMetadataPayload, + SIOPErrors, + SupportedVersion, +} from '../types' + +import { CreateAuthorizationRequestOpts } from './types' + +/*const ajv = new Ajv({ allowUnionTypes: true, strict: false }); +const validateRPRegistrationMetadata = ajv.compile(RPRegistrationMetadataPayloadSchema);*/ + +export const assertValidRequestRegistrationOpts = (opts: ClientMetadataOpts) => { + if (!opts) { + throw new Error(SIOPErrors.REGISTRATION_NOT_SET) + } else if (opts.passBy !== PassBy.REFERENCE && opts.passBy !== PassBy.VALUE) { + throw new Error(SIOPErrors.REGISTRATION_OBJECT_TYPE_NOT_SET) + } else if (opts.passBy === PassBy.REFERENCE && !opts.reference_uri) { + throw new Error(SIOPErrors.NO_REFERENCE_URI) + } +} + +const createRequestRegistrationPayload = async ( + opts: ClientMetadataOpts, + metadataPayload: RPRegistrationMetadataPayload, + version: SupportedVersion, +): Promise => { + assertValidRequestRegistrationOpts(opts) + + if (opts.passBy == PassBy.VALUE) { + if (version >= SupportedVersion.SIOPv2_D11.valueOf()) { + return { client_metadata: removeNullUndefined(metadataPayload) } + } else { + return { registration: removeNullUndefined(metadataPayload) } + } + } else { + if (version >= SupportedVersion.SIOPv2_D11.valueOf()) { + return { + client_metadata_uri: opts.reference_uri, + } + } else { + return { + registration_uri: opts.reference_uri, + } + } + } +} + +export const createRequestRegistration = async ( + clientMetadataOpts: ClientMetadataOpts, + createRequestOpts: CreateAuthorizationRequestOpts, +): Promise<{ + payload: RequestRegistrationPayloadProperties | RequestClientMetadataPayloadProperties + metadata: RPRegistrationMetadataPayload + createRequestOpts: CreateAuthorizationRequestOpts + clientMetadataOpts: ClientMetadataOpts +}> => { + const metadata = createRPRegistrationMetadataPayload(clientMetadataOpts) + const payload = await createRequestRegistrationPayload(clientMetadataOpts, metadata, createRequestOpts.version) + return { + payload, + metadata, + createRequestOpts, + clientMetadataOpts, + } +} + +const createRPRegistrationMetadataPayload = (opts: RPRegistrationMetadataOpts): RPRegistrationMetadataPayload => { + const rpRegistrationMetadataPayload = { + id_token_signing_alg_values_supported: opts.idTokenSigningAlgValuesSupported, + request_object_signing_alg_values_supported: opts.requestObjectSigningAlgValuesSupported, + response_types_supported: opts.responseTypesSupported, + scopes_supported: opts.scopesSupported, + subject_types_supported: opts.subjectTypesSupported, + subject_syntax_types_supported: opts.subject_syntax_types_supported || ['did:web:', 'did:ion:'], + vp_formats: opts.vpFormatsSupported, + client_name: opts.clientName, + logo_uri: opts.logo_uri, + tos_uri: opts.tos_uri, + client_purpose: opts.clientPurpose, + client_id: opts.client_id, + } + + const languageTagEnabledFieldsNamesMapping = new Map() + languageTagEnabledFieldsNamesMapping.set('clientName', 'client_name') + languageTagEnabledFieldsNamesMapping.set('clientPurpose', 'client_purpose') + + const languageTaggedFields: Map = LanguageTagUtils.getLanguageTaggedPropertiesMapped(opts, languageTagEnabledFieldsNamesMapping) + + languageTaggedFields.forEach((value: string, key: string) => { + const _key = key as keyof typeof rpRegistrationMetadataPayload + rpRegistrationMetadataPayload[_key] = value + }) + + return removeNullUndefined(rpRegistrationMetadataPayload) +} diff --git a/packages/siop-oid4vp/lib/authorization-request/URI.ts b/packages/siop-oid4vp/lib/authorization-request/URI.ts new file mode 100644 index 00000000..8e381e94 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/URI.ts @@ -0,0 +1,273 @@ +import { PresentationExchange } from '../authorization-response/PresentationExchange' +import { decodeUriAsJson, encodeJsonAsURI, fetchByReferenceOrUseByValue } from '../helpers' +import { parseJWT } from '../helpers/jwtUtils' +import { assertValidRequestObjectPayload, RequestObject } from '../request-object' +import { + AuthorizationRequestPayload, + AuthorizationRequestURI, + ObjectBy, + PassBy, + RequestObjectJwt, + RequestObjectPayload, + RPRegistrationMetadataPayload, + SIOPErrors, + SupportedVersion, + UrlEncodingFormat, +} from '../types' + +import { AuthorizationRequest } from './AuthorizationRequest' +import { assertValidRPRegistrationMedataPayload } from './Payload' +import { CreateAuthorizationRequestOpts } from './types' + +export class URI implements AuthorizationRequestURI { + private readonly _scheme: string + private readonly _requestObjectJwt: RequestObjectJwt | undefined + private readonly _authorizationRequestPayload: AuthorizationRequestPayload + private readonly _encodedUri: string // The encoded URI + private readonly _encodingFormat: UrlEncodingFormat + // private _requestObjectBy: ObjectBy; + + private _registrationMetadataPayload: RPRegistrationMetadataPayload + + private constructor({ scheme, encodedUri, encodingFormat, authorizationRequestPayload, requestObjectJwt }: Partial) { + this._scheme = scheme + this._encodedUri = encodedUri + this._encodingFormat = encodingFormat + this._authorizationRequestPayload = authorizationRequestPayload + this._requestObjectJwt = requestObjectJwt + } + + public static async fromUri(uri: string): Promise { + if (!uri) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const { scheme, requestObjectJwt, authorizationRequestPayload, registrationMetadata } = await URI.parseAndResolve(uri) + const requestObjectPayload = requestObjectJwt ? (parseJWT(requestObjectJwt).payload as RequestObjectPayload) : undefined + if (requestObjectPayload) { + assertValidRequestObjectPayload(requestObjectPayload) + } + + const result = new URI({ + scheme, + encodingFormat: UrlEncodingFormat.FORM_URL_ENCODED, + encodedUri: uri, + authorizationRequestPayload, + requestObjectJwt, + }) + result._registrationMetadataPayload = registrationMetadata + return result + } + + /** + * Create a signed URL encoded URI with a signed SIOP request token on RP side + * + * @param opts Request input data to build a SIOP Request Token + * @remarks This method is used to generate a SIOP request with info provided by the RP. + * First it generates the request payload and then it creates the signed JWT, which is returned as a URI + * + * Normally you will want to use this method to create the request. + */ + public static async fromOpts(opts: CreateAuthorizationRequestOpts): Promise { + if (!opts) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const authorizationRequest = await AuthorizationRequest.fromOpts(opts) + return await URI.fromAuthorizationRequest(authorizationRequest) + } + + public async toAuthorizationRequest(): Promise { + return await AuthorizationRequest.fromUriOrJwt(this) + } + + get requestObjectBy(): ObjectBy { + if (!this.requestObjectJwt) { + return { passBy: PassBy.NONE } + } + if (this.authorizationRequestPayload.request_uri) { + return { passBy: PassBy.REFERENCE, reference_uri: this.authorizationRequestPayload.request_uri } + } + return { passBy: PassBy.VALUE } + } + + get metadataObjectBy(): ObjectBy { + if (!this.authorizationRequestPayload.registration_uri && !this.authorizationRequestPayload.registration) { + return { passBy: PassBy.NONE } + } + if (this.authorizationRequestPayload.registration_uri) { + return { passBy: PassBy.REFERENCE, reference_uri: this.authorizationRequestPayload.registration_uri } + } + return { passBy: PassBy.VALUE } + } + + /** + * Create a URI from the request object, typically you will want to use the createURI version! + * + * @remarks This method is used to generate a SIOP request Object with info provided by the RP. + * First it generates the request object payload, and then it creates the signed JWT. + * + * Please note that the createURI method allows you to differentiate between OAuth2 and OpenID parameters that become + * part of the URI and which become part of the Request Object. If you generate a URI based upon the result of this method, + * the URI will be constructed based on the Request Object only! + */ + static async fromRequestObject(requestObject: RequestObject): Promise { + if (!requestObject) { + throw Error(SIOPErrors.BAD_PARAMS) + } + return await URI.fromAuthorizationRequestPayload(requestObject.options, await AuthorizationRequest.fromUriOrJwt(await requestObject.toJwt())) + } + + static async fromAuthorizationRequest(authorizationRequest: AuthorizationRequest): Promise { + if (!authorizationRequest) { + throw Error(SIOPErrors.BAD_PARAMS) + } + return await URI.fromAuthorizationRequestPayload( + { + ...authorizationRequest.options.requestObject, + version: authorizationRequest.options.version, + uriScheme: authorizationRequest.options.uriScheme, + }, + authorizationRequest.payload, + authorizationRequest.requestObject, + ) + } + + /** + * Creates an URI Request + * @param opts Options to define the Uri Request + * @param authorizationRequestPayload + * + */ + private static async fromAuthorizationRequestPayload( + opts: { uriScheme?: string; passBy: PassBy; reference_uri?: string; version?: SupportedVersion }, + authorizationRequestPayload: AuthorizationRequestPayload, + requestObject?: RequestObject, + ): Promise { + if (!authorizationRequestPayload) { + if (!requestObject || !(await requestObject.getPayload())) { + throw Error(SIOPErrors.BAD_PARAMS) + } + authorizationRequestPayload = {} // No auth request payload, so the eventual URI will contain a `request_uri` or `request` value only + } + + const isJwt = typeof authorizationRequestPayload === 'string' + const requestObjectJwt = requestObject + ? await requestObject.toJwt() + : typeof authorizationRequestPayload === 'string' + ? authorizationRequestPayload + : authorizationRequestPayload.request + + if (isJwt && (!requestObjectJwt || !requestObjectJwt.startsWith('ey'))) { + throw Error(SIOPErrors.NO_JWT) + } + const requestObjectPayload: RequestObjectPayload = requestObjectJwt ? (parseJWT(requestObjectJwt).payload as RequestObjectPayload) : undefined + + if (requestObjectPayload) { + // Only used to validate if the request object contains presentation definition(s) + await PresentationExchange.findValidPresentationDefinitions({ ...authorizationRequestPayload, ...requestObjectPayload }) + + assertValidRequestObjectPayload(requestObjectPayload) + if (requestObjectPayload.registration) { + assertValidRPRegistrationMedataPayload(requestObjectPayload.registration) + } + } + const uniformAuthorizationRequestPayload: AuthorizationRequestPayload = + typeof authorizationRequestPayload === 'string' ? (requestObjectPayload as AuthorizationRequestPayload) : authorizationRequestPayload + if (!uniformAuthorizationRequestPayload) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const type = opts.passBy + if (!type) { + throw new Error(SIOPErrors.REQUEST_OBJECT_TYPE_NOT_SET) + } + const authorizationRequest = await AuthorizationRequest.fromUriOrJwt(requestObjectJwt) + + let scheme + if (opts.uriScheme) { + scheme = opts.uriScheme.endsWith('://') ? opts.uriScheme : `${opts.uriScheme}://` + } else if (opts.version) { + if (opts.version === SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1) { + scheme = 'openid-vc://' + } else { + scheme = 'openid://' + } + } else { + try { + scheme = (await authorizationRequest.getSupportedVersion()) === SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1 ? 'openid-vc://' : 'openid://' + } catch (error: unknown) { + scheme = 'openid://' + } + } + + if (type === PassBy.REFERENCE) { + if (!opts.reference_uri) { + throw new Error(SIOPErrors.NO_REFERENCE_URI) + } + uniformAuthorizationRequestPayload.request_uri = opts.reference_uri + delete uniformAuthorizationRequestPayload.request + } else if (type === PassBy.VALUE) { + uniformAuthorizationRequestPayload.request = requestObjectJwt + delete uniformAuthorizationRequestPayload.request_uri + } + return new URI({ + scheme, + encodedUri: `${scheme}?${encodeJsonAsURI(uniformAuthorizationRequestPayload)}`, + encodingFormat: UrlEncodingFormat.FORM_URL_ENCODED, + // requestObjectBy: opts.requestBy, + authorizationRequestPayload: uniformAuthorizationRequestPayload, + requestObjectJwt: requestObjectJwt, + }) + } + + /** + * Create a Authentication Request Payload from a URI string + * + * @param uri + */ + public static parse(uri: string): { scheme: string; authorizationRequestPayload: AuthorizationRequestPayload } { + if (!uri) { + throw Error(SIOPErrors.BAD_PARAMS) + } + // We strip the uri scheme before passing it to the decode function + const scheme: string = uri.match(/^([a-zA-Z][a-zA-Z0-9-_]*:\/\/)/g)[0] + const authorizationRequestPayload = decodeUriAsJson(uri) as AuthorizationRequestPayload + return { scheme, authorizationRequestPayload } + } + + public static async parseAndResolve(uri: string) { + if (!uri) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const { authorizationRequestPayload, scheme } = this.parse(uri) + const requestObjectJwt = await fetchByReferenceOrUseByValue(authorizationRequestPayload.request_uri, authorizationRequestPayload.request, true) + const registrationMetadata: RPRegistrationMetadataPayload = await fetchByReferenceOrUseByValue( + authorizationRequestPayload['client_metadata_uri'] ?? authorizationRequestPayload['registration_uri'], + authorizationRequestPayload['client_metadata'] ?? authorizationRequestPayload['registration'], + ) + assertValidRPRegistrationMedataPayload(registrationMetadata) + return { scheme, authorizationRequestPayload, requestObjectJwt, registrationMetadata } + } + + get encodingFormat(): UrlEncodingFormat { + return this._encodingFormat + } + + get encodedUri(): string { + return this._encodedUri + } + + get authorizationRequestPayload(): AuthorizationRequestPayload { + return this._authorizationRequestPayload + } + + get requestObjectJwt(): RequestObjectJwt | undefined { + return this._requestObjectJwt + } + + get scheme(): string { + return this._scheme + } + + get registrationMetadataPayload(): RPRegistrationMetadataPayload { + return this._registrationMetadataPayload + } +} diff --git a/packages/siop-oid4vp/lib/authorization-request/index.ts b/packages/siop-oid4vp/lib/authorization-request/index.ts new file mode 100644 index 00000000..a1908da9 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/index.ts @@ -0,0 +1,4 @@ +export * from './AuthorizationRequest' +export * from './types' +export * from './Payload' +export * from './URI' diff --git a/packages/siop-oid4vp/lib/authorization-request/types.ts b/packages/siop-oid4vp/lib/authorization-request/types.ts new file mode 100644 index 00000000..e87cc73a --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-request/types.ts @@ -0,0 +1,100 @@ +import { Hasher } from '@sphereon/ssi-types' + +import { PresentationDefinitionPayloadOpts } from '../authorization-response' +import { RequestObjectOpts } from '../request-object' +import { + ClientIdScheme, + ClientMetadataOpts, + IdTokenClaimPayload, + ResponseMode, + ResponseType, + Schema, + Scope, + SigningAlgo, + SubjectType, + SupportedVersion, + Verification, +} from '../types' +import { VerifyJwtCallback } from '../types/JwtVerifier' + +export interface ClaimPayloadOptsVID1 extends ClaimPayloadCommonOpts { + id_token?: IdTokenClaimPayload + vp_token?: PresentationDefinitionPayloadOpts +} + +export interface ClaimPayloadCommonOpts { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface AuthorizationRequestPayloadOpts extends Partial> { + request_uri?: string // The Request object payload if provided by reference + // Note we do not list the request property here, as the lib constructs the value, and we do not want people to pass that value in directly as it will lead to people not understanding why things fail +} +export interface RequestObjectPayloadOpts { + scope: string // from openid-connect-self-issued-v2-1_0-ID1 + response_type: string // from openid-connect-self-issued-v2-1_0-ID1 + client_id: string // from openid-connect-self-issued-v2-1_0-ID1 + client_id_scheme?: ClientIdScheme + redirect_uri?: string // from openid-connect-self-issued-v2-1_0-ID1 + response_uri?: string // from openid-connect-self-issued-v2-1_0-D18 // either response uri or redirect uri + id_token_hint?: string // from openid-connect-self-issued-v2-1_0-ID1 + claims?: CT // from openid-connect-self-issued-v2-1_0-ID1 look at https://openid.net/specs/openid-connect-core-1_0.html#Claims + nonce?: string // An optional nonce, will be generated if not provided + state?: string // An optional state, will be generated if not provided + authorization_endpoint?: string + response_mode?: ResponseMode // How the URI should be returned. This is not being used by the library itself, allows an implementor to make a decision + response_types_supported?: ResponseType[] | ResponseType + scopes_supported?: Scope[] | Scope + subject_types_supported?: SubjectType[] | SubjectType + request_object_signing_alg_values_supported?: SigningAlgo[] | SigningAlgo + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +interface AuthorizationRequestCommonOpts { + // Yes, this includes common payload properties both at the payload level as well as in the requestObject.payload property. That is to support OAuth2 with or without a signed OpenID requestObject + + version: SupportedVersion + clientMetadata?: ClientMetadataOpts // this maps to 'registration' for older SIOPv2 specs! OPTIONAL. This parameter is used by the RP to provide information about itself to a Self-Issued OP that would normally be provided to an OP during Dynamic RP Registration, as specified in {#rp-registration-parameter}. + payload?: AuthorizationRequestPayloadOpts + requestObject: RequestObjectOpts + uriScheme?: Schema | string // Use a custom scheme for the URI. By default openid:// will be used +} + +export type AuthorizationRequestOptsVID1 = AuthorizationRequestCommonOpts + +export interface AuthorizationRequestOptsVD11 extends AuthorizationRequestCommonOpts { + idTokenType?: string // OPTIONAL. Space-separated string that specifies the types of ID token the RP wants to obtain, with the values appearing in order of preference. The allowed individual values are subject_signed and attester_signed (see Section 8.2). The default value is attester_signed. +} + +export type CreateAuthorizationRequestOpts = AuthorizationRequestOptsVID1 | AuthorizationRequestOptsVD11 + +export interface VerifyAuthorizationRequestOpts { + correlationId: string + verification: Verification + verifyJwtCallback: VerifyJwtCallback + nonce?: string // If provided the nonce in the request needs to match + state?: string // If provided the state in the request needs to match + supportedVersions?: SupportedVersion[] + hasher?: Hasher +} + +/** + * Determines where a property will end up. Methods that support this argument are optional. If you do not provide any value it will default to all targets. + */ +export enum PropertyTarget { + // The property will end up in the oAuth2 authorization request + AUTHORIZATION_REQUEST = 'authorization-request', + + // OpenID Request Object (the JWT) + REQUEST_OBJECT = 'request-object', +} + +export type PropertyTargets = PropertyTarget | PropertyTarget[] + +export interface RequestPropertyWithTargets { + targets?: PropertyTargets + propertyValue: T +} diff --git a/packages/siop-oid4vp/lib/authorization-response/AuthorizationResponse.ts b/packages/siop-oid4vp/lib/authorization-response/AuthorizationResponse.ts new file mode 100644 index 00000000..6ff45798 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/AuthorizationResponse.ts @@ -0,0 +1,227 @@ +import { Hasher } from '@sphereon/ssi-types' + +import { AuthorizationRequest, VerifyAuthorizationRequestOpts } from '../authorization-request' +import { assertValidVerifyAuthorizationRequestOpts } from '../authorization-request/Opts' +import { IDToken } from '../id-token' +import { AuthorizationResponsePayload, ResponseType, SIOPErrors, VerifiedAuthorizationRequest, VerifiedAuthorizationResponse } from '../types' + +import { assertValidVerifiablePresentations, extractPresentationsFromAuthorizationResponse, verifyPresentations } from './OpenID4VP' +import { assertValidResponseOpts } from './Opts' +import { createResponsePayload } from './Payload' +import { AuthorizationResponseOpts, PresentationDefinitionWithLocation, VerifyAuthorizationResponseOpts } from './types' + +export class AuthorizationResponse { + private readonly _authorizationRequest?: AuthorizationRequest | undefined + // private _requestObject?: RequestObject | undefined + private readonly _idToken?: IDToken + private readonly _payload: AuthorizationResponsePayload + + private readonly _options?: AuthorizationResponseOpts + + private constructor({ + authorizationResponsePayload, + idToken, + responseOpts, + authorizationRequest, + }: { + authorizationResponsePayload: AuthorizationResponsePayload + idToken?: IDToken + responseOpts?: AuthorizationResponseOpts + authorizationRequest?: AuthorizationRequest + }) { + this._authorizationRequest = authorizationRequest + this._options = responseOpts + this._idToken = idToken + this._payload = authorizationResponsePayload + } + + /** + * Creates a SIOP Response Object + * + * @param requestObject + * @param responseOpts + * @param verifyOpts + */ + static async fromRequestObject( + requestObject: string, + responseOpts: AuthorizationResponseOpts, + verifyOpts: VerifyAuthorizationRequestOpts, + ): Promise { + assertValidVerifyAuthorizationRequestOpts(verifyOpts) + assertValidResponseOpts(responseOpts) + if (!requestObject || !requestObject.startsWith('ey')) { + throw new Error(SIOPErrors.NO_JWT) + } + const authorizationRequest = await AuthorizationRequest.fromUriOrJwt(requestObject) + return AuthorizationResponse.fromAuthorizationRequest(authorizationRequest, responseOpts, verifyOpts) + } + + static async fromPayload( + authorizationResponsePayload: AuthorizationResponsePayload, + responseOpts?: AuthorizationResponseOpts, + ): Promise { + if (!authorizationResponsePayload) { + throw new Error(SIOPErrors.NO_RESPONSE) + } + + if (responseOpts) { + assertValidResponseOpts(responseOpts) + } + const idToken = authorizationResponsePayload.id_token ? await IDToken.fromIDToken(authorizationResponsePayload.id_token) : undefined + return new AuthorizationResponse({ + authorizationResponsePayload, + idToken, + responseOpts, + }) + } + + static async fromAuthorizationRequest( + authorizationRequest: AuthorizationRequest, + responseOpts: AuthorizationResponseOpts, + verifyOpts: VerifyAuthorizationRequestOpts, + ): Promise { + assertValidResponseOpts(responseOpts) + if (!authorizationRequest) { + throw new Error(SIOPErrors.NO_REQUEST) + } + const verifiedRequest = await authorizationRequest.verify(verifyOpts) + return await AuthorizationResponse.fromVerifiedAuthorizationRequest(verifiedRequest, responseOpts, verifyOpts) + } + + static async fromVerifiedAuthorizationRequest( + verifiedAuthorizationRequest: VerifiedAuthorizationRequest, + responseOpts: AuthorizationResponseOpts, + verifyOpts: VerifyAuthorizationRequestOpts, + ): Promise { + assertValidResponseOpts(responseOpts) + if (!verifiedAuthorizationRequest) { + throw new Error(SIOPErrors.NO_REQUEST) + } + + const authorizationRequest = verifiedAuthorizationRequest.authorizationRequest + + // const merged = verifiedAuthorizationRequest.authorizationRequest.requestObject, verifiedAuthorizationRequest.requestObject); + // const presentationDefinitions = await PresentationExchange.findValidPresentationDefinitions(merged, await authorizationRequest.getSupportedVersion()); + const presentationDefinitions = JSON.parse( + JSON.stringify(verifiedAuthorizationRequest.presentationDefinitions), + ) as PresentationDefinitionWithLocation[] + const wantsIdToken = await authorizationRequest.containsResponseType(ResponseType.ID_TOKEN) + const hasVpToken = await authorizationRequest.containsResponseType(ResponseType.VP_TOKEN) + + const idToken = wantsIdToken ? await IDToken.fromVerifiedAuthorizationRequest(verifiedAuthorizationRequest, responseOpts) : undefined + const idTokenPayload = idToken ? await idToken.payload() : undefined + const authorizationResponsePayload = await createResponsePayload(authorizationRequest, responseOpts, idTokenPayload) + const response = new AuthorizationResponse({ + authorizationResponsePayload, + idToken, + responseOpts, + authorizationRequest, + }) + + if (hasVpToken) { + const wrappedPresentations = await extractPresentationsFromAuthorizationResponse(response, { + hasher: verifyOpts.hasher, + }) + + await assertValidVerifiablePresentations({ + presentationDefinitions, + presentations: wrappedPresentations, + verificationCallback: verifyOpts.verification.presentationVerificationCallback, + opts: { + ...responseOpts.presentationExchange, + hasher: verifyOpts.hasher, + }, + }) + } + + return response + } + + public async verify(verifyOpts: VerifyAuthorizationResponseOpts): Promise { + // Merge payloads checks for inconsistencies in properties which are present in both the auth request and request object + const merged = await this.mergedPayloads({ + consistencyCheck: true, + hasher: verifyOpts.hasher, + }) + if (verifyOpts.state && merged.state !== verifyOpts.state) { + throw Error(SIOPErrors.BAD_STATE) + } + + const verifiedIdToken = await this.idToken?.verify(verifyOpts) + const oid4vp = await verifyPresentations(this, verifyOpts) + + // Gather all nonces + const allNonces = new Set() + if (oid4vp) allNonces.add(oid4vp.nonce) + if (verifiedIdToken) allNonces.add(verifiedIdToken.payload.nonce) + if (merged.nonce) allNonces.add(merged.nonce) + + const firstNonce = Array.from(allNonces)[0] + if (allNonces.size !== 1 || typeof firstNonce !== 'string') { + throw new Error('both id token and VPs in vp token if present must have a nonce, and all nonces must be the same') + } + if (verifyOpts.nonce && firstNonce !== verifyOpts.nonce) { + throw Error(SIOPErrors.BAD_NONCE) + } + + const state = merged.state ?? verifiedIdToken?.payload.state + if (!state) { + throw Error('State is required') + } + + return { + authorizationResponse: this, + verifyOpts, + nonce: firstNonce, + state, + correlationId: verifyOpts.correlationId, + ...(this.idToken && { idToken: verifiedIdToken }), + ...(oid4vp && { oid4vpSubmission: oid4vp }), + } + } + + get authorizationRequest(): AuthorizationRequest | undefined { + return this._authorizationRequest + } + + get payload(): AuthorizationResponsePayload { + return this._payload + } + + get options(): AuthorizationResponseOpts | undefined { + return this._options + } + + get idToken(): IDToken | undefined { + return this._idToken + } + + public async getMergedProperty(key: string, opts?: { consistencyCheck?: boolean; hasher?: Hasher }): Promise { + const merged = await this.mergedPayloads(opts) + return merged[key] as T + } + + public async mergedPayloads(opts?: { consistencyCheck?: boolean; hasher?: Hasher }): Promise { + let nonce: string | undefined = this._payload.nonce + if (this._payload?.vp_token) { + const presentations = await extractPresentationsFromAuthorizationResponse(this, opts) + // We do not verify them, as that is done elsewhere. So we simply can take the first nonce + if (!nonce) { + nonce = presentations[0].decoded.nonce + } + } + const idTokenPayload = await this.idToken?.payload() + if (opts?.consistencyCheck !== false && idTokenPayload) { + Object.entries(idTokenPayload).forEach((entry) => { + if (typeof entry[0] === 'string' && this.payload[entry[0]] && this.payload[entry[0]] !== entry[1]) { + throw Error(`Mismatch in Authorization Request and Request object value for ${entry[0]}`) + } + }) + } + if (!nonce && this._idToken) { + nonce = (await this._idToken.payload()).nonce + } + + return { ...this.payload, ...idTokenPayload, nonce } + } +} diff --git a/packages/siop-oid4vp/lib/authorization-response/OpenID4VP.ts b/packages/siop-oid4vp/lib/authorization-response/OpenID4VP.ts new file mode 100644 index 00000000..043e4b02 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/OpenID4VP.ts @@ -0,0 +1,306 @@ +import { IPresentationDefinition, PEX } from '@sphereon/pex' +import { Format } from '@sphereon/pex-models' +import { + CredentialMapper, + Hasher, + IVerifiablePresentation, + PresentationSubmission, + W3CVerifiablePresentation, + WrappedVerifiablePresentation, +} from '@sphereon/ssi-types' + +import { AuthorizationRequest } from '../authorization-request' +import { verifyRevocation } from '../helpers' +import { parseJWT } from '../helpers/jwtUtils' +import { + AuthorizationResponsePayload, + IDTokenPayload, + ResponseType, + RevocationVerification, + SIOPErrors, + SupportedVersion, + VerifiedOpenID4VPSubmission, +} from '../types' + +import { AuthorizationResponse } from './AuthorizationResponse' +import { PresentationExchange } from './PresentationExchange' +import { + AuthorizationResponseOpts, + PresentationDefinitionWithLocation, + PresentationVerificationCallback, + VerifyAuthorizationResponseOpts, + VPTokenLocation, +} from './types' + +function extractNonceFromWrappedVerifiablePresentation(wrappedVp: WrappedVerifiablePresentation): string | undefined { + // SD-JWT uses kb-jwt for the nonce + if (CredentialMapper.isWrappedSdJwtVerifiablePresentation(wrappedVp)) { + // TODO: replace this once `kbJwt.payload` is available on the decoded sd-jwt (pr in ssi-sdk) + // If it doesn't end with ~, it contains a kbJwt + if (!wrappedVp.presentation.compactSdJwtVc.endsWith('~')) { + const kbJwt = wrappedVp.presentation.compactSdJwtVc.split('~').pop() + + const { payload } = parseJWT(kbJwt) + + return payload.nonce + } + + // No kb-jwt means no nonce (error will be handled later) + return undefined + } + + if (wrappedVp.format === 'jwt_vp') { + return wrappedVp.decoded.nonce + } + + // For LDP-VP a challenge is also fine + if (wrappedVp.format === 'ldp_vp') { + const w3cPresentation = wrappedVp.decoded as IVerifiablePresentation + const proof = Array.isArray(w3cPresentation.proof) ? w3cPresentation.proof[0] : w3cPresentation.proof + + return proof.nonce ?? proof.challenge + } + + return undefined +} + +export const verifyPresentations = async ( + authorizationResponse: AuthorizationResponse, + verifyOpts: VerifyAuthorizationResponseOpts, +): Promise => { + const presentations = await extractPresentationsFromAuthorizationResponse(authorizationResponse, { hasher: verifyOpts.hasher }) + const presentationDefinitions = verifyOpts.presentationDefinitions + ? Array.isArray(verifyOpts.presentationDefinitions) + ? verifyOpts.presentationDefinitions + : [verifyOpts.presentationDefinitions] + : [] + let idPayload: IDTokenPayload | undefined + if (authorizationResponse.idToken) { + idPayload = await authorizationResponse.idToken.payload() + } + // todo: Probably wise to check against request for the location of the submission_data + const presentationSubmission = idPayload?._vp_token?.presentation_submission ?? authorizationResponse.payload.presentation_submission + + await assertValidVerifiablePresentations({ + presentationDefinitions, + presentations, + verificationCallback: verifyOpts.verification.presentationVerificationCallback, + opts: { + presentationSubmission, + restrictToFormats: verifyOpts.restrictToFormats, + restrictToDIDMethods: verifyOpts.restrictToDIDMethods, + hasher: verifyOpts.hasher, + }, + }) + + // If there are no presentations, and the `assertValidVerifiablePresentations` did not fail + // it means there's no oid4vp response and also not requested + if (presentations.length === 0) { + return null + } + + const nonces = new Set(presentations.map(extractNonceFromWrappedVerifiablePresentation)) + if (presentations.length > 0 && nonces.size !== 1) { + throw Error(`${nonces.size} nonce values found for ${presentations.length}. Should be 1`) + } + + // Nonce may be undefined + const nonce = Array.from(nonces)[0] + if (typeof nonce !== 'string') { + throw new Error('Expected all presentations to contain a nonce value') + } + + const revocationVerification = verifyOpts.verification?.revocationOpts + ? verifyOpts.verification.revocationOpts.revocationVerification + : RevocationVerification.IF_PRESENT + if (revocationVerification !== RevocationVerification.NEVER) { + if (!verifyOpts.verification.revocationOpts?.revocationVerificationCallback) { + throw Error(`Please provide a revocation callback as revocation checking of credentials and presentations is not disabled`) + } + for (const vp of presentations) { + await verifyRevocation(vp, verifyOpts.verification.revocationOpts.revocationVerificationCallback, revocationVerification) + } + } + return { nonce, presentations, presentationDefinitions, submissionData: presentationSubmission } +} + +export const extractPresentationsFromAuthorizationResponse = async ( + response: AuthorizationResponse, + opts?: { hasher?: Hasher }, +): Promise => { + const wrappedVerifiablePresentations: WrappedVerifiablePresentation[] = [] + if (response.payload.vp_token) { + const presentations = Array.isArray(response.payload.vp_token) ? response.payload.vp_token : [response.payload.vp_token] + for (const presentation of presentations) { + wrappedVerifiablePresentations.push(CredentialMapper.toWrappedVerifiablePresentation(presentation, { hasher: opts?.hasher })) + } + } + return wrappedVerifiablePresentations +} + +export const createPresentationSubmission = async ( + verifiablePresentations: W3CVerifiablePresentation[], + opts?: { presentationDefinitions: (PresentationDefinitionWithLocation | IPresentationDefinition)[] }, +): Promise => { + let submission_data: PresentationSubmission + for (const verifiablePresentation of verifiablePresentations) { + const wrappedPresentation = CredentialMapper.toWrappedVerifiablePresentation(verifiablePresentation) + + let submission: PresentationSubmission | undefined = + CredentialMapper.isWrappedW3CVerifiablePresentation(wrappedPresentation) && + (wrappedPresentation.presentation.presentation_submission ?? + wrappedPresentation.decoded.presentation_submission ?? + (typeof wrappedPresentation.original !== 'string' && wrappedPresentation.original.presentation_submission)) + if (typeof submission === 'string') { + submission = JSON.parse(submission) + } + if (!submission && opts?.presentationDefinitions) { + console.log(`No submission_data in VPs and not provided. Will try to deduce, but it is better to create the submission data beforehand`) + for (const definitionOpt of opts.presentationDefinitions) { + const definition = 'definition' in definitionOpt ? definitionOpt.definition : definitionOpt + const result = new PEX().evaluatePresentation(definition, wrappedPresentation.original, { generatePresentationSubmission: true }) + if (result.areRequiredCredentialsPresent) { + submission = result.value + break + } + } + } + if (!submission) { + throw Error('Verifiable Presentation has no submission_data, it has not been provided separately, and could also not be deduced') + } + // let's merge all submission data into one object + if (!submission_data) { + submission_data = submission + } else { + // We are pushing multiple descriptors into one submission_data, as it seems this is something which is assumed in OpenID4VP, but not supported in Presentation Exchange (a single VP always has a single submission_data) + Array.isArray(submission_data.descriptor_map) + ? submission_data.descriptor_map.push(...submission.descriptor_map) + : (submission_data.descriptor_map = [...submission.descriptor_map]) + } + } + if (typeof submission_data === 'string') { + submission_data = JSON.parse(submission_data) + } + return submission_data +} + +export const putPresentationSubmissionInLocation = async ( + authorizationRequest: AuthorizationRequest, + responsePayload: AuthorizationResponsePayload, + resOpts: AuthorizationResponseOpts, + idTokenPayload?: IDTokenPayload, +): Promise => { + const version = await authorizationRequest.getSupportedVersion() + const idTokenType = await authorizationRequest.containsResponseType(ResponseType.ID_TOKEN) + const authResponseType = await authorizationRequest.containsResponseType(ResponseType.VP_TOKEN) + // const requestPayload = await authorizationRequest.mergedPayloads(); + if (!resOpts.presentationExchange) { + return + } else if (resOpts.presentationExchange.verifiablePresentations.length === 0) { + throw Error('Presentation Exchange options set, but no verifiable presentations provided') + } + if ( + !resOpts.presentationExchange.presentationSubmission && + (!resOpts.presentationExchange.verifiablePresentations || resOpts.presentationExchange.verifiablePresentations.length === 0) + ) { + throw Error(`Either a presentationSubmission or verifiable presentations are needed at this point`) + } + const submissionData = + resOpts.presentationExchange.presentationSubmission ?? + (await createPresentationSubmission(resOpts.presentationExchange.verifiablePresentations, { + presentationDefinitions: await authorizationRequest.getPresentationDefinitions(), + })) + + const location = + resOpts.presentationExchange?.vpTokenLocation ?? + (idTokenType && version < SupportedVersion.SIOPv2_D11 ? VPTokenLocation.ID_TOKEN : VPTokenLocation.AUTHORIZATION_RESPONSE) + + switch (location) { + case VPTokenLocation.TOKEN_RESPONSE: { + throw Error('Token response for VP token is not supported yet') + } + case VPTokenLocation.ID_TOKEN: { + if (!idTokenPayload) { + throw Error('Cannot place submission data _vp_token in id token if no id token is present') + } else if (version >= SupportedVersion.SIOPv2_D11) { + throw Error(`This version of the OpenID4VP spec does not allow to store the vp submission data in the ID token`) + } else if (!idTokenType) { + throw Error(`Cannot place vp token in ID token as the RP didn't provide an "openid" scope in the request`) + } + if (idTokenPayload._vp_token?.presentation_submission) { + if (submissionData !== idTokenPayload._vp_token.presentation_submission) { + throw Error('Different submission data was provided as an option, but exising submission data was already present in the id token') + } + } else { + if (!idTokenPayload._vp_token) { + idTokenPayload._vp_token = { presentation_submission: submissionData } + } else { + idTokenPayload._vp_token.presentation_submission = submissionData + } + } + break + } + case VPTokenLocation.AUTHORIZATION_RESPONSE: { + if (!authResponseType) { + throw Error('Cannot place vp token in Authorization Response as there is no vp_token scope in the auth request') + } + if (responsePayload.presentation_submission) { + if (submissionData !== responsePayload.presentation_submission) { + throw Error( + 'Different submission data was provided as an option, but exising submission data was already present in the authorization response', + ) + } + } else { + responsePayload.presentation_submission = submissionData + } + } + } + + responsePayload.vp_token = + resOpts.presentationExchange?.verifiablePresentations.length === 1 + ? resOpts.presentationExchange.verifiablePresentations[0] + : resOpts.presentationExchange?.verifiablePresentations +} + +export const assertValidVerifiablePresentations = async (args: { + presentationDefinitions: PresentationDefinitionWithLocation[] + presentations: WrappedVerifiablePresentation[] + verificationCallback: PresentationVerificationCallback + opts?: { + limitDisclosureSignatureSuites?: string[] + restrictToFormats?: Format + restrictToDIDMethods?: string[] + presentationSubmission?: PresentationSubmission + hasher?: Hasher + } +}) => { + if ( + (!args.presentationDefinitions || args.presentationDefinitions.filter((a) => a.definition).length === 0) && + (!args.presentations || (Array.isArray(args.presentations) && args.presentations.filter((vp) => vp.presentation).length === 0)) + ) { + return + } + PresentationExchange.assertValidPresentationDefinitionWithLocations(args.presentationDefinitions) + const presentationsWithFormat = args.presentations + + if (args.presentationDefinitions && args.presentationDefinitions.length && (!presentationsWithFormat || presentationsWithFormat.length === 0)) { + throw new Error(SIOPErrors.AUTH_REQUEST_EXPECTS_VP) + } else if ( + (!args.presentationDefinitions || args.presentationDefinitions.length === 0) && + presentationsWithFormat && + presentationsWithFormat.length > 0 + ) { + throw new Error(SIOPErrors.AUTH_REQUEST_DOESNT_EXPECT_VP) + } else if (args.presentationDefinitions && presentationsWithFormat && args.presentationDefinitions.length != presentationsWithFormat.length) { + throw new Error(SIOPErrors.AUTH_REQUEST_EXPECTS_VP) + } else if (args.presentationDefinitions && !args.opts.presentationSubmission) { + throw new Error(`No presentation submission present. Please use presentationSubmission opt argument!`) + } else if (args.presentationDefinitions && presentationsWithFormat) { + await PresentationExchange.validatePresentationsAgainstDefinitions( + args.presentationDefinitions, + presentationsWithFormat, + args.verificationCallback, + args.opts, + ) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-response/Opts.ts b/packages/siop-oid4vp/lib/authorization-response/Opts.ts new file mode 100644 index 00000000..24f62035 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/Opts.ts @@ -0,0 +1,15 @@ +import { SIOPErrors } from '../types' + +import { AuthorizationResponseOpts, VerifyAuthorizationResponseOpts } from './types' + +export const assertValidResponseOpts = (opts: AuthorizationResponseOpts) => { + if (!opts?.createJwtCallback) { + throw new Error(SIOPErrors.BAD_PARAMS) + } +} + +export const assertValidVerifyOpts = (opts: VerifyAuthorizationResponseOpts) => { + if (!opts?.verification || !opts.verifyJwtCallback) { + throw new Error(SIOPErrors.VERIFY_BAD_PARAMS) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-response/Payload.ts b/packages/siop-oid4vp/lib/authorization-response/Payload.ts new file mode 100644 index 00000000..83997190 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/Payload.ts @@ -0,0 +1,58 @@ +import { AuthorizationRequest } from '../authorization-request' +import { IDToken } from '../id-token' +import { RequestObject } from '../request-object' +import { AuthorizationRequestPayload, AuthorizationResponsePayload, IDTokenPayload, SIOPErrors } from '../types' + +import { putPresentationSubmissionInLocation } from './OpenID4VP' +import { assertValidResponseOpts } from './Opts' +import { AuthorizationResponseOpts } from './types' + +export const createResponsePayload = async ( + authorizationRequest: AuthorizationRequest, + responseOpts: AuthorizationResponseOpts, + idTokenPayload?: IDTokenPayload, +): Promise => { + await assertValidResponseOpts(responseOpts) + if (!authorizationRequest) { + throw new Error(SIOPErrors.NO_REQUEST) + } + + // If state was in request, it must be in response + const state: string | undefined = await authorizationRequest.getMergedProperty('state') + + const responsePayload: AuthorizationResponsePayload = { + ...(responseOpts.accessToken && { access_token: responseOpts.accessToken }), + ...(responseOpts.tokenType && { token_type: responseOpts.tokenType }), + ...(responseOpts.refreshToken && { refresh_token: responseOpts.refreshToken }), + expires_in: responseOpts.expiresIn || 3600, + state, + } + + // vp tokens + await putPresentationSubmissionInLocation(authorizationRequest, responsePayload, responseOpts, idTokenPayload) + if (idTokenPayload) { + const idToken = await IDToken.fromIDTokenPayload(idTokenPayload, responseOpts) + responsePayload.id_token = await idToken.jwt(responseOpts.jwtIssuer) + } + + return responsePayload +} + +/** + * Properties can be in oAUth2 and OpenID (JWT) style. If they are in both the OpenID prop takes precedence as they are signed. + * @param payload + * @param requestObject + */ +export const mergeOAuth2AndOpenIdInRequestPayload = async ( + payload: AuthorizationRequestPayload, + requestObject?: RequestObject, +): Promise => { + const payloadCopy = JSON.parse(JSON.stringify(payload)) + + const requestObj = requestObject ? requestObject : await RequestObject.fromAuthorizationRequestPayload(payload) + if (!requestObj) { + return payloadCopy + } + const requestObjectPayload = await requestObj.getPayload() + return { ...payloadCopy, ...requestObjectPayload } +} diff --git a/packages/siop-oid4vp/lib/authorization-response/PresentationExchange.ts b/packages/siop-oid4vp/lib/authorization-response/PresentationExchange.ts new file mode 100644 index 00000000..2aa96631 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/PresentationExchange.ts @@ -0,0 +1,408 @@ +import { + EvaluationResults, + IPresentationDefinition, + KeyEncoding, + PEX, + PresentationSubmissionLocation, + SelectResults, + Status, + VerifiablePresentationFromOpts, + VerifiablePresentationResult, +} from '@sphereon/pex' +import { Format, PresentationDefinitionV1, PresentationDefinitionV2, PresentationSubmission } from '@sphereon/pex-models' +import { + CredentialMapper, + Hasher, + IProofPurpose, + IProofType, + OriginalVerifiableCredential, + OriginalVerifiablePresentation, + W3CVerifiablePresentation, + WrappedVerifiablePresentation, +} from '@sphereon/ssi-types' + +import { extractDataFromPath, getWithUrl } from '../helpers' +import { AuthorizationRequestPayload, SIOPErrors, SupportedVersion } from '../types' + +import { + PresentationDefinitionLocation, + PresentationDefinitionWithLocation, + PresentationSignCallback, + PresentationVerificationCallback, +} from './types' + +export class PresentationExchange { + readonly pex: PEX + readonly allVerifiableCredentials: OriginalVerifiableCredential[] + readonly allDIDs + + constructor(opts: { allDIDs?: string[]; allVerifiableCredentials: OriginalVerifiableCredential[]; hasher?: Hasher }) { + this.allDIDs = opts.allDIDs + this.allVerifiableCredentials = opts.allVerifiableCredentials + this.pex = new PEX({ hasher: opts.hasher }) + } + + /** + * Construct presentation submission from selected credentials + * @param presentationDefinition payload object received by the OP from the RP + * @param selectedCredentials + * @param presentationSignCallback + * @param options + */ + public async createVerifiablePresentation( + presentationDefinition: IPresentationDefinition, + selectedCredentials: OriginalVerifiableCredential[], + presentationSignCallback: PresentationSignCallback, + // options2?: { nonce?: string; domain?: string, proofType?: IProofType, verificationMethod?: string, signatureKeyEncoding?: KeyEncoding }, + options?: VerifiablePresentationFromOpts, + ): Promise { + if (!presentationDefinition) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID) + } + + const signOptions: VerifiablePresentationFromOpts = { + ...options, + presentationSubmissionLocation: PresentationSubmissionLocation.EXTERNAL, + proofOptions: { + ...options.proofOptions, + proofPurpose: options?.proofOptions?.proofPurpose ?? IProofPurpose.authentication, + type: options?.proofOptions?.type ?? IProofType.EcdsaSecp256k1Signature2019, + /* challenge: options?.proofOptions?.challenge, + domain: options?.proofOptions?.domain,*/ + }, + signatureOptions: { + ...options.signatureOptions, + // verificationMethod: options?.signatureOptions?.verificationMethod, + keyEncoding: options?.signatureOptions?.keyEncoding ?? KeyEncoding.Hex, + }, + } + + return await this.pex.verifiablePresentationFrom(presentationDefinition, selectedCredentials, presentationSignCallback, signOptions) + } + + /** + * This method will be called from the OP when we are certain that we have a + * PresentationDefinition object inside our requestPayload + * Finds a set of `VerifiableCredential`s from a list supplied to this class during construction, + * matching presentationDefinition object found in the requestPayload + * if requestPayload doesn't contain any valid presentationDefinition throws an error + * if PEX library returns any error in the process, throws the error + * returns the SelectResults object if successful + * @param presentationDefinition object received by the OP from the RP + * @param opts + */ + public async selectVerifiableCredentialsForSubmission( + presentationDefinition: IPresentationDefinition, + opts?: { + holderDIDs?: string[] + restrictToFormats?: Format + restrictToDIDMethods?: string[] + }, + ): Promise { + if (!presentationDefinition) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID) + } else if (!this.allVerifiableCredentials || this.allVerifiableCredentials.length == 0) { + throw new Error(`${SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD}, no VCs were provided`) + } + const selectResults: SelectResults = this.pex.selectFrom(presentationDefinition, this.allVerifiableCredentials, { + ...opts, + holderDIDs: opts?.holderDIDs ?? this.allDIDs, + // fixme limited disclosure + limitDisclosureSignatureSuites: [], + }) + if (selectResults.areRequiredCredentialsPresent === Status.ERROR) { + throw new Error(`message: ${SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD}, details: ${JSON.stringify(selectResults.errors)}`) + } + return selectResults + } + + /** + * validatePresentationAgainstDefinition function is called mainly by the RP + * after receiving the VP from the OP + * @param presentationDefinition object containing PD + * @param verifiablePresentation + * @param opts + */ + public static async validatePresentationAgainstDefinition( + presentationDefinition: IPresentationDefinition, + verifiablePresentation: OriginalVerifiablePresentation | WrappedVerifiablePresentation, + opts?: { + limitDisclosureSignatureSuites?: string[] + restrictToFormats?: Format + restrictToDIDMethods?: string[] + presentationSubmission?: PresentationSubmission + hasher?: Hasher + }, + ): Promise { + const wvp: WrappedVerifiablePresentation = + typeof verifiablePresentation === 'object' && 'original' in verifiablePresentation + ? (verifiablePresentation as WrappedVerifiablePresentation) + : CredentialMapper.toWrappedVerifiablePresentation(verifiablePresentation as OriginalVerifiablePresentation) + if (!presentationDefinition) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID) + } else if ( + !wvp || + !wvp.presentation || + (CredentialMapper.isWrappedW3CVerifiablePresentation(wvp) && + (!wvp.presentation.verifiableCredential || wvp.presentation.verifiableCredential.length === 0)) + ) { + throw new Error(SIOPErrors.NO_VERIFIABLE_PRESENTATION_NO_CREDENTIALS) + } + // console.log(`Presentation (validate): ${JSON.stringify(verifiablePresentation)}`); + const evaluationResults: EvaluationResults = new PEX({ hasher: opts?.hasher }).evaluatePresentation(presentationDefinition, wvp.original, opts) + if (evaluationResults.errors.length) { + throw new Error(`message: ${SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD}, details: ${JSON.stringify(evaluationResults.errors)}`) + } + return evaluationResults + } + + public static assertValidPresentationSubmission(presentationSubmission: PresentationSubmission) { + const validationResult = PEX.validateSubmission(presentationSubmission) + if (validationResult[0].message != 'ok') { + throw new Error(`${SIOPErrors.RESPONSE_OPTS_PRESENTATIONS_SUBMISSION_IS_NOT_VALID}, details ${JSON.stringify(validationResult[0])}`) + } + } + + /** + * Finds a valid PresentationDefinition inside the given AuthenticationRequestPayload + * throws exception if the PresentationDefinition is not valid + * returns null if no property named "presentation_definition" is found + * returns a PresentationDefinition if a valid instance found + * @param authorizationRequestPayload object that can have a presentation_definition inside + * @param version + */ + public static async findValidPresentationDefinitions( + authorizationRequestPayload: AuthorizationRequestPayload, + version?: SupportedVersion, + ): Promise { + const allDefinitions: PresentationDefinitionWithLocation[] = [] + + async function extractDefinitionFromVPToken() { + const vpTokens: PresentationDefinitionV1[] | PresentationDefinitionV2[] = extractDataFromPath( + authorizationRequestPayload, + '$..vp_token.presentation_definition', + ).map((d) => d.value) + const vpTokenRefs = extractDataFromPath(authorizationRequestPayload, '$..vp_token.presentation_definition_uri') + if (vpTokens && vpTokens.length && vpTokenRefs && vpTokenRefs.length) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_BY_REF_AND_VALUE_NON_EXCLUSIVE) + } + if (vpTokens && vpTokens.length) { + vpTokens.forEach((vpToken: PresentationDefinitionV1 | PresentationDefinitionV2) => { + if (allDefinitions.find((value) => value.definition.id === vpToken.id)) { + console.log( + `Warning. We encountered presentation definition with id ${vpToken.id}, more then once whilst processing! Make sure your payload is valid!`, + ) + return + } + PresentationExchange.assertValidPresentationDefinition(vpToken) + allDefinitions.push({ + definition: vpToken, + location: PresentationDefinitionLocation.CLAIMS_VP_TOKEN, + version, + }) + }) + } else if (vpTokenRefs && vpTokenRefs.length) { + for (const vpTokenRef of vpTokenRefs) { + const pd: PresentationDefinitionV1 | PresentationDefinitionV2 = (await getWithUrl(vpTokenRef.value)) as unknown as + | PresentationDefinitionV1 + | PresentationDefinitionV2 + if (allDefinitions.find((value) => value.definition.id === pd.id)) { + console.log( + `Warning. We encountered presentation definition with id ${pd.id}, more then once whilst processing! Make sure your payload is valid!`, + ) + return + } + PresentationExchange.assertValidPresentationDefinition(pd) + allDefinitions.push({ definition: pd, location: PresentationDefinitionLocation.CLAIMS_VP_TOKEN, version }) + } + } + } + + function addSingleToplevelPDToPDs(definition: IPresentationDefinition, version?: SupportedVersion): void { + if (allDefinitions.find((value) => value.definition.id === definition.id)) { + console.log( + `Warning. We encountered presentation definition with id ${definition.id}, more then once whilst processing! Make sure your payload is valid!`, + ) + return + } + PresentationExchange.assertValidPresentationDefinition(definition) + allDefinitions.push({ + definition, + location: PresentationDefinitionLocation.TOPLEVEL_PRESENTATION_DEF, + version, + }) + } + + async function extractDefinitionFromTopLevelDefinitionProperty(version?: SupportedVersion) { + const definitions = extractDataFromPath(authorizationRequestPayload, '$.presentation_definition') + const definitionsFromList = extractDataFromPath(authorizationRequestPayload, '$.presentation_definition[*]') + const definitionRefs = extractDataFromPath(authorizationRequestPayload, '$.presentation_definition_uri') + const definitionRefsFromList = extractDataFromPath(authorizationRequestPayload, '$.presentation_definition_uri[*]') + const hasPD = (definitions && definitions.length > 0) || (definitionsFromList && definitionsFromList.length > 0) + const hasPdRef = (definitionRefs && definitionRefs.length > 0) || (definitionRefsFromList && definitionRefsFromList.length > 0) + if (hasPD && hasPdRef) { + throw new Error(SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_BY_REF_AND_VALUE_NON_EXCLUSIVE) + } + if (definitions && definitions.length > 0) { + definitions.forEach((definition) => { + addSingleToplevelPDToPDs(definition.value, version) + }) + } else if (definitionsFromList && definitionsFromList.length > 0) { + definitionsFromList.forEach((definition) => { + addSingleToplevelPDToPDs(definition.value, version) + }) + } else if (definitionRefs && definitionRefs.length > 0) { + for (const definitionRef of definitionRefs) { + const pd: PresentationDefinitionV1 | PresentationDefinitionV2 = await getWithUrl(definitionRef.value) + addSingleToplevelPDToPDs(pd, version) + } + } else if (definitionsFromList && definitionRefsFromList.length > 0) { + for (const definitionRef of definitionRefsFromList) { + const pd: PresentationDefinitionV1 | PresentationDefinitionV2 = await getWithUrl(definitionRef.value) + addSingleToplevelPDToPDs(pd, version) + } + } + } + + if (authorizationRequestPayload) { + if (!version || version < SupportedVersion.SIOPv2_D11) { + await extractDefinitionFromVPToken() + } + await extractDefinitionFromTopLevelDefinitionProperty() + } + return allDefinitions + } + + public static assertValidPresentationDefinitionWithLocations(definitionsWithLocations: PresentationDefinitionWithLocation[]) { + if (definitionsWithLocations && definitionsWithLocations.length > 0) { + definitionsWithLocations.forEach((definitionWithLocation) => + PresentationExchange.assertValidPresentationDefinition(definitionWithLocation.definition), + ) + } + } + + private static assertValidPresentationDefinition(presentationDefinition: IPresentationDefinition) { + const validationResult = PEX.validateDefinition(presentationDefinition) + if (validationResult[0].message != 'ok') { + throw new Error(`${SIOPErrors.REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID}`) + } + } + + static async validatePresentationsAgainstDefinitions( + definitions: PresentationDefinitionWithLocation[], + vpPayloads: WrappedVerifiablePresentation[], + verifyPresentationCallback: PresentationVerificationCallback | undefined, + opts?: { + limitDisclosureSignatureSuites?: string[] + restrictToFormats?: Format + restrictToDIDMethods?: string[] + presentationSubmission?: PresentationSubmission + hasher?: Hasher + }, + ) { + if (!definitions || !vpPayloads || !definitions.length || definitions.length !== vpPayloads.length) { + throw new Error(SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD) + } + await Promise.all( + definitions.map( + async (pd) => await PresentationExchange.validatePresentationsAgainstDefinition(pd.definition, vpPayloads, verifyPresentationCallback, opts), + ), + ) + } + + private static async validatePresentationsAgainstDefinition( + definition: IPresentationDefinition, + vpPayloads: WrappedVerifiablePresentation[], + verifyPresentationCallback: PresentationVerificationCallback | undefined, + opts?: { + limitDisclosureSignatureSuites?: string[] + restrictToFormats?: Format + restrictToDIDMethods?: string[] + presentationSubmission?: PresentationSubmission + hasher?: Hasher + }, + ) { + const pex = new PEX({ hasher: opts?.hasher }) + + async function filterOutCorrectPresentation() { + //TODO: add support for multiple VPs here + const matchingVps = vpPayloads.map(async (vpw: WrappedVerifiablePresentation): Promise => { + const presentationSubmission = + opts?.presentationSubmission ?? + (CredentialMapper.isWrappedW3CVerifiablePresentation(vpw) ? vpw.presentation.presentation_submission : undefined) + const presentation = vpw.presentation + if (!definition) { + throw new Error(SIOPErrors.NO_PRESENTATION_SUBMISSION) + } else if ( + !vpw.presentation || + (CredentialMapper.isWrappedW3CVerifiablePresentation(vpw) && + (!vpw.presentation.verifiableCredential || vpw.presentation.verifiableCredential.length === 0)) + ) { + throw new Error(SIOPErrors.NO_VERIFIABLE_PRESENTATION_NO_CREDENTIALS) + } + // The verifyPresentationCallback function is mandatory for RP only, + // So the behavior here is to bypass it if not present + if (verifyPresentationCallback) { + try { + const verificationResult = await verifyPresentationCallback(vpw.original as W3CVerifiablePresentation, presentationSubmission) + if (!verificationResult.verified) { + throw new Error( + SIOPErrors.VERIFIABLE_PRESENTATION_SIGNATURE_NOT_VALID + verificationResult.reason ? `. ${verificationResult.reason}` : '', + ) + } + } catch (error: unknown) { + throw new Error(SIOPErrors.VERIFIABLE_PRESENTATION_SIGNATURE_NOT_VALID) + } + } + // console.log(`Presentation (filter): ${JSON.stringify(presentation)}`); + + const evaluationResults = pex.evaluatePresentation(definition, vpw.original, { + ...opts, + presentationSubmission, + }) + const submission = evaluationResults.value + if (!presentation || !submission) { + throw new Error(SIOPErrors.NO_PRESENTATION_SUBMISSION) + } + + // No match + if (submission.definition_id !== definition.id) { + return undefined + } + + return vpw + }) + + // Wait for all results to finish and filter out undefined (no match) values + return (await Promise.all(matchingVps)).filter((vp) => vp !== undefined) + } + + const checkedPresentations = await filterOutCorrectPresentation() + + if (checkedPresentations.length !== 1) { + throw new Error(`${SIOPErrors.COULD_NOT_FIND_VCS_MATCHING_PD}`) + } + const checkedPresentation = checkedPresentations[0] + const presentation = checkedPresentation.presentation + // console.log(`Presentation (checked): ${JSON.stringify(checkedPresentation.presentation)}`); + if ( + !checkedPresentation.presentation || + (CredentialMapper.isWrappedW3CVerifiablePresentation(checkedPresentation) && + (!checkedPresentation.presentation.verifiableCredential || checkedPresentation.presentation.verifiableCredential.length === 0)) + ) { + throw new Error(SIOPErrors.NO_VERIFIABLE_PRESENTATION_NO_CREDENTIALS) + } + const presentationSubmission = + opts?.presentationSubmission ?? (CredentialMapper.isW3cPresentation(presentation) ? presentation.presentation_submission : undefined) + const evaluationResults = pex.evaluatePresentation(definition, checkedPresentation.original, { + ...opts, + presentationSubmission, + }) + PresentationExchange.assertValidPresentationSubmission(evaluationResults.value) + await PresentationExchange.validatePresentationAgainstDefinition(definition, checkedPresentation, { + ...opts, + presentationSubmission, + hasher: opts?.hasher, + }) + } +} diff --git a/packages/siop-oid4vp/lib/authorization-response/ResponseRegistration.ts b/packages/siop-oid4vp/lib/authorization-response/ResponseRegistration.ts new file mode 100644 index 00000000..2959c9d8 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/ResponseRegistration.ts @@ -0,0 +1,65 @@ +import { LanguageTagUtils, removeNullUndefined } from '../helpers' +import { DiscoveryMetadataOpts, DiscoveryMetadataPayload, ResponseIss, ResponseType, Schema, Scope, SigningAlgo, SubjectType } from '../types' + +export const createDiscoveryMetadataPayload = (opts: DiscoveryMetadataOpts): DiscoveryMetadataPayload => { + const discoveryMetadataPayload: DiscoveryMetadataPayload = { + authorization_endpoint: opts.authorizationEndpoint || Schema.OPENID, + issuer: opts.issuer ?? ResponseIss.SELF_ISSUED_V2, + response_types_supported: opts.responseTypesSupported ?? ResponseType.ID_TOKEN, + scopes_supported: opts?.scopesSupported || [Scope.OPENID], + subject_types_supported: opts?.subjectTypesSupported || [SubjectType.PAIRWISE], + id_token_signing_alg_values_supported: opts?.idTokenSigningAlgValuesSupported || [SigningAlgo.ES256K, SigningAlgo.EDDSA], + request_object_signing_alg_values_supported: opts.requestObjectSigningAlgValuesSupported || [SigningAlgo.ES256K, SigningAlgo.EDDSA], + subject_syntax_types_supported: opts.subject_syntax_types_supported, + client_id: opts.client_id, + redirect_uris: opts.redirectUris, + client_name: opts.clientName, + token_endpoint_auth_method: opts.tokenEndpointAuthMethod, + application_type: opts.applicationType, + response_types: opts.responseTypes, + grant_types: opts.grantTypes, + vp_formats: opts.vpFormats, + token_endpoint: opts.tokenEndpoint, + userinfo_endpoint: opts.userinfoEndpoint, + jwks_uri: opts.jwksUri, + registration_endpoint: opts.registrationEndpoint, + response_modes_supported: opts.responseModesSupported, + grant_types_supported: opts.grantTypesSupported, + acr_values_supported: opts.acrValuesSupported, + id_token_encryption_alg_values_supported: opts.idTokenEncryptionAlgValuesSupported, + id_token_encryption_enc_values_supported: opts.idTokenEncryptionEncValuesSupported, + userinfo_signing_alg_values_supported: opts.userinfoSigningAlgValuesSupported, + userinfo_encryption_alg_values_supported: opts.userinfoEncryptionAlgValuesSupported, + userinfo_encryption_enc_values_supported: opts.userinfoEncryptionEncValuesSupported, + request_object_encryption_alg_values_supported: opts.requestObjectEncryptionAlgValuesSupported, + request_object_encryption_enc_values_supported: opts.requestObjectEncryptionEncValuesSupported, + token_endpoint_auth_methods_supported: opts.tokenEndpointAuthMethodsSupported, + token_endpoint_auth_signing_alg_values_supported: opts.tokenEndpointAuthSigningAlgValuesSupported, + display_values_supported: opts.displayValuesSupported, + claim_types_supported: opts.claimTypesSupported, + claims_supported: opts.claimsSupported, + service_documentation: opts.serviceDocumentation, + claims_locales_supported: opts.claimsLocalesSupported, + ui_locales_supported: opts.uiLocalesSupported, + claims_parameter_supported: opts.claimsParameterSupported, + request_parameter_supported: opts.requestParameterSupported, + request_uri_parameter_supported: opts.requestUriParameterSupported, + require_request_uri_registration: opts.requireRequestUriRegistration, + op_policy_uri: opts.opPolicyUri, + op_tos_uri: opts.opTosUri, + logo_uri: opts.logo_uri, + client_purpose: opts.clientPurpose, + id_token_types_supported: opts.idTokenTypesSupported, + } + + const languageTagEnabledFieldsNamesMapping = new Map() + languageTagEnabledFieldsNamesMapping.set('clientName', 'client_name') + languageTagEnabledFieldsNamesMapping.set('clientPurpose', 'client_purpose') + + const languageTaggedFields: Map = LanguageTagUtils.getLanguageTaggedPropertiesMapped(opts, languageTagEnabledFieldsNamesMapping) + languageTaggedFields.forEach((value: string, key: string) => { + discoveryMetadataPayload[key] = value + }) + + return removeNullUndefined(discoveryMetadataPayload) +} diff --git a/packages/siop-oid4vp/lib/authorization-response/index.ts b/packages/siop-oid4vp/lib/authorization-response/index.ts new file mode 100644 index 00000000..02bfafa2 --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/index.ts @@ -0,0 +1,4 @@ +export * from './AuthorizationResponse' +export * from './types' +export * from './Payload' +export * from './ResponseRegistration' diff --git a/packages/siop-oid4vp/lib/authorization-response/types.ts b/packages/siop-oid4vp/lib/authorization-response/types.ts new file mode 100644 index 00000000..9d557cbd --- /dev/null +++ b/packages/siop-oid4vp/lib/authorization-response/types.ts @@ -0,0 +1,107 @@ +import { IPresentationDefinition, PresentationSignCallBackParams } from '@sphereon/pex' +import { Format } from '@sphereon/pex-models' +import { CompactSdJwtVc, Hasher, PresentationSubmission, W3CVerifiablePresentation } from '@sphereon/ssi-types' + +import { ResponseMode, ResponseRegistrationOpts, ResponseURIType, SupportedVersion, VerifiablePresentationWithFormat, Verification } from '../types' +import { CreateJwtCallback, JwtIssuer } from '../types/JwtIssuer' +import { VerifyJwtCallback } from '../types/JwtVerifier' + +import { AuthorizationResponse } from './AuthorizationResponse' + +export interface AuthorizationResponseOpts { + // redirectUri?: string; // It's typically comes from the request opts as a measure to prevent hijacking. + responseURI?: string // This is either the redirect URI or response URI. See also responseURIType. response URI is used when response_mode is `direct_post` + responseURIType?: ResponseURIType + registration?: ResponseRegistrationOpts + version?: SupportedVersion + audience?: string + createJwtCallback: CreateJwtCallback + jwtIssuer?: JwtIssuer + responseMode?: ResponseMode + // did: string; + expiresIn?: number + accessToken?: string + tokenType?: string + refreshToken?: string + presentationExchange?: PresentationExchangeResponseOpts +} + +export interface PresentationExchangeResponseOpts { + /* presentationSignCallback?: PresentationSignCallback; + signOptions?: PresentationSignOptions, +*/ + /* credentialsAndDefinitions: { + presentationDefinition: IPresentationDefinition, + selectedCredentials: W3CVerifiableCredential[] + }[],*/ + + verifiablePresentations: Array + vpTokenLocation?: VPTokenLocation + presentationSubmission?: PresentationSubmission + restrictToFormats?: Format + restrictToDIDMethods?: string[] +} + +export interface PresentationExchangeRequestOpts { + presentationVerificationCallback?: PresentationVerificationCallback +} + +export interface PresentationDefinitionPayloadOpts { + presentation_definition?: IPresentationDefinition + presentation_definition_uri?: string +} + +export interface PresentationDefinitionWithLocation { + version?: SupportedVersion + location: PresentationDefinitionLocation + definition: IPresentationDefinition +} + +export interface VerifiablePresentationWithSubmissionData extends VerifiablePresentationWithFormat { + vpTokenLocation: VPTokenLocation + + submissionData: PresentationSubmission +} + +export enum PresentationDefinitionLocation { + CLAIMS_VP_TOKEN = 'claims.vp_token', + TOPLEVEL_PRESENTATION_DEF = 'presentation_definition', +} + +export enum VPTokenLocation { + AUTHORIZATION_RESPONSE = 'authorization_response', + ID_TOKEN = 'id_token', + TOKEN_RESPONSE = 'token_response', +} + +export type PresentationVerificationResult = { verified: boolean; reason?: string } + +export type PresentationVerificationCallback = ( + args: W3CVerifiablePresentation | CompactSdJwtVc, + presentationSubmission: PresentationSubmission, +) => Promise + +export type PresentationSignCallback = (args: PresentationSignCallBackParams) => Promise + +export interface VerifyAuthorizationResponseOpts { + correlationId: string + verification: Verification + verifyJwtCallback: VerifyJwtCallback + hasher?: Hasher + nonce?: string // To verify the response against the supplied nonce + state?: string // To verify the response against the supplied state + presentationDefinitions?: PresentationDefinitionWithLocation | PresentationDefinitionWithLocation[] // The presentation definitions to match against VPs in the response + audience?: string // The audience/redirect_uri + restrictToFormats?: Format // Further restrict to certain VC formats, not expressed in the presentation definition + restrictToDIDMethods?: string[] + // claims?: ClaimPayloadCommonOpts; // The claims, typically the same values used during request creation + // verifyCallback?: VerifyCallback; + // presentationVerificationCallback?: PresentationVerificationCallback; +} + +export interface AuthorizationResponseWithCorrelationId { + // The URI to send the response to. Can be derived from either the redirect_uri or the response_uri + responseURI: string + response: AuthorizationResponse + correlationId: string +} diff --git a/packages/siop-oid4vp/lib/helpers/Encodings.ts b/packages/siop-oid4vp/lib/helpers/Encodings.ts new file mode 100644 index 00000000..075def11 --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/Encodings.ts @@ -0,0 +1,103 @@ +import { InputDescriptorV1 } from '@sphereon/pex-models' +import { parse, stringify } from 'qs' +import * as ua8 from 'uint8arrays' + +import { SIOPErrors } from '../types' + +export function decodeUriAsJson(uri: string) { + if (!uri) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + const queryString = uri.replace(/^([a-zA-Z][a-zA-Z0-9-_]*:\/\/.*[?])/, '') + if (!queryString) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + const parts = parse(queryString, { plainObjects: true, depth: 10, parameterLimit: 5000, ignoreQueryPrefix: true }) + + const descriptors = parts?.claims?.['vp_token']?.presentation_definition?.['input_descriptors'] + if (descriptors && Array.isArray(descriptors)) { + // Whenever we have a [{'uri': 'str1'}, 'uri': 'str2'] qs changes this to {uri: ['str1','str2']} which means schema validation fails. So we have to fix that + parts.claims['vp_token'].presentation_definition['input_descriptors'] = descriptors.map((descriptor: InputDescriptorV1) => { + if (Array.isArray(descriptor.schema)) { + descriptor.schema = descriptor.schema.flatMap((val) => { + if (typeof val === 'string') { + return { uri: val } + } else if (typeof val === 'object' && Array.isArray(val.uri)) { + return val.uri.map((uri) => ({ uri: uri as string })) + } + return val + }) + } + return descriptor + }) + } + + const json = {} + for (const key in parts) { + const value = parts[key] + if (!value) { + continue + } + const isBool = typeof value == 'boolean' + const isNumber = typeof value == 'number' + const isString = typeof value == 'string' + + if (isBool || isNumber) { + json[decodeURIComponent(key)] = value + } else if (isString) { + const decoded = decodeURIComponent(value) + if (decoded.startsWith('{') && decoded.endsWith('}')) { + json[decodeURIComponent(key)] = JSON.parse(decoded) + } else { + json[decodeURIComponent(key)] = decoded + } + } + } + return JSON.parse(JSON.stringify(json)) +} + +export function encodeJsonAsURI(json: unknown, _opts?: { arraysWithIndex?: string[] }): string { + if (typeof json === 'string') { + return encodeJsonAsURI(JSON.parse(json)) + } + + const results: string[] = [] + + function encodeAndStripWhitespace(key: string): string { + return encodeURIComponent(key.replace(' ', '')) + } + + for (const [key, value] of Object.entries(json)) { + if (!value) { + continue + } + const isBool = typeof value == 'boolean' + const isNumber = typeof value == 'number' + const isString = typeof value == 'string' + const isArray = Array.isArray(value) + let encoded: string + if (isBool || isNumber) { + encoded = `${encodeAndStripWhitespace(key)}=${value}` + } else if (isString) { + encoded = `${encodeAndStripWhitespace(key)}=${encodeURIComponent(value)}` + } else if (isArray && _opts?.arraysWithIndex?.includes(key)) { + encoded = `${encodeAndStripWhitespace(key)}=${stringify(value, { arrayFormat: 'brackets' })}` + } else { + encoded = `${encodeAndStripWhitespace(key)}=${encodeURIComponent(JSON.stringify(value))}` + } + results.push(encoded) + } + return results.join('&') +} + +export function base64ToHexString(input: string, encoding?: 'base64url' | 'base64'): string { + return ua8.toString(ua8.fromString(input, encoding ?? 'base64url'), 'base16') +} + +export function fromBase64(base64: string): string { + return base64.replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_') +} + +export function base64urlEncodeBuffer(buf: { toString: (arg0: 'base64') => string }): string { + return fromBase64(buf.toString('base64')) +} diff --git a/packages/siop-oid4vp/lib/helpers/HttpUtils.ts b/packages/siop-oid4vp/lib/helpers/HttpUtils.ts new file mode 100644 index 00000000..a88df4ac --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/HttpUtils.ts @@ -0,0 +1,138 @@ +import { fetch } from 'cross-fetch' +import Debug from 'debug' + +import { ContentType, SIOPErrors, SIOPResonse } from '../types' + +const debug = Debug('sphereon:siopv2:http') + +export const getJson = async ( + URL: string, + opts?: { + bearerToken?: string + contentType?: string | ContentType + accept?: string + customHeaders?: HeadersInit + exceptionOnHttpErrorStatus?: boolean + }, +): Promise> => { + return await siopFetch(URL, undefined, { method: 'GET', ...opts }) +} + +export const formPost = async ( + url: string, + body: BodyInit, + opts?: { + bearerToken?: string + contentType?: string | ContentType + accept?: string + customHeaders?: HeadersInit + exceptionOnHttpErrorStatus?: boolean + }, +): Promise> => { + return await post(url, body, opts?.contentType ? { ...opts } : { contentType: ContentType.FORM_URL_ENCODED, ...opts }) +} + +export const post = async ( + url: string, + body?: BodyInit, + opts?: { + bearerToken?: string + contentType?: string | ContentType + accept?: string + customHeaders?: HeadersInit + exceptionOnHttpErrorStatus?: boolean + }, +): Promise> => { + return await siopFetch(url, body, { method: 'POST', ...opts }) +} + +const siopFetch = async ( + url: string, + body?: BodyInit, + opts?: { + method?: string + bearerToken?: string + contentType?: string | ContentType + accept?: string + customHeaders?: HeadersInit + exceptionOnHttpErrorStatus?: boolean + }, +): Promise> => { + if (!url || url.toLowerCase().startsWith('did:')) { + throw Error(`Invalid URL supplied. Expected a http(s) URL. Recieved: ${url}`) + } + const headers = opts?.customHeaders ? opts.customHeaders : {} + if (opts?.bearerToken) { + headers['Authorization'] = `Bearer ${opts.bearerToken}` + } + const method = opts?.method ? opts.method : body ? 'POST' : 'GET' + const accept = opts?.accept ? opts.accept : 'application/json' + headers['Content-Type'] = opts?.contentType ? opts.contentType : method !== 'GET' ? 'application/json' : undefined + headers['Accept'] = accept + + const payload: RequestInit = { + method, + headers, + body, + } + + debug(`START fetching url: ${url}`) + if (body) { + debug(`Body:\r\n${JSON.stringify(body)}`) + } + debug(`Headers:\r\n${JSON.stringify(payload.headers)}`) + const origResponse = await fetch(url, payload) + const clonedResponse = origResponse.clone() + const success = origResponse && origResponse.status >= 200 && origResponse.status < 400 + const textResponseBody = await clonedResponse.text() + + const isJSONResponse = + (accept === 'application/json' || origResponse.headers['Content-Type'] === 'application/json') && textResponseBody.trim().startsWith('{') + const responseBody = isJSONResponse ? JSON.parse(textResponseBody) : textResponseBody + + if (success || opts?.exceptionOnHttpErrorStatus) { + debug(`${success ? 'success' : 'error'} status: ${clonedResponse.status}, body:\r\n${JSON.stringify(responseBody)}`) + } else { + console.warn(`${success ? 'success' : 'error'} status: ${clonedResponse.status}, body:\r\n${JSON.stringify(responseBody)}`) + } + + if (!success && opts?.exceptionOnHttpErrorStatus) { + const error = JSON.stringify(responseBody) + throw new Error(error === '{}' ? '{"error": "not found"}' : error) + } + debug(`END fetching url: ${url}`) + + return { + origResponse, + successBody: success ? responseBody : undefined, + errorBody: !success ? responseBody : undefined, + } +} + +export const getWithUrl = async (url: string, textResponse?: boolean): Promise => { + // try { + const response = await fetch(url) + if (response.status >= 400) { + return Promise.reject(Error(`${SIOPErrors.RESPONSE_STATUS_UNEXPECTED} ${response.status}:${response.statusText} URL: ${url}`)) + } + if (textResponse === true) { + return (await response.text()) as unknown as T + } + return await response.json() + /*} catch (e) { + return Promise.reject(Error(`${(e as Error).message}`)); + }*/ +} + +export const fetchByReferenceOrUseByValue = async (referenceURI: string, valueObject: T, textResponse?: boolean): Promise => { + let response: T = valueObject + if (referenceURI) { + try { + response = await getWithUrl(referenceURI, textResponse) + } catch (e) { + console.log(e) + throw new Error(`${SIOPErrors.REG_PASS_BY_REFERENCE_INCORRECTLY}: ${e.message}, URL: ${referenceURI}`) + } + } + return response +} diff --git a/packages/siop-oid4vp/lib/helpers/Keys.ts b/packages/siop-oid4vp/lib/helpers/Keys.ts new file mode 100644 index 00000000..45cb05bb --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/Keys.ts @@ -0,0 +1,150 @@ +// import { keyUtils as ed25519KeyUtils } from '@transmute/did-key-ed25519'; +// import { ec as EC } from 'elliptic'; +import * as u8a from 'uint8arrays' + +import { JWK } from '../types' + +const ED25519_DID_KEY = 'did:key:z6Mk' + +export const isEd25519DidKeyMethod = (did?: string) => { + return did && did.includes(ED25519_DID_KEY) +} + +/* +export const isEd25519JWK = (jwk: JWK): boolean => { + return jwk && !!jwk.crv && jwk.crv === KeyCurve.ED25519; +}; + +export const getBase58PrivateKeyFromHexPrivateKey = (hexPrivateKey: string): string => { + return bs58.encode(Buffer.from(hexPrivateKey, 'hex')); +}; + +export const getPublicED25519JWKFromHexPrivateKey = (hexPrivateKey: string, kid?: string): JWK => { + const ec = new EC('ed25519'); + const privKey = ec.keyFromPrivate(hexPrivateKey); + const pubPoint = privKey.getPublic(); + + return toJWK(kid, KeyCurve.ED25519, pubPoint); +}; + +const getPublicSECP256k1JWKFromHexPrivateKey = (hexPrivateKey: string, kid: string) => { + const ec = new EC('secp256k1'); + const privKey = ec.keyFromPrivate(hexPrivateKey.replace('0x', ''), 'hex'); + const pubPoint = privKey.getPublic(); + return toJWK(kid, KeyCurve.SECP256k1, pubPoint); +}; + +export const getPublicJWKFromHexPrivateKey = (hexPrivateKey: string, kid?: string, did?: string): JWK => { + if (isEd25519DidKeyMethod(did)) { + return getPublicED25519JWKFromHexPrivateKey(hexPrivateKey, kid); + } + return getPublicSECP256k1JWKFromHexPrivateKey(hexPrivateKey, kid); +}; + +const toJWK = (kid: string, crv: KeyCurve, pubPoint: EC.BN) => { + return { + kid, + kty: KeyType.EC, + crv: crv, + x: base64url.toBase64(pubPoint.getX().toArrayLike(Buffer)), + y: base64url.toBase64(pubPoint.getY().toArrayLike(Buffer)) + }; +}; + +// from fingerprintFromPublicKey function in @transmute/Ed25519KeyPair +const getThumbprintFromJwkDIDKeyImpl = (jwk: JWK): string => { + // ed25519 cryptonyms are multicodec encoded values, specifically: + // (multicodec ed25519-pub 0xed01 + key bytes) + const pubkeyBytes = base64url.toBuffer(jwk.x); + const buffer = new Uint8Array(2 + pubkeyBytes.length); + buffer[0] = 0xed; + buffer[1] = 0x01; + buffer.set(pubkeyBytes, 2); + + // prefix with `z` to indicate multi-base encodingFormat + + return base64url.encode(`z${u8a.toString(buffer, 'base58btc')}`); +}; + +export const getThumbprintFromJwk = async (jwk: JWK, did: string): Promise => { + if (isEd25519DidKeyMethod(did)) { + return getThumbprintFromJwkDIDKeyImpl(jwk); + } else { + return await calculateJwkThumbprint(jwk, 'sha256'); + } +}; + +export const getThumbprint = async (hexPrivateKey: string, did: string): Promise => { + return await getThumbprintFromJwk( + isEd25519DidKeyMethod(did) ? getPublicED25519JWKFromHexPrivateKey(hexPrivateKey) : getPublicJWKFromHexPrivateKey(hexPrivateKey), + did + ); +}; +*/ + +export type DigestAlgorithm = 'sha256' | 'sha384' | 'sha512' + +const check = (value, description) => { + if (typeof value !== 'string' || !value) { + throw Error(`${description} missing or invalid`) + } +} + +export async function calculateJwkThumbprint(jwk: JWK, digestAlgorithm?: DigestAlgorithm): Promise { + if (!jwk || typeof jwk !== 'object') { + throw new TypeError('JWK must be an object') + } + const algorithm = digestAlgorithm ?? 'sha256' + if (algorithm !== 'sha256' && algorithm !== 'sha384' && algorithm !== 'sha512') { + throw new TypeError('digestAlgorithm must one of "sha256", "sha384", or "sha512"') + } + let components + switch (jwk.kty) { + case 'EC': + check(jwk.crv, '"crv" (Curve) Parameter') + check(jwk.x, '"x" (X Coordinate) Parameter') + check(jwk.y, '"y" (Y Coordinate) Parameter') + components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y } + break + case 'OKP': + check(jwk.crv, '"crv" (Subtype of Key Pair) Parameter') + check(jwk.x, '"x" (Public Key) Parameter') + components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x } + break + case 'RSA': + check(jwk.e, '"e" (Exponent) Parameter') + check(jwk.n, '"n" (Modulus) Parameter') + components = { e: jwk.e, kty: jwk.kty, n: jwk.n } + break + case 'oct': + check(jwk.k, '"k" (Key Value) Parameter') + components = { k: jwk.k, kty: jwk.kty } + break + default: + throw Error('"kty" (Key Type) Parameter missing or unsupported') + } + const data = u8a.fromString(JSON.stringify(components), 'utf-8') + return u8a.toString(await digest(algorithm, data), 'base64url') +} + +const digest = async (algorithm: DigestAlgorithm, data: Uint8Array) => { + const subtleDigest = `SHA-${algorithm.slice(-3)}` + return new Uint8Array(await crypto.subtle.digest(subtleDigest, data)) +} + +export async function getDigestAlgorithmFromJwkThumbprintUri(uri: string): Promise { + const match = uri.match(/^urn:ietf:params:oauth:jwk-thumbprint:sha-(\w+):/) + if (!match) { + throw new Error(`Invalid JWK thumbprint URI structure ${uri}`) + } + const algorithm = `sha${match[1]}` as DigestAlgorithm + if (algorithm !== 'sha256' && algorithm !== 'sha384' && algorithm !== 'sha512') { + throw new Error(`Invalid JWK thumbprint URI digest algorithm ${uri}`) + } + return algorithm +} + +export async function calculateJwkThumbprintUri(jwk: JWK, digestAlgorithm: DigestAlgorithm = 'sha256'): Promise { + const thumbprint = await calculateJwkThumbprint(jwk, digestAlgorithm) + return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}` +} diff --git a/packages/siop-oid4vp/lib/helpers/LanguageTagUtils.ts b/packages/siop-oid4vp/lib/helpers/LanguageTagUtils.ts new file mode 100644 index 00000000..434512a4 --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/LanguageTagUtils.ts @@ -0,0 +1,126 @@ +import Tags from 'language-tags' + +import { SIOPErrors } from '../types' + +import { isStringNullOrEmpty } from './ObjectUtils' + +export class LanguageTagUtils { + private static readonly LANGUAGE_TAG_SEPARATOR = '#' + + /** + * It will give back a fields which are language tag enabled. i.e. all fields with the fields names containing + * language tags e.g. fieldName#nl-NL + * + * @param source is the object from which the language enabled fields and their values will be extracted. + */ + static getAllLanguageTaggedProperties(source: unknown): Map { + return this.getLanguageTaggedPropertiesMapped(source, undefined) + } + + /** + * It will give back a fields which are language tag enabled and are listed in the required fields. + * + * @param source is the object from which the language enabled fields and their values will be extracted. + * @param requiredFieldNames the fields which are supposed to be language enabled. These are the only fields which should be returned. + */ + static getLanguageTaggedProperties(source: unknown, requiredFieldNames: Array): Map { + const languageTagEnabledFieldsNamesMapping: Map = new Map() + requiredFieldNames.forEach((value) => languageTagEnabledFieldsNamesMapping.set(value, value)) + return this.getLanguageTaggedPropertiesMapped(source, languageTagEnabledFieldsNamesMapping) + } + + /** + * It will give back a fields which are language tag enabled and are mapped in the required fields. + * + * @param source is the object from which the language enabled fields and their values will be extracted. + * @param requiredFieldNamesMapping the fields which are supposed to be language enabled. These are the only fields which should be returned. And + * the fields names will be transformed as per the mapping provided. + */ + static getLanguageTaggedPropertiesMapped(source: unknown, requiredFieldNamesMapping: Map): Map { + this.assertSourceIsWorthChecking(source) + this.assertValidTargetFieldNames(requiredFieldNamesMapping) + + const discoveredLanguageTaggedFields: Map = new Map() + + Object.entries(source).forEach(([key, value]) => { + const languageTagSeparatorIndexInKey: number = key.indexOf(this.LANGUAGE_TAG_SEPARATOR) + + if (this.isFieldLanguageTagged(languageTagSeparatorIndexInKey)) { + this.extractLanguageTaggedField( + key, + value as string, + languageTagSeparatorIndexInKey, + requiredFieldNamesMapping, + discoveredLanguageTaggedFields, + ) + } + }) + + return discoveredLanguageTaggedFields + } + + private static extractLanguageTaggedField( + key: string, + value: string, + languageTagSeparatorIndexInKey: number, + languageTagEnabledFieldsNamesMapping: Map, + languageTaggedFields: Map, + ): void { + const fieldName = this.getFieldName(key, languageTagSeparatorIndexInKey) + + const languageTag = this.getLanguageTag(key, languageTagSeparatorIndexInKey) + if (Tags.check(languageTag)) { + if (languageTagEnabledFieldsNamesMapping?.size) { + if (languageTagEnabledFieldsNamesMapping.has(fieldName)) { + languageTaggedFields.set(this.getMappedFieldName(languageTagEnabledFieldsNamesMapping, fieldName, languageTag), value) + } + } else { + languageTaggedFields.set(key, value) + } + } + } + + private static getMappedFieldName(languageTagEnabledFieldsNamesMapping: Map, fieldName: string, languageTag: string): string { + return languageTagEnabledFieldsNamesMapping.get(fieldName) + this.LANGUAGE_TAG_SEPARATOR + languageTag + } + + private static getLanguageTag(key: string, languageTagSeparatorIndex: number): string { + return key.substring(languageTagSeparatorIndex + 1) + } + + private static getFieldName(key: string, languageTagSeparatorIndex: number): string { + return key.substring(0, languageTagSeparatorIndex) + } + + /*** + * This function checks about the field to be language-tagged. + * + * @param languageTagSeparatorIndex + * @private + */ + private static isFieldLanguageTagged(languageTagSeparatorIndex: number): boolean { + return languageTagSeparatorIndex > 0 + } + + private static assertValidTargetFieldNames(languageTagEnabledFieldsNamesMapping: Map): void { + if (languageTagEnabledFieldsNamesMapping) { + if (!languageTagEnabledFieldsNamesMapping.size) { + throw new Error(SIOPErrors.BAD_PARAMS + ' LanguageTagEnabledFieldsNamesMapping must be non-null or non-empty') + } else { + for (const entry of languageTagEnabledFieldsNamesMapping.entries()) { + const key = entry[0] + const value = entry[1] + if (isStringNullOrEmpty(key) || isStringNullOrEmpty(value)) { + throw new Error(SIOPErrors.BAD_PARAMS + '. languageTagEnabledFieldsName must be non-null or non-empty') + } + } + } + } + } + + private static assertSourceIsWorthChecking(source: unknown): void { + if (!source) { + throw new Error(SIOPErrors.BAD_PARAMS + ' Source must be non-null i.e. not-initialized.') + } + } +} diff --git a/packages/siop-oid4vp/lib/helpers/Metadata.ts b/packages/siop-oid4vp/lib/helpers/Metadata.ts new file mode 100644 index 00000000..632d7c0c --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/Metadata.ts @@ -0,0 +1,120 @@ +import { Format } from '@sphereon/pex-models' + +import { + CommonSupportedMetadata, + DiscoveryMetadataPayload, + RPRegistrationMetadataPayload, + SIOPErrors, + SubjectSyntaxTypesSupportedValues, +} from '../types' + +export function assertValidMetadata(opMetadata: DiscoveryMetadataPayload, rpMetadata: RPRegistrationMetadataPayload): CommonSupportedMetadata { + let subjectSyntaxTypesSupported = [] + const credentials = supportedCredentialsFormats(rpMetadata.vp_formats, opMetadata.vp_formats) + const isValidSubjectSyntax = verifySubjectSyntaxes(rpMetadata.subject_syntax_types_supported) + if (isValidSubjectSyntax && rpMetadata.subject_syntax_types_supported) { + subjectSyntaxTypesSupported = supportedSubjectSyntaxTypes(rpMetadata.subject_syntax_types_supported, opMetadata.subject_syntax_types_supported) + } else if (isValidSubjectSyntax && (!rpMetadata.subject_syntax_types_supported || !rpMetadata.subject_syntax_types_supported.length)) { + if (opMetadata.subject_syntax_types_supported || opMetadata.subject_syntax_types_supported.length) { + subjectSyntaxTypesSupported = [...opMetadata.subject_syntax_types_supported] + } + } + return { vp_formats: credentials, subject_syntax_types_supported: subjectSyntaxTypesSupported } +} + +function getIntersection(rpMetadata: Array | T, opMetadata: Array | T): Array { + let arrayA, arrayB + if (!Array.isArray(rpMetadata)) { + arrayA = [rpMetadata] + } else { + arrayA = rpMetadata + } + if (!Array.isArray(opMetadata)) { + arrayB = [opMetadata] + } else { + arrayB = opMetadata + } + return arrayA.filter((value) => arrayB.includes(value)) +} + +function verifySubjectSyntaxes(subjectSyntaxTypesSupported: string[]): boolean { + if (subjectSyntaxTypesSupported.length) { + if (Array.isArray(subjectSyntaxTypesSupported)) { + if ( + subjectSyntaxTypesSupported.length === + subjectSyntaxTypesSupported.filter( + (sst) => + sst.includes(SubjectSyntaxTypesSupportedValues.DID.valueOf()) || sst === SubjectSyntaxTypesSupportedValues.JWK_THUMBPRINT.valueOf(), + ).length + ) { + return true + } + } + } + return false +} + +function supportedSubjectSyntaxTypes(rpMethods: string[] | string, opMethods: string[] | string): Array { + const rpMethodsList = Array.isArray(rpMethods) ? rpMethods : [rpMethods] + const opMethodsList = Array.isArray(opMethods) ? opMethods : [opMethods] + const supportedSubjectSyntaxTypes = getIntersection(rpMethodsList, opMethodsList) + if (supportedSubjectSyntaxTypes.indexOf(SubjectSyntaxTypesSupportedValues.DID.valueOf()) !== -1) { + return [SubjectSyntaxTypesSupportedValues.DID.valueOf()] + } + if (rpMethodsList.includes(SubjectSyntaxTypesSupportedValues.DID.valueOf())) { + const supportedExtendedDids: string[] = opMethodsList.filter((method) => method.startsWith('did:')) + if (supportedExtendedDids.length) { + return supportedExtendedDids + } + } + if (opMethodsList.includes(SubjectSyntaxTypesSupportedValues.DID.valueOf())) { + const supportedExtendedDids: string[] = rpMethodsList.filter((method) => method.startsWith('did:')) + if (supportedExtendedDids.length) { + return supportedExtendedDids + } + } + + if (!supportedSubjectSyntaxTypes.length) { + throw Error(SIOPErrors.DID_METHODS_NOT_SUPORTED) + } + const supportedDidMethods = supportedSubjectSyntaxTypes.filter((sst) => sst.includes('did:')) + if (supportedDidMethods.length) { + return supportedDidMethods + } + return supportedSubjectSyntaxTypes +} + +function getFormatIntersection(rpFormat: Format, opFormat: Format): Format { + const intersectionFormat: Format = {} + const supportedCredentials = getIntersection(Object.keys(rpFormat), Object.keys(opFormat)) + if (!supportedCredentials.length) { + throw new Error(SIOPErrors.CREDENTIAL_FORMATS_NOT_SUPPORTED) + } + supportedCredentials.forEach(function (crFormat: string) { + const rpAlgs = [] + const opAlgs = [] + Object.keys(rpFormat[crFormat]).forEach((k) => rpAlgs.push(...rpFormat[crFormat][k])) + Object.keys(opFormat[crFormat]).forEach((k) => opAlgs.push(...opFormat[crFormat][k])) + let methodKeyRP = undefined + let methodKeyOP = undefined + Object.keys(rpFormat[crFormat]).forEach((k) => (methodKeyRP = k)) + Object.keys(opFormat[crFormat]).forEach((k) => (methodKeyOP = k)) + if (methodKeyRP !== methodKeyOP) { + throw new Error(SIOPErrors.CREDENTIAL_FORMATS_NOT_SUPPORTED) + } + const algs = getIntersection(rpAlgs, opAlgs) + if (!algs.length) { + throw new Error(SIOPErrors.CREDENTIAL_FORMATS_NOT_SUPPORTED) + } + intersectionFormat[crFormat] = {} + intersectionFormat[crFormat][methodKeyOP] = algs + }) + return intersectionFormat +} + +export function supportedCredentialsFormats(rpFormat: Format, opFormat: Format): Format { + if (!rpFormat || !opFormat || !Object.keys(rpFormat).length || !Object.keys(opFormat).length) { + throw new Error(SIOPErrors.CREDENTIALS_FORMATS_NOT_PROVIDED) + } + return getFormatIntersection(rpFormat, opFormat) +} diff --git a/packages/siop-oid4vp/lib/helpers/ObjectUtils.ts b/packages/siop-oid4vp/lib/helpers/ObjectUtils.ts new file mode 100644 index 00000000..e278902d --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/ObjectUtils.ts @@ -0,0 +1,26 @@ +import { JSONPath as jp } from '@astronautlabs/jsonpath' + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function extractDataFromPath(obj: unknown, path: string): { path: string[]; value: any }[] { + return jp.nodes(obj, path) +} + +export function isStringNullOrEmpty(key: string) { + return !key || !key.length +} + +export function removeNullUndefined(data: unknown) { + if (!data) { + return data + } + //transform properties into key-values pairs and filter all the empty-values + const entries = Object.entries(data).filter(([, value]) => value != null) + //map through all the remaining properties and check if the value is an object. + //if value is object, use recursion to remove empty properties + const clean = entries.map(([key, v]) => { + const value = typeof v === 'object' && !Array.isArray(v) ? removeNullUndefined(v) : v + return [key, value] + }) + //transform the key-value pairs back to an object. + return Object.fromEntries(clean) +} diff --git a/packages/siop-oid4vp/lib/helpers/Revocation.ts b/packages/siop-oid4vp/lib/helpers/Revocation.ts new file mode 100644 index 00000000..2c38e2de --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/Revocation.ts @@ -0,0 +1,57 @@ +import { CredentialMapper, W3CVerifiableCredential, WrappedVerifiableCredential, WrappedVerifiablePresentation } from '@sphereon/ssi-types' + +import { RevocationStatus, RevocationVerification, RevocationVerificationCallback, VerifiableCredentialTypeFormat } from '../types' + +export const verifyRevocation = async ( + vpToken: WrappedVerifiablePresentation, + revocationVerificationCallback: RevocationVerificationCallback, + revocationVerification: RevocationVerification, +): Promise => { + if (!vpToken) { + throw new Error(`VP token not provided`) + } + if (!revocationVerificationCallback) { + throw new Error(`Revocation callback not provided`) + } + + const vcs = CredentialMapper.isWrappedSdJwtVerifiablePresentation(vpToken) ? [vpToken.vcs[0]] : vpToken.presentation.verifiableCredential + for (const vc of vcs) { + if ( + revocationVerification === RevocationVerification.ALWAYS || + (revocationVerification === RevocationVerification.IF_PRESENT && credentialHasStatus(vc)) + ) { + const result = await revocationVerificationCallback( + vc.original as W3CVerifiableCredential, + originalTypeToVerifiableCredentialTypeFormat(vc.format), + ) + if (result.status === RevocationStatus.INVALID) { + throw new Error(`Revocation invalid for vc. Error: ${result.error}`) + } + } + } +} + +function originalTypeToVerifiableCredentialTypeFormat(original: WrappedVerifiableCredential['format']): VerifiableCredentialTypeFormat { + const mapping: { [T in WrappedVerifiableCredential['format']]: VerifiableCredentialTypeFormat } = { + 'vc+sd-jwt': VerifiableCredentialTypeFormat.SD_JWT_VC, + jwt: VerifiableCredentialTypeFormat.JWT_VC, + jwt_vc: VerifiableCredentialTypeFormat.JWT_VC, + ldp: VerifiableCredentialTypeFormat.LDP_VC, + ldp_vc: VerifiableCredentialTypeFormat.LDP_VC, + } + + return mapping[original] +} + +/** + * Checks whether a wrapped verifiable credential has a status in the credential. + * For w3c credentials it will check the presence of `credentialStatus` property + * For SD-JWT it will check the presence of `status` property + */ +function credentialHasStatus(wrappedVerifiableCredential: WrappedVerifiableCredential) { + if (CredentialMapper.isWrappedSdJwtVerifiableCredential(wrappedVerifiableCredential)) { + return wrappedVerifiableCredential.decoded.status !== undefined + } else { + return wrappedVerifiableCredential.credential.credentialStatus !== undefined + } +} diff --git a/packages/siop-oid4vp/lib/helpers/SIOPSpecVersion.ts b/packages/siop-oid4vp/lib/helpers/SIOPSpecVersion.ts new file mode 100644 index 00000000..cd3c5abb --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/SIOPSpecVersion.ts @@ -0,0 +1,99 @@ +import { AuthorizationRequestPayloadVD11Schema, AuthorizationRequestPayloadVID1Schema } from '../schemas' +import { + AuthorizationRequestPayloadVD12OID4VPD18Schema, + AuthorizationRequestPayloadVD12OID4VPD20Schema, +} from '../schemas/validation/schemaValidation' +import { AuthorizationRequestPayload, ResponseMode, SupportedVersion } from '../types' +import errors from '../types/Errors' + +const validateJWTVCPresentationProfile = AuthorizationRequestPayloadVID1Schema + +function isJWTVC1Payload(authorizationRequest: AuthorizationRequestPayload) { + return ( + authorizationRequest.scope && + authorizationRequest.scope.toLowerCase().includes('openid') && + authorizationRequest.response_type && + authorizationRequest.response_type.toLowerCase().includes('id_token') && + authorizationRequest.response_mode && + authorizationRequest.response_mode.toLowerCase() === 'post' && + authorizationRequest.client_id && + authorizationRequest.client_id.toLowerCase().startsWith('did:') && + authorizationRequest.redirect_uri && + (authorizationRequest.registration_uri || authorizationRequest.registration) && + authorizationRequest.claims && + 'vp_token' in authorizationRequest.claims + ) +} +function isID1Payload(authorizationRequest: AuthorizationRequestPayload) { + return ( + !authorizationRequest.client_metadata_uri && + !authorizationRequest.client_metadata && + !authorizationRequest.presentation_definition && + !authorizationRequest.presentation_definition_uri + ) +} + +export const authorizationRequestVersionDiscovery = (authorizationRequest: AuthorizationRequestPayload): SupportedVersion[] => { + const versions = [] + const authorizationRequestCopy: AuthorizationRequestPayload = JSON.parse(JSON.stringify(authorizationRequest)) + const vd13Validation = AuthorizationRequestPayloadVD12OID4VPD20Schema(authorizationRequestCopy) + if (vd13Validation) { + if ( + !authorizationRequestCopy.registration_uri && + !authorizationRequestCopy.registration && + !(authorizationRequestCopy.claims && 'vp_token' in authorizationRequestCopy.claims) && + authorizationRequestCopy.response_mode !== ResponseMode.POST // Post has been replaced by direct post + ) { + versions.push(SupportedVersion.SIOPv2_D12_OID4VP_D20) + } + } + + // todo: We could use v11 validation for v12 for now, as we do not differentiate in the schema at this point\ + const vd12Validation = AuthorizationRequestPayloadVD12OID4VPD18Schema(authorizationRequestCopy) + if (vd12Validation) { + if ( + !authorizationRequestCopy.registration_uri && + !authorizationRequestCopy.registration && + !(authorizationRequestCopy.claims && 'vp_token' in authorizationRequestCopy.claims) && + authorizationRequestCopy.response_mode !== ResponseMode.POST // Post has been replaced by direct post + ) { + versions.push(SupportedVersion.SIOPv2_D12_OID4VP_D18) + } + } + const vd11Validation = AuthorizationRequestPayloadVD11Schema(authorizationRequestCopy) + if (vd11Validation) { + if ( + !authorizationRequestCopy.registration_uri && + !authorizationRequestCopy.registration && + !(authorizationRequestCopy.claims && 'vp_token' in authorizationRequestCopy.claims) && + !authorizationRequestCopy.client_id_scheme && // introduced after v11 + !authorizationRequestCopy.response_uri && + authorizationRequestCopy.response_mode !== ResponseMode.DIRECT_POST // Direct post was used before v12 oid4vp18 + ) { + versions.push(SupportedVersion.SIOPv2_D11) + } + } + const jwtVC1Validation = validateJWTVCPresentationProfile(authorizationRequestCopy) + if (jwtVC1Validation && isJWTVC1Payload(authorizationRequest)) { + versions.push(SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1) + } + const vid1Validation = AuthorizationRequestPayloadVID1Schema(authorizationRequestCopy) + if (vid1Validation && isID1Payload(authorizationRequest)) { + versions.push(SupportedVersion.SIOPv2_ID1) + } + if (versions.length === 0) { + throw new Error(errors.SIOP_VERSION_NOT_SUPPORTED) + } + return versions +} + +export const checkSIOPSpecVersionSupported = async ( + payload: AuthorizationRequestPayload, + supportedVersions: SupportedVersion[], +): Promise => { + const versions: SupportedVersion[] = authorizationRequestVersionDiscovery(payload) + if (!supportedVersions || supportedVersions.length === 0) { + return versions + } + return supportedVersions.filter((version) => versions.includes(version)) +} diff --git a/packages/siop-oid4vp/lib/helpers/State.ts b/packages/siop-oid4vp/lib/helpers/State.ts new file mode 100644 index 00000000..b67c357f --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/State.ts @@ -0,0 +1,21 @@ +import SHA from 'sha.js' +import { v4 as uuidv4 } from 'uuid' + +import { base64urlEncodeBuffer } from './Encodings' + +export function getNonce(state: string, nonce?: string) { + return nonce || toNonce(state) +} + +export function toNonce(input: string): string { + const buff = SHA('sha256').update(input).digest() + return base64urlEncodeBuffer(buff) +} + +export function getState(state?: string) { + return state || createState() +} + +export function createState(): string { + return uuidv4() +} diff --git a/packages/siop-oid4vp/lib/helpers/index.ts b/packages/siop-oid4vp/lib/helpers/index.ts new file mode 100644 index 00000000..c15804a7 --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/index.ts @@ -0,0 +1,8 @@ +export * from './Metadata' +export * from './Encodings' +export * from './HttpUtils' +export * from './Keys' +export * from './ObjectUtils' +export * from './Revocation' +export * from './State' +export * from './LanguageTagUtils' diff --git a/packages/siop-oid4vp/lib/helpers/jwtUtils.ts b/packages/siop-oid4vp/lib/helpers/jwtUtils.ts new file mode 100644 index 00000000..eb8776de --- /dev/null +++ b/packages/siop-oid4vp/lib/helpers/jwtUtils.ts @@ -0,0 +1,17 @@ +import { jwtDecode } from 'jwt-decode' + +import { JwtHeader, JwtPayload, SIOPErrors } from '../types' + +export type JwtType = 'id-token' | 'request-object' | 'verifier-attestation' + +export type JwtProtectionMethod = 'did' | 'x5c' | 'jwk' | 'custom' + +export function parseJWT(jwt: string) { + const header = jwtDecode(jwt, { header: true }) + const payload = jwtDecode(jwt, { header: false }) + + if (!payload || !header) { + throw new Error(SIOPErrors.NO_JWT) + } + return { header, payload } +} diff --git a/packages/siop-oid4vp/lib/id-token/IDToken.ts b/packages/siop-oid4vp/lib/id-token/IDToken.ts new file mode 100644 index 00000000..a5916d91 --- /dev/null +++ b/packages/siop-oid4vp/lib/id-token/IDToken.ts @@ -0,0 +1,233 @@ +import { AuthorizationResponseOpts, VerifyAuthorizationResponseOpts } from '../authorization-response' +import { assertValidVerifyOpts } from '../authorization-response/Opts' +import { parseJWT } from '../helpers/jwtUtils' +import { + getJwtVerifierWithContext, + IDTokenJwt, + IDTokenPayload, + JWK, + JwtHeader, + JWTPayload, + ResponseIss, + SIOPErrors, + VerifiedAuthorizationRequest, + VerifiedIDToken, +} from '../types' +import { JwtIssuer, JwtIssuerWithContext } from '../types/JwtIssuer' + +import { calculateJwkThumbprintUri } from './../helpers/Keys' +import { createIDTokenPayload } from './Payload' + +export class IDToken { + private _header?: JwtHeader + private _payload?: IDTokenPayload + private _jwt?: IDTokenJwt + private readonly _responseOpts: AuthorizationResponseOpts + + private constructor(jwt?: IDTokenJwt, payload?: IDTokenPayload, responseOpts?: AuthorizationResponseOpts) { + this._jwt = jwt + this._payload = payload + this._responseOpts = responseOpts + } + + public static async fromVerifiedAuthorizationRequest( + verifiedAuthorizationRequest: VerifiedAuthorizationRequest, + responseOpts: AuthorizationResponseOpts, + verifyOpts?: VerifyAuthorizationResponseOpts, + ) { + const authorizationRequestPayload = verifiedAuthorizationRequest.authorizationRequestPayload + if (!authorizationRequestPayload) { + throw new Error(SIOPErrors.NO_REQUEST) + } + const idToken = new IDToken(null, await createIDTokenPayload(verifiedAuthorizationRequest, responseOpts), responseOpts) + if (verifyOpts) { + await idToken.verify(verifyOpts) + } + return idToken + } + + public static async fromIDToken(idTokenJwt: IDTokenJwt, verifyOpts?: VerifyAuthorizationResponseOpts) { + if (!idTokenJwt) { + throw new Error(SIOPErrors.NO_JWT) + } + const idToken = new IDToken(idTokenJwt, undefined) + if (verifyOpts) { + await idToken.verify(verifyOpts) + } + return idToken + } + + public static async fromIDTokenPayload( + idTokenPayload: IDTokenPayload, + responseOpts: AuthorizationResponseOpts, + verifyOpts?: VerifyAuthorizationResponseOpts, + ) { + if (!idTokenPayload) { + throw new Error(SIOPErrors.NO_JWT) + } + const idToken = new IDToken(null, idTokenPayload, responseOpts) + if (verifyOpts) { + await idToken.verify(verifyOpts) + } + return idToken + } + + public async payload(): Promise { + if (!this._payload) { + if (!this._jwt) { + throw new Error(SIOPErrors.NO_JWT) + } + const { header, payload } = this.parseAndVerifyJwt() + this._header = header + this._payload = payload + } + return this._payload + } + + public async jwt(_jwtIssuer: JwtIssuer): Promise { + if (!this._jwt) { + if (!this.responseOpts) { + throw Error(SIOPErrors.BAD_IDTOKEN_RESPONSE_OPTS) + } + + const jwtIssuer: JwtIssuerWithContext = _jwtIssuer + ? { ..._jwtIssuer, type: 'id-token', authorizationResponseOpts: this.responseOpts } + : { method: 'custom', type: 'id-token', authorizationResponseOpts: this.responseOpts } + + if (jwtIssuer.method === 'custom') { + this._jwt = await this.responseOpts.createJwtCallback(jwtIssuer, { header: {}, payload: this._payload }) + } else if (jwtIssuer.method === 'did') { + const did = jwtIssuer.didUrl.split('#')[0] + this._payload.sub = did + + const issuer = this._responseOpts.registration.issuer || this._payload.iss + if (!issuer || !(issuer.includes(ResponseIss.SELF_ISSUED_V2) || issuer === this._payload.sub)) { + throw new Error(SIOPErrors.NO_SELF_ISSUED_ISS) + } + if (!this._payload.iss) { + this._payload.iss = issuer + } + + const header = { kid: jwtIssuer.didUrl, alg: jwtIssuer.alg, typ: 'JWT' } + this._jwt = await this.responseOpts.createJwtCallback({ ...jwtIssuer, type: 'id-token' }, { header, payload: this._payload }) + } else if (jwtIssuer.method === 'x5c') { + this._payload.iss = jwtIssuer.issuer + this._payload.sub = jwtIssuer.issuer + + const header = { x5c: jwtIssuer.x5c, typ: 'JWT' } + this._jwt = await this._responseOpts.createJwtCallback(jwtIssuer, { header, payload: this._payload }) + } else if (jwtIssuer.method === 'jwk') { + const jwkThumbprintUri = await calculateJwkThumbprintUri(jwtIssuer.jwk as JWK) + this._payload.sub = jwkThumbprintUri + this._payload.iss = jwkThumbprintUri + this._payload.sub_jwk = jwtIssuer.jwk + + const header = { jwk: jwtIssuer.jwk, alg: jwtIssuer.jwk.alg, typ: 'JWT' } + this._jwt = await this._responseOpts.createJwtCallback(jwtIssuer, { header, payload: this._payload }) + } else { + throw new Error(`JwtIssuer method '${(jwtIssuer as JwtIssuer).method}' not implemented`) + } + + const { header, payload } = this.parseAndVerifyJwt() + this._header = header + this._payload = payload + } + return this._jwt + } + + private parseAndVerifyJwt(): { header: JwtHeader; payload: IDTokenPayload } { + const { header, payload } = parseJWT(this._jwt) + this.assertValidResponseJWT({ header, payload }) + const idTokenPayload = payload as IDTokenPayload + return { header, payload: idTokenPayload } + } + + /** + * Verifies a SIOP ID Response JWT on the RP Side + * + * @param idToken ID token to be validated + * @param verifyOpts + */ + public async verify(verifyOpts: VerifyAuthorizationResponseOpts): Promise { + assertValidVerifyOpts(verifyOpts) + + if (!this._jwt) { + throw new Error(SIOPErrors.NO_JWT) + } + + const parsedJwt = parseJWT(this._jwt) + this.assertValidResponseJWT(parsedJwt) + const idTokenPayload = parsedJwt.payload as IDTokenPayload + + const jwtVerifier = await getJwtVerifierWithContext(parsedJwt, { type: 'id-token' }) + const verificationResult = await verifyOpts.verifyJwtCallback(jwtVerifier, { ...parsedJwt, raw: this._jwt }) + if (!verificationResult) { + throw Error(SIOPErrors.ERROR_VERIFYING_SIGNATURE) + } + + this.assertValidResponseJWT({ header: parsedJwt.header, verPayload: idTokenPayload, audience: verifyOpts.audience }) + // Enforces verifyPresentationCallback function on the RP side, + if (!verifyOpts?.verification.presentationVerificationCallback) { + throw new Error(SIOPErrors.VERIFIABLE_PRESENTATION_VERIFICATION_FUNCTION_MISSING) + } + return { + jwt: this._jwt, + payload: { ...idTokenPayload }, + verifyOpts, + } + } + + static async verify(idTokenJwt: IDTokenJwt, verifyOpts: VerifyAuthorizationResponseOpts): Promise { + const idToken = await IDToken.fromIDToken(idTokenJwt, verifyOpts) + const verifiedIdToken = await idToken.verify(verifyOpts) + + return { + ...verifiedIdToken, + } + } + + private assertValidResponseJWT(opts: { header: JwtHeader; payload?: JWTPayload; verPayload?: IDTokenPayload; audience?: string; nonce?: string }) { + if (!opts.header) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + if (opts.payload) { + if (!opts.payload.iss || !(opts.payload.iss.includes(ResponseIss.SELF_ISSUED_V2) || opts.payload.iss.startsWith('did:'))) { + throw new Error(`${SIOPErrors.NO_SELF_ISSUED_ISS}, got: ${opts.payload.iss}`) + } + } + + if (opts.verPayload) { + if (!opts.verPayload.nonce) { + throw Error(SIOPErrors.NO_NONCE) + // No need for our own expiration check. DID jwt already does that + /*} else if (!opts.verPayload.exp || opts.verPayload.exp < Date.now() / 1000) { + throw Error(SIOPErrors.EXPIRED); + /!*} else if (!opts.verPayload.iat || opts.verPayload.iat > (Date.now() / 1000)) { + throw Error(SIOPErrors.EXPIRED);*!/ + // todo: Add iat check + + */ + } + if ((opts.verPayload.aud && !opts.audience) || (!opts.verPayload.aud && opts.audience)) { + throw Error(SIOPErrors.NO_AUDIENCE) + } else if (opts.audience && opts.audience != opts.verPayload.aud) { + throw Error(SIOPErrors.INVALID_AUDIENCE) + } else if (opts.nonce && opts.nonce != opts.verPayload.nonce) { + throw Error(SIOPErrors.BAD_NONCE) + } + } + } + + get header(): JwtHeader { + return this._header + } + + get responseOpts(): AuthorizationResponseOpts { + return this._responseOpts + } + + public async isSelfIssued(): Promise { + const payload = await this.payload() + return payload.iss === ResponseIss.SELF_ISSUED_V2 || (payload.sub !== undefined && payload.sub === payload.iss) + } +} diff --git a/packages/siop-oid4vp/lib/id-token/Payload.ts b/packages/siop-oid4vp/lib/id-token/Payload.ts new file mode 100644 index 00000000..379e930b --- /dev/null +++ b/packages/siop-oid4vp/lib/id-token/Payload.ts @@ -0,0 +1,46 @@ +import { AuthorizationResponseOpts, mergeOAuth2AndOpenIdInRequestPayload } from '../authorization-response' +import { assertValidResponseOpts } from '../authorization-response/Opts' +import { authorizationRequestVersionDiscovery } from '../helpers/SIOPSpecVersion' +import { IDTokenPayload, ResponseIss, SIOPErrors, SupportedVersion, VerifiedAuthorizationRequest } from '../types' + +export const createIDTokenPayload = async ( + verifiedAuthorizationRequest: VerifiedAuthorizationRequest, + responseOpts: AuthorizationResponseOpts, +): Promise => { + await assertValidResponseOpts(responseOpts) + const authorizationRequestPayload = await verifiedAuthorizationRequest.authorizationRequest.mergedPayloads() + const requestObject = verifiedAuthorizationRequest.requestObject + if (!authorizationRequestPayload) { + throw new Error(SIOPErrors.VERIFY_BAD_PARAMS) + } + const payload = await mergeOAuth2AndOpenIdInRequestPayload(authorizationRequestPayload, requestObject) + + const state = payload.state + const nonce = payload.nonce + const SEC_IN_MS = 1000 + + const rpSupportedVersions = authorizationRequestVersionDiscovery(payload) + const maxRPVersion = rpSupportedVersions.reduce( + (previous, current) => (current.valueOf() > previous.valueOf() ? current : previous), + SupportedVersion.SIOPv2_D12_OID4VP_D18, + ) + if (responseOpts.version && rpSupportedVersions.length > 0 && !rpSupportedVersions.includes(responseOpts.version)) { + throw Error(`RP does not support spec version ${responseOpts.version}, supported versions: ${rpSupportedVersions.toString()}`) + } + const opVersion = responseOpts.version ?? maxRPVersion + + const idToken: IDTokenPayload = { + // fixme: ID11 does not use this static value anymore + iss: + responseOpts?.registration?.issuer ?? + (opVersion === SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1 ? ResponseIss.JWT_VC_PRESENTATION_V1 : ResponseIss.SELF_ISSUED_V2), + aud: responseOpts.audience || payload.client_id, + iat: Math.round(Date.now() / SEC_IN_MS - 60 * SEC_IN_MS), + exp: Math.round(Date.now() / SEC_IN_MS + (responseOpts.expiresIn || 600)), + ...(payload.auth_time && { auth_time: payload.auth_time }), + nonce, + state, + // ...(responseOpts.presentationExchange?._vp_token ? { _vp_token: responseOpts.presentationExchange._vp_token } : {}), + } + return idToken +} diff --git a/packages/siop-oid4vp/lib/id-token/index.ts b/packages/siop-oid4vp/lib/id-token/index.ts new file mode 100644 index 00000000..53343294 --- /dev/null +++ b/packages/siop-oid4vp/lib/id-token/index.ts @@ -0,0 +1,2 @@ +export * from './IDToken' +export * from './Payload' diff --git a/packages/siop-oid4vp/lib/index.ts b/packages/siop-oid4vp/lib/index.ts new file mode 100644 index 00000000..3829b607 --- /dev/null +++ b/packages/siop-oid4vp/lib/index.ts @@ -0,0 +1,12 @@ +import * as RPRegistrationMetadata from './authorization-request/RequestRegistration' +import { PresentationExchange } from './authorization-response/PresentationExchange' + +export * from './helpers' +export * from './types' +export * from './authorization-request' +export * from './authorization-response' +export * from './id-token' +export * from './request-object' +export * from './rp' +export * from './op' +export { PresentationExchange, RPRegistrationMetadata } diff --git a/packages/siop-oid4vp/lib/op/OP.ts b/packages/siop-oid4vp/lib/op/OP.ts new file mode 100644 index 00000000..b300dd5a --- /dev/null +++ b/packages/siop-oid4vp/lib/op/OP.ts @@ -0,0 +1,294 @@ +import { EventEmitter } from 'events' + +import { IIssuerId } from '@sphereon/ssi-types' +import { v4 as uuidv4 } from 'uuid' + +import { AuthorizationRequest, URI, VerifyAuthorizationRequestOpts } from '../authorization-request' +import { mergeVerificationOpts } from '../authorization-request/Opts' +import { + AuthorizationResponse, + AuthorizationResponseOpts, + AuthorizationResponseWithCorrelationId, + PresentationExchangeResponseOpts, +} from '../authorization-response' +import { encodeJsonAsURI, post } from '../helpers' +import { authorizationRequestVersionDiscovery } from '../helpers/SIOPSpecVersion' +import { + AuthorizationEvent, + AuthorizationEvents, + ContentType, + JwtIssuer, + ParsedAuthorizationRequestURI, + RegisterEventListener, + ResponseIss, + ResponseMode, + SIOPErrors, + SIOPResonse, + SupportedVersion, + UrlEncodingFormat, + Verification, + VerifiedAuthorizationRequest, +} from '../types' + +import { OPBuilder } from './OPBuilder' +import { createResponseOptsFromBuilderOrExistingOpts, createVerifyRequestOptsFromBuilderOrExistingOpts } from './Opts' + +// The OP publishes the formats it supports using the vp_formats_supported metadata parameter as defined above in its "openid-configuration". +export class OP { + private readonly _createResponseOptions: AuthorizationResponseOpts + private readonly _verifyRequestOptions: Partial + private readonly _eventEmitter?: EventEmitter + + private constructor(opts: { builder?: OPBuilder; responseOpts?: AuthorizationResponseOpts; verifyOpts?: VerifyAuthorizationRequestOpts }) { + this._createResponseOptions = { ...createResponseOptsFromBuilderOrExistingOpts(opts) } + this._verifyRequestOptions = { ...createVerifyRequestOptsFromBuilderOrExistingOpts(opts) } + this._eventEmitter = opts.builder?.eventEmitter + } + + /** + * This method tries to infer the SIOP specs version based on the request payload. + * If the version cannot be inferred or is not supported it throws an exception. + * This method needs to be called to ensure the OP can handle the request + * @param requestJwtOrUri + * @param requestOpts + */ + + public async verifyAuthorizationRequest( + requestJwtOrUri: string | URI, + requestOpts?: { correlationId?: string; verification?: Verification }, + ): Promise { + const correlationId = requestOpts?.correlationId || uuidv4() + const authorizationRequest = await AuthorizationRequest.fromUriOrJwt(requestJwtOrUri) + .then((result: AuthorizationRequest) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_RECEIVED_SUCCESS, { correlationId, subject: result }) + return result + }) + .catch((error: Error) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_RECEIVED_FAILED, { + correlationId, + subject: requestJwtOrUri, + error, + }) + throw error + }) + + return authorizationRequest + .verify(this.newVerifyAuthorizationRequestOpts({ ...requestOpts, correlationId })) + .then((verifiedAuthorizationRequest: VerifiedAuthorizationRequest) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_VERIFIED_SUCCESS, { + correlationId, + subject: verifiedAuthorizationRequest.authorizationRequest, + }) + return verifiedAuthorizationRequest + }) + .catch((error) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_VERIFIED_FAILED, { + correlationId, + subject: authorizationRequest, + error, + }) + throw error + }) + } + + public async createAuthorizationResponse( + verifiedAuthorizationRequest: VerifiedAuthorizationRequest, + responseOpts: { + jwtIssuer?: JwtIssuer + version?: SupportedVersion + correlationId?: string + audience?: string + issuer?: ResponseIss | string + verification?: Verification + presentationExchange?: PresentationExchangeResponseOpts + }, + ): Promise { + if ( + verifiedAuthorizationRequest.correlationId && + responseOpts?.correlationId && + verifiedAuthorizationRequest.correlationId !== responseOpts.correlationId + ) { + throw new Error( + `Request correlation id ${verifiedAuthorizationRequest.correlationId} is different from option correlation id ${responseOpts.correlationId}`, + ) + } + let version = responseOpts?.version + const rpSupportedVersions = authorizationRequestVersionDiscovery(await verifiedAuthorizationRequest.authorizationRequest.mergedPayloads()) + if (version && rpSupportedVersions.length > 0 && !rpSupportedVersions.includes(version)) { + throw Error(`RP does not support spec version ${version}, supported versions: ${rpSupportedVersions.toString()}`) + } else if (!version) { + version = rpSupportedVersions.reduce( + (previous, current) => (current.valueOf() > previous.valueOf() ? current : previous), + SupportedVersion.SIOPv2_ID1, + ) + } + const correlationId = responseOpts?.correlationId ?? verifiedAuthorizationRequest.correlationId ?? uuidv4() + try { + // IF using DIRECT_POST, the response_uri takes precedence over the redirect_uri + let responseUri = verifiedAuthorizationRequest.responseURI + if (verifiedAuthorizationRequest.authorizationRequestPayload.response_mode === ResponseMode.DIRECT_POST) { + responseUri = verifiedAuthorizationRequest.authorizationRequestPayload.response_uri ?? responseUri + } + + const response = await AuthorizationResponse.fromVerifiedAuthorizationRequest( + verifiedAuthorizationRequest, + this.newAuthorizationResponseOpts({ + ...responseOpts, + version, + correlationId, + }), + verifiedAuthorizationRequest.verifyOpts, + ) + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_CREATE_SUCCESS, { + correlationId, + subject: response, + }) + return { correlationId, response, responseURI: responseUri } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_CREATE_FAILED, { + correlationId, + subject: verifiedAuthorizationRequest.authorizationRequest, + error, + }) + throw error + } + } + + // TODO SK Can you please put some documentation on it? + public async submitAuthorizationResponse(authorizationResponse: AuthorizationResponseWithCorrelationId): Promise { + const { correlationId, response } = authorizationResponse + if (!correlationId) { + throw Error('No correlation Id provided') + } + if ( + !response || + (response.options?.responseMode && + !( + response.options.responseMode === ResponseMode.POST || + response.options.responseMode === ResponseMode.FORM_POST || + response.options.responseMode === ResponseMode.DIRECT_POST + )) + ) { + throw new Error(SIOPErrors.BAD_PARAMS) + } + + const payload = response.payload + const idToken = await response.idToken?.payload() + const responseUri = authorizationResponse.responseURI ?? idToken?.aud + if (!responseUri) { + throw Error('No response URI present') + } + const authResponseAsURI = encodeJsonAsURI(payload, { arraysWithIndex: ['presentation_submission', 'vp_token'] }) + return post(responseUri, authResponseAsURI, { contentType: ContentType.FORM_URL_ENCODED, exceptionOnHttpErrorStatus: true }) + .then((result: SIOPResonse) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_SENT_SUCCESS, { correlationId, subject: response }) + return result.origResponse + }) + .catch((error: Error) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_SENT_FAILED, { correlationId, subject: response, error }) + throw error + }) + } + + /** + * Create an Authentication Request Payload from a URI string + * + * @param encodedUri + */ + public async parseAuthorizationRequestURI(encodedUri: string): Promise { + const { scheme, requestObjectJwt, authorizationRequestPayload, registrationMetadata } = await URI.parseAndResolve(encodedUri) + + return { + encodedUri, + encodingFormat: UrlEncodingFormat.FORM_URL_ENCODED, + scheme: scheme, + requestObjectJwt, + authorizationRequestPayload, + registration: registrationMetadata, + } + } + + private newAuthorizationResponseOpts(opts: { + correlationId: string + version?: SupportedVersion + issuer?: IIssuerId | ResponseIss + audience?: string + presentationExchange?: PresentationExchangeResponseOpts + }): AuthorizationResponseOpts { + const version = opts.version ?? this._createResponseOptions.version + let issuer = opts.issuer ?? this._createResponseOptions?.registration?.issuer + if (version === SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1) { + issuer = ResponseIss.JWT_VC_PRESENTATION_V1 + } else if (version === SupportedVersion.SIOPv2_ID1) { + issuer = ResponseIss.SELF_ISSUED_V2 + } + + if (!issuer) { + throw Error(`No issuer value present. Either use IDv1, JWT VC Presentation profile version, or provide a DID as issuer value`) + } + // We are taking the whole presentationExchange object from a certain location + const presentationExchange = opts.presentationExchange ?? this._createResponseOptions.presentationExchange + const responseURI = opts.audience ?? this._createResponseOptions.responseURI + return { + ...this._createResponseOptions, + ...opts, + ...(presentationExchange && { presentationExchange }), + registration: { ...this._createResponseOptions?.registration, issuer }, + responseURI, + responseURIType: + this._createResponseOptions.responseURIType ?? (version < SupportedVersion.SIOPv2_D12_OID4VP_D18 && responseURI ? 'redirect_uri' : undefined), + } + } + + private newVerifyAuthorizationRequestOpts(requestOpts: { correlationId: string; verification?: Verification }): VerifyAuthorizationRequestOpts { + const verification: VerifyAuthorizationRequestOpts = { + ...this._verifyRequestOptions, + verifyJwtCallback: this._verifyRequestOptions.verifyJwtCallback, + ...requestOpts, + verification: mergeVerificationOpts(this._verifyRequestOptions, requestOpts), + correlationId: requestOpts.correlationId, + } + + return verification + } + + private async emitEvent( + type: AuthorizationEvents, + payload: { + correlationId: string + subject: AuthorizationRequest | AuthorizationResponse | string | URI + error?: Error + }, + ): Promise { + if (this._eventEmitter) { + this._eventEmitter.emit(type, new AuthorizationEvent(payload)) + } + } + + public addEventListener(register: RegisterEventListener) { + if (!this._eventEmitter) { + throw Error('Cannot add listeners if no event emitter is available') + } + const events = Array.isArray(register.event) ? register.event : [register.event] + for (const event of events) { + this._eventEmitter.addListener(event, register.listener) + } + } + + public static fromOpts(responseOpts: AuthorizationResponseOpts, verifyOpts: VerifyAuthorizationRequestOpts): OP { + return new OP({ responseOpts, verifyOpts }) + } + + public static builder() { + return new OPBuilder() + } + + get createResponseOptions(): AuthorizationResponseOpts { + return this._createResponseOptions + } + + get verifyRequestOptions(): Partial { + return this._verifyRequestOptions + } +} diff --git a/packages/siop-oid4vp/lib/op/OPBuilder.ts b/packages/siop-oid4vp/lib/op/OPBuilder.ts new file mode 100644 index 00000000..c27ab259 --- /dev/null +++ b/packages/siop-oid4vp/lib/op/OPBuilder.ts @@ -0,0 +1,115 @@ +import { EventEmitter } from 'events' + +import { Hasher, IIssuerId } from '@sphereon/ssi-types' + +import { PropertyTargets } from '../authorization-request' +import { PresentationSignCallback } from '../authorization-response' +import { ResponseIss, ResponseMode, ResponseRegistrationOpts, SupportedVersion, VerifyJwtCallback } from '../types' +import { CreateJwtCallback } from '../types/JwtIssuer' + +import { OP } from './OP' + +export class OPBuilder { + expiresIn?: number + issuer?: IIssuerId | ResponseIss + responseMode?: ResponseMode = ResponseMode.DIRECT_POST + responseRegistration?: Partial = {} + createJwtCallback?: CreateJwtCallback + verifyJwtCallback?: VerifyJwtCallback + presentationSignCallback?: PresentationSignCallback + supportedVersions?: SupportedVersion[] + eventEmitter?: EventEmitter + + hasher?: Hasher + + withHasher(hasher: Hasher): OPBuilder { + this.hasher = hasher + + return this + } + + withIssuer(issuer: ResponseIss | string): OPBuilder { + this.issuer = issuer + return this + } + + withExpiresIn(expiresIn: number): OPBuilder { + this.expiresIn = expiresIn + return this + } + + withResponseMode(responseMode: ResponseMode): OPBuilder { + this.responseMode = responseMode + return this + } + + withRegistration(responseRegistration: ResponseRegistrationOpts, targets?: PropertyTargets): OPBuilder { + this.responseRegistration = { + targets, + ...responseRegistration, + } + return this + } + + /*//TODO registration object creation + authorizationEndpoint?: Schema.OPENID | string; + scopesSupported?: Scope[] | Scope; + subjectTypesSupported?: SubjectType[] | SubjectType; + idTokenSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo; + requestObjectSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo; +*/ + + withCreateJwtCallback(createJwtCallback: CreateJwtCallback): OPBuilder { + this.createJwtCallback = createJwtCallback + return this + } + + withVerifyJwtCallback(verifyJwtCallback: VerifyJwtCallback): OPBuilder { + this.verifyJwtCallback = verifyJwtCallback + return this + } + + withSupportedVersions(supportedVersions: SupportedVersion[] | SupportedVersion | string[] | string): OPBuilder { + const versions = Array.isArray(supportedVersions) ? supportedVersions : [supportedVersions] + for (const version of versions) { + this.addSupportedVersion(version) + } + return this + } + + addSupportedVersion(supportedVersion: string | SupportedVersion): OPBuilder { + if (!this.supportedVersions) { + this.supportedVersions = [] + } + if (typeof supportedVersion === 'string') { + this.supportedVersions.push(SupportedVersion[supportedVersion]) + } else { + this.supportedVersions.push(supportedVersion) + } + return this + } + + withPresentationSignCallback(presentationSignCallback: PresentationSignCallback): OPBuilder { + this.presentationSignCallback = presentationSignCallback + return this + } + + withEventEmitter(eventEmitter?: EventEmitter): OPBuilder { + this.eventEmitter = eventEmitter ?? new EventEmitter() + return this + } + + build(): OP { + /*if (!this.responseRegistration) { + throw Error('You need to provide response registrations values') + } else */ /*if (!this.withSignature) { + throw Error('You need to supply withSignature values'); + } else */ if (!this.supportedVersions || this.supportedVersions.length === 0) { + this.supportedVersions = [SupportedVersion.SIOPv2_D11, SupportedVersion.SIOPv2_ID1, SupportedVersion.JWT_VC_PRESENTATION_PROFILE_v1] + } + // We ignore the private visibility, as we don't want others to use the OP directly + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return new OP({ builder: this }) + } +} diff --git a/packages/siop-oid4vp/lib/op/Opts.ts b/packages/siop-oid4vp/lib/op/Opts.ts new file mode 100644 index 00000000..7ea19624 --- /dev/null +++ b/packages/siop-oid4vp/lib/op/Opts.ts @@ -0,0 +1,72 @@ +import { VerifyAuthorizationRequestOpts } from '../authorization-request' +import { AuthorizationResponseOpts } from '../authorization-response' +import { LanguageTagUtils } from '../helpers' +import { AuthorizationResponseOptsSchema } from '../schemas' +import { PassBy, ResponseRegistrationOpts } from '../types' + +import { OPBuilder } from './OPBuilder' + +export const createResponseOptsFromBuilderOrExistingOpts = (opts: { + builder?: OPBuilder + responseOpts?: AuthorizationResponseOpts +}): AuthorizationResponseOpts => { + let responseOpts: AuthorizationResponseOpts + if (opts.builder) { + responseOpts = { + registration: { + issuer: opts.builder.issuer, + ...(opts.builder.responseRegistration as ResponseRegistrationOpts), + }, + expiresIn: opts.builder.expiresIn, + jwtIssuer: responseOpts?.jwtIssuer, + createJwtCallback: opts.builder.createJwtCallback, + responseMode: opts.builder.responseMode, + ...(responseOpts?.version + ? { version: responseOpts.version } + : Array.isArray(opts.builder.supportedVersions) && opts.builder.supportedVersions.length > 0 + ? { version: opts.builder.supportedVersions[0] } + : {}), + } + + if (!responseOpts.registration.passBy) { + responseOpts.registration.passBy = PassBy.VALUE + } + const languageTagEnabledFieldsNames = ['clientName', 'clientPurpose'] + const languageTaggedFields: Map = LanguageTagUtils.getLanguageTaggedProperties( + opts.builder.responseRegistration, + languageTagEnabledFieldsNames, + ) + + languageTaggedFields.forEach((value: string, key: string) => { + responseOpts.registration[key] = value + }) + } else { + responseOpts = { + ...opts.responseOpts, + } + } + + const valid = AuthorizationResponseOptsSchema(responseOpts) + if (!valid) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + throw new Error('OP builder validation error: ' + JSON.stringify(AuthorizationResponseOptsSchema.errors)) + } + + return responseOpts +} + +export const createVerifyRequestOptsFromBuilderOrExistingOpts = (opts: { + builder?: OPBuilder + verifyOpts?: VerifyAuthorizationRequestOpts +}): VerifyAuthorizationRequestOpts => { + return opts.builder + ? { + verifyJwtCallback: opts.builder.verifyJwtCallback, + hasher: opts.builder.hasher, + verification: {}, + supportedVersions: opts.builder.supportedVersions, + correlationId: undefined, + } + : opts.verifyOpts +} diff --git a/packages/siop-oid4vp/lib/op/index.ts b/packages/siop-oid4vp/lib/op/index.ts new file mode 100644 index 00000000..c3a5427a --- /dev/null +++ b/packages/siop-oid4vp/lib/op/index.ts @@ -0,0 +1,2 @@ +export * from './OP' +export * from './OPBuilder' diff --git a/packages/siop-oid4vp/lib/request-object/Opts.ts b/packages/siop-oid4vp/lib/request-object/Opts.ts new file mode 100644 index 00000000..465b5201 --- /dev/null +++ b/packages/siop-oid4vp/lib/request-object/Opts.ts @@ -0,0 +1,22 @@ +import { ClaimPayloadCommonOpts } from '../authorization-request' +import { PassBy, SIOPErrors } from '../types' + +import { RequestObjectOpts } from './types' + +export const assertValidRequestObjectOpts = (opts: RequestObjectOpts, checkRequestObject: boolean) => { + if (!opts) { + throw new Error(SIOPErrors.BAD_PARAMS) + } else if (opts.passBy !== PassBy.REFERENCE && opts.passBy !== PassBy.VALUE) { + throw new Error(SIOPErrors.REQUEST_OBJECT_TYPE_NOT_SET) + } else if (opts.passBy === PassBy.REFERENCE && !opts.reference_uri) { + throw new Error(SIOPErrors.NO_REFERENCE_URI) + } else if (!opts.payload) { + if (opts.reference_uri) { + // reference URI, but no actual payload to host there! + throw Error(SIOPErrors.REFERENCE_URI_NO_PAYLOAD) + } else if (checkRequestObject) { + throw Error(SIOPErrors.BAD_PARAMS) + } + } + // assertValidRequestRegistrationOpts(opts['registration'] ? opts['registration'] : opts['clientMetadata']); +} diff --git a/packages/siop-oid4vp/lib/request-object/Payload.ts b/packages/siop-oid4vp/lib/request-object/Payload.ts new file mode 100644 index 00000000..13d88776 --- /dev/null +++ b/packages/siop-oid4vp/lib/request-object/Payload.ts @@ -0,0 +1,61 @@ +import { v4 as uuidv4 } from 'uuid' + +import { CreateAuthorizationRequestOpts, createPresentationDefinitionClaimsProperties } from '../authorization-request' +import { createRequestRegistration } from '../authorization-request/RequestRegistration' +import { getNonce, getState, removeNullUndefined } from '../helpers' +import { RequestObjectPayload, ResponseMode, ResponseType, Scope, SIOPErrors, SupportedVersion } from '../types' + +import { assertValidRequestObjectOpts } from './Opts' + +export const createRequestObjectPayload = async (opts: CreateAuthorizationRequestOpts): Promise => { + assertValidRequestObjectOpts(opts.requestObject, false) + if (!opts.requestObject?.payload) { + return undefined // No request object apparently + } + assertValidRequestObjectOpts(opts.requestObject, true) + + const payload = opts.requestObject.payload + + const state = getState(payload.state) + const registration = await createRequestRegistration(opts.clientMetadata, opts) + const claims = createPresentationDefinitionClaimsProperties(payload.claims) + + const metadataKey = opts.version >= SupportedVersion.SIOPv2_D11.valueOf() ? 'client_metadata' : 'registration' + const clientId = payload.client_id ?? registration.payload[metadataKey]?.client_id + + const now = Math.round(new Date().getTime() / 1000) + const validInSec = 120 // todo config/option + const iat = payload.iat ?? now + const nbf = payload.nbf ?? iat + const exp = payload.exp ?? iat + validInSec + const jti = payload.jti ?? uuidv4() + + return removeNullUndefined({ + response_type: payload.response_type ?? ResponseType.ID_TOKEN, + scope: payload.scope ?? Scope.OPENID, + //TODO implement /.well-known/openid-federation support in the OP side to resolve the client_id (URL) and retrieve the metadata + client_id: clientId, + client_id_scheme: opts.requestObject.payload.client_id_scheme, + ...(payload.redirect_uri && { redirect_uri: payload.redirect_uri }), + ...(payload.response_uri && { response_uri: payload.response_uri }), + response_mode: payload.response_mode ?? ResponseMode.DIRECT_POST, + ...(payload.id_token_hint && { id_token_hint: payload.id_token_hint }), + registration_uri: registration.clientMetadataOpts.reference_uri, + nonce: getNonce(state, payload.nonce), + state, + ...registration.payload, + claims, + presentation_definition_uri: payload.presentation_definition_uri, + presentation_definition: payload.presentation_definition, + iat, + nbf, + exp, + jti, + }) +} + +export const assertValidRequestObjectPayload = (verPayload: RequestObjectPayload): void => { + if (verPayload['registration_uri'] && verPayload['registration']) { + throw new Error(`${SIOPErrors.REG_OBJ_N_REG_URI_CANT_BE_SET_SIMULTANEOUSLY}`) + } +} diff --git a/packages/siop-oid4vp/lib/request-object/RequestObject.ts b/packages/siop-oid4vp/lib/request-object/RequestObject.ts new file mode 100644 index 00000000..da606bbb --- /dev/null +++ b/packages/siop-oid4vp/lib/request-object/RequestObject.ts @@ -0,0 +1,170 @@ +import { ClaimPayloadCommonOpts, ClaimPayloadOptsVID1, CreateAuthorizationRequestOpts } from '../authorization-request' +import { assertValidAuthorizationRequestOpts } from '../authorization-request/Opts' +import { fetchByReferenceOrUseByValue, removeNullUndefined } from '../helpers' +import { parseJWT } from '../helpers/jwtUtils' +import { AuthorizationRequestPayload, JwtIssuer, JwtIssuerWithContext, RequestObjectJwt, RequestObjectPayload, SIOPErrors } from '../types' + +import { assertValidRequestObjectOpts } from './Opts' +import { assertValidRequestObjectPayload, createRequestObjectPayload } from './Payload' +import { RequestObjectOpts } from './types' + +export class RequestObject { + private payload: RequestObjectPayload + private jwt?: RequestObjectJwt + private readonly opts: RequestObjectOpts + + private constructor( + opts?: CreateAuthorizationRequestOpts | RequestObjectOpts, + payload?: RequestObjectPayload, + jwt?: string, + ) { + this.opts = opts ? RequestObject.mergeOAuth2AndOpenIdProperties(opts) : undefined + this.payload = payload + this.jwt = jwt + } + + /** + * Create a request object that typically is used as a JWT on RP side, typically this method is called automatically when creating an Authorization Request, but you could use it directly! + * + * @param authorizationRequestOpts Request Object options to build a Request Object + * @remarks This method is used to generate a SIOP request Object. + * First it generates the request object payload, and then it a signed JWT can be accessed on request. + * + * Normally you will want to use the Authorization Request class. That class creates a URI that includes the JWT from this class in the URI + * If you do use this class directly, you can call the `convertRequestObjectToURI` afterwards to get the URI. + * Please note that the Authorization Request allows you to differentiate between OAuth2 and OpenID parameters that become + * part of the URI and which become part of the Request Object. If you generate a URI based upon the result of this class, + * the URI will be constructed based on the Request Object only! + */ + public static async fromOpts(authorizationRequestOpts: CreateAuthorizationRequestOpts) { + assertValidAuthorizationRequestOpts(authorizationRequestOpts) + const createJwtCallback = authorizationRequestOpts.requestObject.createJwtCallback // We copy the signature separately as it can contain a function, which would be removed in the merge function below + const jwtIssuer = authorizationRequestOpts.requestObject.jwtIssuer // We copy the signature separately as it can contain a function, which would be removed in the merge function below + const requestObjectOpts = RequestObject.mergeOAuth2AndOpenIdProperties(authorizationRequestOpts) + const mergedOpts = { + ...authorizationRequestOpts, + requestObject: { ...authorizationRequestOpts.requestObject, ...requestObjectOpts, createJwtCallback, jwtIssuer }, + } + return new RequestObject(mergedOpts, await createRequestObjectPayload(mergedOpts)) + } + + public static async fromJwt(requestObjectJwt: RequestObjectJwt) { + return requestObjectJwt ? new RequestObject(undefined, undefined, requestObjectJwt) : undefined + } + + public static async fromPayload(requestObjectPayload: RequestObjectPayload, authorizationRequestOpts: CreateAuthorizationRequestOpts) { + return new RequestObject(authorizationRequestOpts, requestObjectPayload) + } + + public static async fromAuthorizationRequestPayload(payload: AuthorizationRequestPayload): Promise { + const requestObjectJwt = + payload.request || payload.request_uri ? await fetchByReferenceOrUseByValue(payload.request_uri, payload.request, true) : undefined + return requestObjectJwt ? await RequestObject.fromJwt(requestObjectJwt) : undefined + } + + public async toJwt(): Promise { + if (!this.jwt) { + if (!this.opts) { + throw Error(SIOPErrors.BAD_PARAMS) + } else if (!this.payload) { + return undefined + } + this.removeRequestProperties() + if (this.payload.registration_uri) { + delete this.payload.registration + } + assertValidRequestObjectPayload(this.payload) + + const jwtIssuer: JwtIssuerWithContext = this.opts.jwtIssuer + ? { ...this.opts.jwtIssuer, type: 'request-object' } + : { method: 'custom', type: 'request-object' } + + if (jwtIssuer.method === 'custom') { + this.jwt = await this.opts.createJwtCallback(jwtIssuer, { header: {}, payload: this.payload }) + } else if (jwtIssuer.method === 'did') { + const did = jwtIssuer.didUrl.split('#')[0] + this.payload.iss = this.payload.iss ?? did + this.payload.sub = this.payload.sub ?? did + this.payload.client_id = this.payload.client_id ?? did + + const header = { kid: jwtIssuer.didUrl, alg: jwtIssuer.alg, typ: 'JWT' } + this.jwt = await this.opts.createJwtCallback(jwtIssuer, { header, payload: this.payload }) + } else if (jwtIssuer.method === 'x5c') { + this.payload.iss = jwtIssuer.issuer + this.payload.client_id = jwtIssuer.issuer + this.payload.redirect_uri = jwtIssuer.issuer + this.payload.client_id_scheme = jwtIssuer.clientIdScheme + + const header = { x5c: jwtIssuer.x5c, typ: 'JWT' } + this.jwt = await this.opts.createJwtCallback(jwtIssuer, { header, payload: this.payload }) + } else if (jwtIssuer.method === 'jwk') { + if (!this.payload.client_id) { + throw new Error('Please provide a client_id for the RP') + } + + const header = { jwk: jwtIssuer.jwk, typ: 'JWT', alg: jwtIssuer.jwk.alg as string } + this.jwt = await this.opts.createJwtCallback(jwtIssuer, { header, payload: this.payload }) + } else { + throw new Error(`JwtIssuer method '${(jwtIssuer as JwtIssuer).method}' not implemented`) + } + } + return this.jwt + } + + public async getPayload(): Promise { + if (!this.payload) { + if (!this.jwt) { + return undefined + } + this.payload = removeNullUndefined(parseJWT(this.jwt).payload) as RequestObjectPayload + this.removeRequestProperties() + if (this.payload.registration_uri) { + delete this.payload.registration + } else if (this.payload.registration) { + delete this.payload.registration_uri + } + } + assertValidRequestObjectPayload(this.payload) + return this.payload + } + + public async assertValid(): Promise { + if (this.options) { + assertValidRequestObjectOpts(this.options, false) + } + assertValidRequestObjectPayload(await this.getPayload()) + } + + public get options(): RequestObjectOpts | undefined { + return this.opts + } + + private removeRequestProperties(): void { + if (this.payload) { + // https://openid.net/specs/openid-connect-core-1_0.html#RequestObject + // request and request_uri parameters MUST NOT be included in Request Objects. + delete this.payload.request + delete this.payload.request_uri + } + } + + private static mergeOAuth2AndOpenIdProperties( + opts: CreateAuthorizationRequestOpts | RequestObjectOpts, + ): RequestObjectOpts { + if (!opts) { + throw Error(SIOPErrors.BAD_PARAMS) + } + const isAuthReq = opts['requestObject'] !== undefined + const mergedOpts = JSON.parse(JSON.stringify(opts)) + const createJwtCallback = opts['requestObject']?.createJwtCallback + if (createJwtCallback) { + mergedOpts.requestObject.createJwtCallback = createJwtCallback + } + const jwtIssuer = opts['requestObject']?.jwtIssuer + if (createJwtCallback) { + mergedOpts.requestObject.jwtIssuer = jwtIssuer + } + delete mergedOpts?.request?.requestObject + return isAuthReq ? mergedOpts.requestObject : mergedOpts + } +} diff --git a/packages/siop-oid4vp/lib/request-object/index.ts b/packages/siop-oid4vp/lib/request-object/index.ts new file mode 100644 index 00000000..1ac61c7e --- /dev/null +++ b/packages/siop-oid4vp/lib/request-object/index.ts @@ -0,0 +1,3 @@ +export * from './RequestObject' +export * from './types' +export * from './Payload' diff --git a/packages/siop-oid4vp/lib/request-object/types.ts b/packages/siop-oid4vp/lib/request-object/types.ts new file mode 100644 index 00000000..2283b19f --- /dev/null +++ b/packages/siop-oid4vp/lib/request-object/types.ts @@ -0,0 +1,9 @@ +import { ClaimPayloadCommonOpts, RequestObjectPayloadOpts } from '../authorization-request' +import { ObjectBy } from '../types' +import { CreateJwtCallback, JwtIssuer } from '../types/JwtIssuer' + +export interface RequestObjectOpts extends ObjectBy { + payload?: RequestObjectPayloadOpts // for pass by value + createJwtCallback: CreateJwtCallback + jwtIssuer: JwtIssuer +} diff --git a/packages/siop-oid4vp/lib/rp/InMemoryRPSessionManager.ts b/packages/siop-oid4vp/lib/rp/InMemoryRPSessionManager.ts new file mode 100644 index 00000000..5c3bd170 --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/InMemoryRPSessionManager.ts @@ -0,0 +1,263 @@ +import { EventEmitter } from 'events' + +import { AuthorizationRequest } from '../authorization-request' +import { AuthorizationResponse } from '../authorization-response' +import { + AuthorizationEvent, + AuthorizationEvents, + AuthorizationRequestState, + AuthorizationRequestStateStatus, + AuthorizationResponseState, + AuthorizationResponseStateStatus, +} from '../types' + +import { IRPSessionManager } from './types' + +/** + * Please note that this session manager is not really meant to be used in large production settings, as it stores everything in memory! + * It also doesn't do scheduled cleanups. It runs a cleanup whenever a request or response is received. In a high-volume production setting you will want scheduled cleanups running in the background + * Since this is a low level library we have not created a full-fledged implementation. + * We suggest to create your own implementation using the event system of the library + */ +export class InMemoryRPSessionManager implements IRPSessionManager { + private readonly authorizationRequests: Record = {} + private readonly authorizationResponses: Record = {} + + // stored by hashcode + private readonly nonceMapping: Record = {} + // stored by hashcode + private readonly stateMapping: Record = {} + private readonly maxAgeInSeconds: number + + private static getKeysForCorrelationId(mapping: Record, correlationId: string): number[] { + return Object.entries(mapping) + .filter((entry) => entry[1] === correlationId) + .map((filtered) => Number.parseInt(filtered[0])) + } + + public constructor(eventEmitter: EventEmitter, opts?: { maxAgeInSeconds?: number }) { + if (!eventEmitter) { + throw Error('RP Session manager depends on an event emitter in the application') + } + this.maxAgeInSeconds = opts?.maxAgeInSeconds ?? 5 * 60 + eventEmitter.on(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_SUCCESS, this.onAuthorizationRequestCreatedSuccess.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_FAILED, this.onAuthorizationRequestCreatedFailed.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_REQUEST_SENT_SUCCESS, this.onAuthorizationRequestSentSuccess.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_REQUEST_SENT_FAILED, this.onAuthorizationRequestSentFailed.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_RESPONSE_RECEIVED_SUCCESS, this.onAuthorizationResponseReceivedSuccess.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_RESPONSE_RECEIVED_FAILED, this.onAuthorizationResponseReceivedFailed.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_RESPONSE_VERIFIED_SUCCESS, this.onAuthorizationResponseVerifiedSuccess.bind(this)) + eventEmitter.on(AuthorizationEvents.ON_AUTH_RESPONSE_VERIFIED_FAILED, this.onAuthorizationResponseVerifiedFailed.bind(this)) + } + + async getRequestStateByCorrelationId(correlationId: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('correlationId', correlationId, this.authorizationRequests, errorOnNotFound) + } + + async getRequestStateByNonce(nonce: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('nonce', nonce, this.authorizationRequests, errorOnNotFound) + } + + async getRequestStateByState(state: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('state', state, this.authorizationRequests, errorOnNotFound) + } + + async getResponseStateByCorrelationId(correlationId: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('correlationId', correlationId, this.authorizationResponses, errorOnNotFound) + } + + async getResponseStateByNonce(nonce: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('nonce', nonce, this.authorizationResponses, errorOnNotFound) + } + + async getResponseStateByState(state: string, errorOnNotFound?: boolean): Promise { + return await this.getFromMapping('state', state, this.authorizationResponses, errorOnNotFound) + } + + private async getFromMapping( + type: 'nonce' | 'state' | 'correlationId', + value: string, + mapping: Record, + errorOnNotFound?: boolean, + ): Promise { + const correlationId = await this.getCorrelationIdImpl(type, value, errorOnNotFound) + const result = mapping[correlationId] as T + if (!result && errorOnNotFound) { + throw Error(`Could not find ${type} from correlation id ${correlationId}`) + } + return result + } + + private async onAuthorizationRequestCreatedSuccess(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + this.updateState('request', event, AuthorizationRequestStateStatus.CREATED).catch((error) => console.log(JSON.stringify(error))) + } + + private async onAuthorizationRequestCreatedFailed(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + this.updateState('request', event, AuthorizationRequestStateStatus.ERROR).catch((error) => console.log(JSON.stringify(error))) + } + + private async onAuthorizationRequestSentSuccess(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + this.updateState('request', event, AuthorizationRequestStateStatus.SENT).catch((error) => console.log(JSON.stringify(error))) + } + + private async onAuthorizationRequestSentFailed(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + this.updateState('request', event, AuthorizationRequestStateStatus.ERROR).catch((error) => console.log(JSON.stringify(error))) + } + + private async onAuthorizationResponseReceivedSuccess(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + await this.updateState('response', event, AuthorizationResponseStateStatus.RECEIVED) + } + + private async onAuthorizationResponseReceivedFailed(event: AuthorizationEvent): Promise { + this.cleanup().catch((error) => console.log(JSON.stringify(error))) + await this.updateState('response', event, AuthorizationResponseStateStatus.ERROR) + } + + private async onAuthorizationResponseVerifiedFailed(event: AuthorizationEvent): Promise { + await this.updateState('response', event, AuthorizationResponseStateStatus.ERROR) + } + + private async onAuthorizationResponseVerifiedSuccess(event: AuthorizationEvent): Promise { + await this.updateState('response', event, AuthorizationResponseStateStatus.VERIFIED) + } + + public async getCorrelationIdByNonce(nonce: string, errorOnNotFound?: boolean): Promise { + return await this.getCorrelationIdImpl('nonce', nonce, errorOnNotFound) + } + + public async getCorrelationIdByState(state: string, errorOnNotFound?: boolean): Promise { + return await this.getCorrelationIdImpl('state', state, errorOnNotFound) + } + + private async getCorrelationIdImpl( + type: 'nonce' | 'state' | 'correlationId', + value: string, + errorOnNotFound?: boolean, + ): Promise { + if (!value || !type) { + throw Error('No type or value provided') + } + if (type === 'correlationId') { + return value + } + const hash = await hashCode(value) + const correlationId = type === 'nonce' ? this.nonceMapping[hash] : this.stateMapping[hash] + if (!correlationId && errorOnNotFound) { + throw Error(`Could not find ${type} value for ${value}`) + } + return correlationId + } + + private async updateMapping( + mapping: Record, + event: AuthorizationEvent, + key: string, + value: string | undefined, + allowExisting: boolean, + ) { + const hash = await hashcodeForValue(event, key) + const existing = mapping[hash] + if (existing) { + if (!allowExisting) { + throw Error(`Mapping exists for key ${key} and we do not allow overwriting values`) + } else if (value && existing !== value) { + throw Error('Value changed for key') + } + } + if (!value) { + delete mapping[hash] + } else { + mapping[hash] = value + } + } + + private async updateState( + type: 'request' | 'response', + event: AuthorizationEvent, + status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus, + ): Promise { + if (!event) { + throw new Error('event not present') + } else if (!event.correlationId) { + throw new Error(`'${type} ${status}' event without correlation id received`) + } + try { + const eventState = { + correlationId: event.correlationId, + ...(type === 'request' ? { request: event.subject } : {}), + ...(type === 'response' ? { response: event.subject } : {}), + ...(event.error ? { error: event.error } : {}), + status, + timestamp: event.timestamp, + lastUpdated: event.timestamp, + } + if (type === 'request') { + this.authorizationRequests[event.correlationId] = eventState as AuthorizationRequestState + // We do not await these + this.updateMapping(this.nonceMapping, event, 'nonce', event.correlationId, true).catch((error) => console.log(JSON.stringify(error))) + this.updateMapping(this.stateMapping, event, 'state', event.correlationId, true).catch((error) => console.log(JSON.stringify(error))) + } else { + this.authorizationResponses[event.correlationId] = eventState as AuthorizationResponseState + } + } catch (error: unknown) { + console.log(`Error in update state happened: ${error}`) + // TODO VDX-166 handle error + } + } + + async deleteStateForCorrelationId(correlationId: string) { + InMemoryRPSessionManager.cleanMappingForCorrelationId(this.nonceMapping, correlationId).catch((error) => console.log(JSON.stringify(error))) + InMemoryRPSessionManager.cleanMappingForCorrelationId(this.stateMapping, correlationId).catch((error) => console.log(JSON.stringify(error))) + delete this.authorizationRequests[correlationId] + delete this.authorizationResponses[correlationId] + } + private static async cleanMappingForCorrelationId(mapping: Record, correlationId: string): Promise { + const keys = InMemoryRPSessionManager.getKeysForCorrelationId(mapping, correlationId) + if (keys && keys.length > 0) { + keys.forEach((key) => delete mapping[key]) + } + } + + private async cleanup() { + const now = Date.now() + const maxAgeInMS = this.maxAgeInSeconds * 1000 + + const cleanupCorrelations = (reqByCorrelationId: [string, AuthorizationRequestState | AuthorizationResponseState]) => { + const correlationId = reqByCorrelationId[0] + const authRequest = reqByCorrelationId[1] + if (authRequest) { + const ts = authRequest.lastUpdated || authRequest.timestamp + if (maxAgeInMS !== 0 && now > ts + maxAgeInMS) { + this.deleteStateForCorrelationId(correlationId) + } + } + } + + Object.entries(this.authorizationRequests).forEach((reqByCorrelationId) => { + cleanupCorrelations.call(this, reqByCorrelationId) + }) + Object.entries(this.authorizationResponses).forEach((resByCorrelationId) => { + cleanupCorrelations.call(this, resByCorrelationId) + }) + } +} + +async function hashcodeForValue(event: AuthorizationEvent, key: string): Promise { + const value = (await event.subject.getMergedProperty(key)) as string + if (!value) { + throw Error(`No value found for key ${key} in Authorization Request`) + } + return hashCode(value) +} + +function hashCode(s: string): number { + let h = 1 + for (let i = 0; i < s.length; i++) h = (Math.imul(31, h) + s.charCodeAt(i)) | 0 + + return h +} diff --git a/packages/siop-oid4vp/lib/rp/Opts.ts b/packages/siop-oid4vp/lib/rp/Opts.ts new file mode 100644 index 00000000..0808fc77 --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/Opts.ts @@ -0,0 +1,95 @@ +import { CreateAuthorizationRequestOpts, PropertyTarget, PropertyTargets, RequestPropertyWithTargets } from '../authorization-request' +import { VerifyAuthorizationResponseOpts } from '../authorization-response' +// import { CreateAuthorizationRequestOptsSchema } from '../schemas'; +import { ClientMetadataOpts, RequestObjectPayload, SIOPErrors, Verification } from '../types' + +import { RPBuilder } from './RPBuilder' + +export const createRequestOptsFromBuilderOrExistingOpts = (opts: { builder?: RPBuilder; createRequestOpts?: CreateAuthorizationRequestOpts }) => { + const version = opts.builder ? opts.builder.getSupportedRequestVersion() : opts.createRequestOpts.version + if (!version) { + throw Error(SIOPErrors.NO_REQUEST_VERSION) + } + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + const createRequestOpts: CreateAuthorizationRequestOpts = opts.builder + ? { + version, + payload: { + ...opts.builder.authorizationRequestPayload, + // ...(isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, opts.builder.requestObjectBy.targets) ? {passBy: opts.builder.requestObjectBy.passBy, request_uri: opts.buigfdlder.requestObjectBy.referenceUri}: {}) + //response_types_supported: opts.builder.clientMetadata?.responseTypesSupported, + // subject_types_supported: opts.builder.clientMetadata?.subjectTypesSupported, + // request_object_signing_alg_values_supported: opts.builder.clientMetadata?.requestObjectSigningAlgValuesSupported + //scopes_supported: opts.builder.clientMetadata?.scopesSupported, + }, + requestObject: { + ...opts.builder.requestObjectBy, + payload: { + ...(opts.builder.requestObjectPayload as RequestObjectPayload), + subject_types_supported: opts.builder.clientMetadata?.subjectTypesSupported, + request_object_signing_alg_values_supported: opts.builder.clientMetadata?.requestObjectSigningAlgValuesSupported, + }, + createJwtCallback: opts.builder.createJwtCallback, + }, + clientMetadata: opts.builder.clientMetadata as ClientMetadataOpts, + } + : opts.createRequestOpts + + /*const valid = true; // fixme: re-enable schema: CreateAuthorizationRequestOptsSchema(createRequestOpts); + if (!valid) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore + throw new Error('RP builder validation error: ' + JSON.stringify(CreateAuthorizationRequestOptsSchema.errors)); + }*/ + return createRequestOpts +} + +export const createVerifyResponseOptsFromBuilderOrExistingOpts = (opts: { builder?: RPBuilder; verifyOpts?: VerifyAuthorizationResponseOpts }) => { + return opts.builder + ? { + hasher: opts.builder.hasher, + verifyJwtCallback: opts.builder.verifyJwtCallback, + verification: { + presentationVerificationCallback: opts.builder.presentationVerificationCallback, + supportedVersions: opts.builder.supportedVersions, + revocationOpts: { + revocationVerification: opts.builder.revocationVerification, + revocationVerificationCallback: opts.builder.revocationVerificationCallback, + }, + replayRegistry: opts.builder.sessionManager, + } as Verification, + audience: opts.builder.clientId || opts.builder.clientMetadata?.client_id, + } + : opts.verifyOpts +} + +export const isTargetOrNoTargets = (searchTarget: PropertyTarget, targets?: PropertyTargets): boolean => { + if (!targets) { + return true + } + return isTarget(searchTarget, targets) +} + +export const isTarget = (searchTarget: PropertyTarget, targets: PropertyTargets): boolean => { + return Array.isArray(targets) ? targets.includes(searchTarget) : targets === searchTarget +} + +export const assignIfAuth = (opt: RequestPropertyWithTargets, isDefaultTarget?: boolean): T => { + if ( + isDefaultTarget + ? isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, opt.targets) + : isTarget(PropertyTarget.AUTHORIZATION_REQUEST, opt.targets) + ) { + return opt.propertyValue + } + return undefined +} + +export const assignIfRequestObject = (opt: RequestPropertyWithTargets, isDefaultTarget?: boolean): T => { + if (isDefaultTarget ? isTargetOrNoTargets(PropertyTarget.REQUEST_OBJECT, opt.targets) : isTarget(PropertyTarget.REQUEST_OBJECT, opt.targets)) { + return opt.propertyValue + } + return undefined +} diff --git a/packages/siop-oid4vp/lib/rp/RP.ts b/packages/siop-oid4vp/lib/rp/RP.ts new file mode 100644 index 00000000..cc13e45f --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/RP.ts @@ -0,0 +1,378 @@ +import { EventEmitter } from 'events' + +import { Hasher } from '@sphereon/ssi-types' +import { v4 as uuidv4 } from 'uuid' + +import { + AuthorizationRequest, + ClaimPayloadCommonOpts, + CreateAuthorizationRequestOpts, + PropertyTarget, + RequestObjectPayloadOpts, + RequestPropertyWithTargets, + URI, +} from '../authorization-request' +import { mergeVerificationOpts } from '../authorization-request/Opts' +import { AuthorizationResponse, PresentationDefinitionWithLocation, VerifyAuthorizationResponseOpts } from '../authorization-response' +import { getNonce, getState } from '../helpers' +import { JwtIssuer, PassBy } from '../types' +import { + AuthorizationEvent, + AuthorizationEvents, + AuthorizationResponsePayload, + RegisterEventListener, + ResponseURIType, + SIOPErrors, + SupportedVersion, + Verification, + VerifiedAuthorizationResponse, +} from '../types' + +import { createRequestOptsFromBuilderOrExistingOpts, createVerifyResponseOptsFromBuilderOrExistingOpts, isTargetOrNoTargets } from './Opts' +import { RPBuilder } from './RPBuilder' +import { IRPSessionManager } from './types' + +export class RP { + get sessionManager(): IRPSessionManager { + return this._sessionManager + } + + private readonly _createRequestOptions: CreateAuthorizationRequestOpts + private readonly _verifyResponseOptions: Partial + private readonly _eventEmitter?: EventEmitter + private readonly _sessionManager?: IRPSessionManager + + private constructor(opts: { + builder?: RPBuilder + createRequestOpts?: CreateAuthorizationRequestOpts + verifyResponseOpts?: VerifyAuthorizationResponseOpts + }) { + // const claims = opts.builder?.claims || opts.createRequestOpts?.payload.claims; + this._createRequestOptions = createRequestOptsFromBuilderOrExistingOpts(opts) + this._verifyResponseOptions = { ...createVerifyResponseOptsFromBuilderOrExistingOpts(opts) } + this._eventEmitter = opts.builder?.eventEmitter + this._sessionManager = opts.builder?.sessionManager + } + + public static fromRequestOpts(opts: CreateAuthorizationRequestOpts): RP { + return new RP({ createRequestOpts: opts }) + } + + public static builder(opts?: { requestVersion?: SupportedVersion }): RPBuilder { + return RPBuilder.newInstance(opts?.requestVersion) + } + + public async createAuthorizationRequest(opts: { + correlationId: string + nonce: string | RequestPropertyWithTargets + state: string | RequestPropertyWithTargets + jwtIssuer?: JwtIssuer + claims?: ClaimPayloadCommonOpts | RequestPropertyWithTargets + version?: SupportedVersion + requestByReferenceURI?: string + responseURI?: string + responseURIType?: ResponseURIType + }): Promise { + const authorizationRequestOpts = this.newAuthorizationRequestOpts(opts) + return AuthorizationRequest.fromOpts(authorizationRequestOpts) + .then((authorizationRequest: AuthorizationRequest) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_SUCCESS, { + correlationId: opts.correlationId, + subject: authorizationRequest, + }) + return authorizationRequest + }) + .catch((error: Error) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_FAILED, { + correlationId: opts.correlationId, + error, + }) + throw error + }) + } + + public async createAuthorizationRequestURI(opts: { + correlationId: string + nonce: string | RequestPropertyWithTargets + state: string | RequestPropertyWithTargets + jwtIssuer?: JwtIssuer + claims?: ClaimPayloadCommonOpts | RequestPropertyWithTargets + version?: SupportedVersion + requestByReferenceURI?: string + responseURI?: string + responseURIType?: ResponseURIType + }): Promise { + const authorizationRequestOpts = this.newAuthorizationRequestOpts(opts) + + return await URI.fromOpts(authorizationRequestOpts) + .then(async (uri: URI) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_SUCCESS, { + correlationId: opts.correlationId, + subject: await AuthorizationRequest.fromOpts(authorizationRequestOpts), + }) + return uri + }) + .catch((error: Error) => { + void this.emitEvent(AuthorizationEvents.ON_AUTH_REQUEST_CREATED_FAILED, { + correlationId: opts.correlationId, + error, + }) + throw error + }) + } + + public async signalAuthRequestRetrieved(opts: { correlationId: string; error?: Error }) { + if (!this.sessionManager) { + throw Error(`Cannot signal auth request retrieval when no session manager is registered`) + } + const state = await this.sessionManager.getRequestStateByCorrelationId(opts.correlationId, true) + void this.emitEvent(opts?.error ? AuthorizationEvents.ON_AUTH_REQUEST_SENT_FAILED : AuthorizationEvents.ON_AUTH_REQUEST_SENT_SUCCESS, { + correlationId: opts.correlationId, + ...(!opts?.error ? { subject: state.request } : {}), + ...(opts?.error ? { error: opts.error } : {}), + }) + } + + public async verifyAuthorizationResponse( + authorizationResponsePayload: AuthorizationResponsePayload, + opts?: { + correlationId?: string + hasher?: Hasher + audience?: string + state?: string + nonce?: string + verification?: Verification + presentationDefinitions?: PresentationDefinitionWithLocation | PresentationDefinitionWithLocation[] + }, + ): Promise { + const state = opts?.state || this.verifyResponseOptions.state + let correlationId: string | undefined = opts?.correlationId || state + let authorizationResponse: AuthorizationResponse + try { + authorizationResponse = await AuthorizationResponse.fromPayload(authorizationResponsePayload) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } catch (error: any) { + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_RECEIVED_FAILED, { + correlationId: correlationId ?? uuidv4(), // correlation id cannot be derived from state in payload possible, hence a uuid as fallback + subject: authorizationResponsePayload, + error, + }) + throw error + } + + try { + const verifyAuthenticationResponseOpts = await this.newVerifyAuthorizationResponseOpts(authorizationResponse, { + ...opts, + correlationId, + }) + correlationId = verifyAuthenticationResponseOpts.correlationId ?? correlationId + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_RECEIVED_SUCCESS, { + correlationId, + subject: authorizationResponse, + }) + + const verifiedAuthorizationResponse = await authorizationResponse.verify(verifyAuthenticationResponseOpts) + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_VERIFIED_SUCCESS, { + correlationId, + subject: authorizationResponse, + }) + return verifiedAuthorizationResponse + } catch (error) { + void this.emitEvent(AuthorizationEvents.ON_AUTH_RESPONSE_VERIFIED_FAILED, { + correlationId, + subject: authorizationResponse, + error, + }) + throw error + } + } + + get createRequestOptions(): CreateAuthorizationRequestOpts { + return this._createRequestOptions + } + + get verifyResponseOptions(): Partial { + return this._verifyResponseOptions + } + + private newAuthorizationRequestOpts(opts: { + correlationId: string + nonce: string | RequestPropertyWithTargets + state: string | RequestPropertyWithTargets + jwtIssuer?: JwtIssuer + claims?: ClaimPayloadCommonOpts | RequestPropertyWithTargets + version?: SupportedVersion + requestByReferenceURI?: string + responseURIType?: ResponseURIType + responseURI?: string + }): CreateAuthorizationRequestOpts { + const nonceWithTarget = + typeof opts.nonce === 'string' + ? { propertyValue: opts.nonce, targets: PropertyTarget.REQUEST_OBJECT } + : (opts?.nonce as RequestPropertyWithTargets) + const stateWithTarget = + typeof opts.state === 'string' + ? { propertyValue: opts.state, targets: PropertyTarget.REQUEST_OBJECT } + : (opts?.state as RequestPropertyWithTargets) + const claimsWithTarget = + opts?.claims && !('propertyValue' in opts.claims) + ? { propertyValue: opts.claims, targets: PropertyTarget.REQUEST_OBJECT } + : (opts?.claims as RequestPropertyWithTargets) + + const version = opts?.version ?? this._createRequestOptions.version + if (!version) { + throw Error(SIOPErrors.NO_REQUEST_VERSION) + } + const referenceURI = opts.requestByReferenceURI ?? this._createRequestOptions?.requestObject?.reference_uri + + let responseURIType: ResponseURIType = opts?.responseURIType + let responseURI = this._createRequestOptions.requestObject.payload?.redirect_uri ?? this._createRequestOptions.payload?.redirect_uri + if (responseURI) { + responseURIType = 'redirect_uri' + } else { + responseURI = + opts.responseURI ?? this._createRequestOptions.requestObject.payload?.response_uri ?? this._createRequestOptions.payload?.response_uri + responseURIType = opts?.responseURIType ?? 'response_uri' + } + if (!responseURI) { + throw Error(`A response or redirect URI is required at this point`) + } else { + if (responseURIType === 'redirect_uri') { + if (this._createRequestOptions?.requestObject?.payload) { + this._createRequestOptions.requestObject.payload.redirect_uri = responseURI + } + if (!referenceURI && !this._createRequestOptions.payload?.redirect_uri) { + this._createRequestOptions.payload.redirect_uri = responseURI + } + } else if (responseURIType === 'response_uri') { + if (this._createRequestOptions?.requestObject?.payload) { + this._createRequestOptions.requestObject.payload.response_uri = responseURI + } + if (!referenceURI && !this._createRequestOptions.payload?.response_uri) { + this._createRequestOptions.payload.response_uri = responseURI + } + } + } + + const newOpts = { ...this._createRequestOptions, version } + newOpts.requestObject = { ...newOpts.requestObject, jwtIssuer: opts.jwtIssuer } + + newOpts.requestObject.payload = newOpts.requestObject.payload ?? ({} as RequestObjectPayloadOpts) + newOpts.payload = newOpts.payload ?? {} + if (referenceURI) { + if (newOpts.requestObject.passBy && newOpts.requestObject.passBy !== PassBy.REFERENCE) { + throw Error(`Cannot pass by reference with uri ${referenceURI} when mode is ${newOpts.requestObject.passBy}`) + } + newOpts.requestObject.reference_uri = referenceURI + newOpts.requestObject.passBy = PassBy.REFERENCE + } + + const state = getState(stateWithTarget.propertyValue) + if (stateWithTarget.propertyValue) { + if (isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, stateWithTarget.targets)) { + newOpts.payload.state = state + } + if (isTargetOrNoTargets(PropertyTarget.REQUEST_OBJECT, stateWithTarget.targets)) { + newOpts.requestObject.payload.state = state + } + } + + const nonce = getNonce(state, nonceWithTarget.propertyValue) + if (nonceWithTarget.propertyValue) { + if (isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, nonceWithTarget.targets)) { + newOpts.payload.nonce = nonce + } + if (isTargetOrNoTargets(PropertyTarget.REQUEST_OBJECT, nonceWithTarget.targets)) { + newOpts.requestObject.payload.nonce = nonce + } + } + if (claimsWithTarget?.propertyValue) { + if (isTargetOrNoTargets(PropertyTarget.AUTHORIZATION_REQUEST, claimsWithTarget.targets)) { + newOpts.payload.claims = { ...newOpts.payload.claims, ...claimsWithTarget.propertyValue } + } + if (isTargetOrNoTargets(PropertyTarget.REQUEST_OBJECT, claimsWithTarget.targets)) { + newOpts.requestObject.payload.claims = { ...newOpts.requestObject.payload.claims, ...claimsWithTarget.propertyValue } + } + } + return newOpts + } + + private async newVerifyAuthorizationResponseOpts( + authorizationResponse: AuthorizationResponse, + opts: { + correlationId: string + hasher?: Hasher + state?: string + nonce?: string + verification?: Verification + audience?: string + presentationDefinitions?: PresentationDefinitionWithLocation | PresentationDefinitionWithLocation[] + }, + ): Promise { + let correlationId = opts?.correlationId ?? this._verifyResponseOptions.correlationId + let state = opts?.state ?? this._verifyResponseOptions.state + let nonce = opts?.nonce ?? this._verifyResponseOptions.nonce + if (this.sessionManager) { + const resNonce = (await authorizationResponse.getMergedProperty('nonce', { + consistencyCheck: false, + hasher: opts.hasher ?? this._verifyResponseOptions.hasher, + })) as string + const resState = (await authorizationResponse.getMergedProperty('state', { + consistencyCheck: false, + hasher: opts.hasher ?? this._verifyResponseOptions.hasher, + })) as string + if (resNonce && !correlationId) { + correlationId = await this.sessionManager.getCorrelationIdByNonce(resNonce, false) + } + if (!correlationId) { + correlationId = await this.sessionManager.getCorrelationIdByState(resState, false) + } + if (!correlationId) { + correlationId = nonce + } + const requestState = await this.sessionManager.getRequestStateByCorrelationId(correlationId, false) + if (requestState) { + const reqNonce: string = await requestState.request.getMergedProperty('nonce') + const reqState: string = await requestState.request.getMergedProperty('state') + nonce = nonce ?? reqNonce + state = state ?? reqState + } + } + + return { + ...this._verifyResponseOptions, + verifyJwtCallback: this._verifyResponseOptions.verifyJwtCallback, + ...opts, + correlationId, + audience: opts?.audience ?? this._verifyResponseOptions.audience ?? this._createRequestOptions.payload.client_id, + state, + nonce, + verification: mergeVerificationOpts(this._verifyResponseOptions, opts), + presentationDefinitions: opts?.presentationDefinitions ?? this._verifyResponseOptions.presentationDefinitions, + } + } + + private async emitEvent( + type: AuthorizationEvents, + payload: { correlationId: string; subject?: AuthorizationRequest | AuthorizationResponse | AuthorizationResponsePayload; error?: Error }, + ): Promise { + if (this._eventEmitter) { + try { + this._eventEmitter.emit(type, new AuthorizationEvent(payload)) + } catch (e) { + //Let's make sure events do not cause control flow issues + console.log(`Could not emit event ${type} for ${payload.correlationId} initial error if any: ${payload?.error}`) + } + } + } + + public addEventListener(register: RegisterEventListener) { + if (!this._eventEmitter) { + throw Error('Cannot add listeners if no event emitter is available') + } + const events = Array.isArray(register.event) ? register.event : [register.event] + for (const event of events) { + this._eventEmitter.addListener(event, register.listener) + } + } +} diff --git a/packages/siop-oid4vp/lib/rp/RPBuilder.ts b/packages/siop-oid4vp/lib/rp/RPBuilder.ts new file mode 100644 index 00000000..cf7174dc --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/RPBuilder.ts @@ -0,0 +1,317 @@ +import { EventEmitter } from 'events' + +import { IPresentationDefinition } from '@sphereon/pex' +import { Hasher } from '@sphereon/ssi-types' + +import { PropertyTarget, PropertyTargets } from '../authorization-request' +import { PresentationVerificationCallback } from '../authorization-response' +import { CreateJwtCallback, VerifyJwtCallback } from '../types' +import { + AuthorizationRequestPayload, + ClientMetadataOpts, + ObjectBy, + PassBy, + RequestObjectPayload, + ResponseIss, + ResponseMode, + ResponseType, + RevocationVerification, + RevocationVerificationCallback, + SupportedVersion, +} from '../types' + +import { assignIfAuth, assignIfRequestObject, isTarget, isTargetOrNoTargets } from './Opts' +import { RP } from './RP' +import { IRPSessionManager } from './types' + +export class RPBuilder { + requestObjectBy: ObjectBy + createJwtCallback?: CreateJwtCallback + verifyJwtCallback?: VerifyJwtCallback + revocationVerification?: RevocationVerification + revocationVerificationCallback?: RevocationVerificationCallback + presentationVerificationCallback?: PresentationVerificationCallback + supportedVersions: SupportedVersion[] + eventEmitter?: EventEmitter + sessionManager?: IRPSessionManager + private _authorizationRequestPayload: Partial = {} + private _requestObjectPayload: Partial = {} + + clientMetadata?: ClientMetadataOpts = undefined + clientId: string + + hasher: Hasher + + private constructor(supportedRequestVersion?: SupportedVersion) { + if (supportedRequestVersion) { + this.addSupportedVersion(supportedRequestVersion) + } + } + + withScope(scope: string, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.scope = assignIfAuth({ propertyValue: scope, targets }, false) + this._requestObjectPayload.scope = assignIfRequestObject({ propertyValue: scope, targets }, true) + return this + } + + withResponseType(responseType: ResponseType | ResponseType[] | string, targets?: PropertyTargets): RPBuilder { + const propertyValue = Array.isArray(responseType) ? responseType.join(' ').trim() : responseType + this._authorizationRequestPayload.response_type = assignIfAuth({ propertyValue, targets }, false) + this._requestObjectPayload.response_type = assignIfRequestObject({ propertyValue, targets }, true) + return this + } + + withHasher(hasher: Hasher): RPBuilder { + this.hasher = hasher + + return this + } + + withClientId(clientId: string, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.client_id = assignIfAuth({ propertyValue: clientId, targets }, false) + this._requestObjectPayload.client_id = assignIfRequestObject({ propertyValue: clientId, targets }, true) + this.clientId = clientId + return this + } + + withIssuer(issuer: ResponseIss, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.iss = assignIfAuth({ propertyValue: issuer, targets }, false) + this._requestObjectPayload.iss = assignIfRequestObject({ propertyValue: issuer, targets }, true) + return this + } + + withPresentationVerification(presentationVerificationCallback: PresentationVerificationCallback): RPBuilder { + this.presentationVerificationCallback = presentationVerificationCallback + return this + } + + withRevocationVerification(mode: RevocationVerification): RPBuilder { + this.revocationVerification = mode + return this + } + + withRevocationVerificationCallback(callback: RevocationVerificationCallback): RPBuilder { + this.revocationVerificationCallback = callback + return this + } + + withAuthorizationEndpoint(authorizationEndpoint: string, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.authorization_endpoint = assignIfAuth( + { + propertyValue: authorizationEndpoint, + targets, + }, + false, + ) + this._requestObjectPayload.authorization_endpoint = assignIfRequestObject( + { + propertyValue: authorizationEndpoint, + targets, + }, + true, + ) + return this + } + + withRedirectUri(redirectUri: string, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.redirect_uri = assignIfAuth({ propertyValue: redirectUri, targets }, false) + this._requestObjectPayload.redirect_uri = assignIfRequestObject({ propertyValue: redirectUri, targets }, true) + return this + } + + withRequestByReference(referenceUri: string): RPBuilder { + return this.withRequestBy(PassBy.REFERENCE, referenceUri /*, PropertyTarget.AUTHORIZATION_REQUEST*/) + } + withRequestByValue(): RPBuilder { + return this.withRequestBy(PassBy.VALUE, undefined /*, PropertyTarget.AUTHORIZATION_REQUEST*/) + } + + withRequestBy(passBy: PassBy, referenceUri?: string /*, targets?: PropertyTargets*/): RPBuilder { + if (passBy === PassBy.REFERENCE && !referenceUri) { + throw Error('Cannot use pass by reference without a reference URI') + } + this.requestObjectBy = { + passBy, + reference_uri: referenceUri, + targets: PropertyTarget.AUTHORIZATION_REQUEST, + } + return this + } + + withResponseMode(responseMode: ResponseMode, targets?: PropertyTargets): RPBuilder { + this._authorizationRequestPayload.response_mode = assignIfAuth({ propertyValue: responseMode, targets }, false) + this._requestObjectPayload.response_mode = assignIfRequestObject({ propertyValue: responseMode, targets }, true) + return this + } + + withClientMetadata(clientMetadata: ClientMetadataOpts, targets?: PropertyTargets): RPBuilder { + clientMetadata.targets = targets + if (this.getSupportedRequestVersion() < SupportedVersion.SIOPv2_D11) { + this._authorizationRequestPayload.registration = assignIfAuth( + { + propertyValue: clientMetadata, + targets, + }, + false, + ) + this._requestObjectPayload.registration = assignIfRequestObject( + { + propertyValue: clientMetadata, + targets, + }, + true, + ) + } else { + this._authorizationRequestPayload.client_metadata = assignIfAuth( + { + propertyValue: clientMetadata, + targets, + }, + false, + ) + this._requestObjectPayload.client_metadata = assignIfRequestObject( + { + propertyValue: clientMetadata, + targets, + }, + true, + ) + } + this.clientMetadata = clientMetadata + //fixme: Add URL + return this + } + + withCreateJwtCallback(createJwtCallback: CreateJwtCallback): RPBuilder { + this.createJwtCallback = createJwtCallback + return this + } + + withVerifyJwtCallback(verifyJwtCallback: VerifyJwtCallback): RPBuilder { + this.verifyJwtCallback = verifyJwtCallback + return this + } + + withPresentationDefinition(definitionOpts: { definition: IPresentationDefinition; definitionUri?: string }, targets?: PropertyTargets): RPBuilder { + const { definition, definitionUri } = definitionOpts + + if (this.getSupportedRequestVersion() < SupportedVersion.SIOPv2_D11) { + const definitionProperties = { + presentation_definition: definition, + presentation_definition_uri: definitionUri, + } + const vp_token = { ...definitionProperties } + if (isTarget(PropertyTarget.AUTHORIZATION_REQUEST, targets)) { + this._authorizationRequestPayload.claims = { + ...(this._authorizationRequestPayload.claims ? this._authorizationRequestPayload.claims : {}), + vp_token: vp_token, + } + } + if (isTargetOrNoTargets(PropertyTarget.REQUEST_OBJECT, targets)) { + this._requestObjectPayload.claims = { + ...(this._requestObjectPayload.claims ? this._requestObjectPayload.claims : {}), + vp_token: vp_token, + } + } + } else { + this._authorizationRequestPayload.presentation_definition = assignIfAuth( + { + propertyValue: definition, + targets, + }, + false, + ) + this._authorizationRequestPayload.presentation_definition_uri = assignIfAuth( + { + propertyValue: definitionUri, + targets, + }, + true, + ) + this._requestObjectPayload.presentation_definition = assignIfRequestObject( + { + propertyValue: definition, + targets, + }, + true, + ) + this._requestObjectPayload.presentation_definition_uri = assignIfRequestObject( + { + propertyValue: definitionUri, + targets, + }, + true, + ) + } + return this + } + + private initSupportedVersions() { + if (!this.supportedVersions) { + this.supportedVersions = [] + } + } + + addSupportedVersion(supportedVersion: SupportedVersion): RPBuilder { + this.initSupportedVersions() + if (!this.supportedVersions.includes(supportedVersion)) { + this.supportedVersions.push(supportedVersion) + } + return this + } + + withSupportedVersions(supportedVersion: SupportedVersion[] | SupportedVersion): RPBuilder { + const versions = Array.isArray(supportedVersion) ? supportedVersion : [supportedVersion] + for (const version of versions) { + this.addSupportedVersion(version) + } + return this + } + + withEventEmitter(eventEmitter?: EventEmitter): RPBuilder { + this.eventEmitter = eventEmitter ?? new EventEmitter() + return this + } + + withSessionManager(sessionManager: IRPSessionManager): RPBuilder { + this.sessionManager = sessionManager + return this + } + + public getSupportedRequestVersion(requireVersion?: boolean): SupportedVersion | undefined { + if (!this.supportedVersions || this.supportedVersions.length === 0) { + if (requireVersion !== false) { + throw Error('No supported version supplied/available') + } + return undefined + } + return this.supportedVersions[0] + } + + public static newInstance(supportedVersion?: SupportedVersion) { + return new RPBuilder(supportedVersion) + } + + build(): RP { + if (this.sessionManager && !this.eventEmitter) { + throw Error('Please enable the event emitter on the RP when using a replay registry') + } + + // We do not want others to directly use the RP class + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return new RP({ builder: this }) + } + + get authorizationRequestPayload(): Partial { + return this._authorizationRequestPayload + } + + get requestObjectPayload(): Partial { + return this._requestObjectPayload + } + + /* public mergedPayload(): Partial { + return { ...this.authorizationRequestPayload, ...this.requestObjectPayload }; + }*/ +} diff --git a/packages/siop-oid4vp/lib/rp/index.ts b/packages/siop-oid4vp/lib/rp/index.ts new file mode 100644 index 00000000..2b24b00b --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/index.ts @@ -0,0 +1,4 @@ +export * from './RP' +export * from './RPBuilder' +export * from './InMemoryRPSessionManager' +export * from './types' diff --git a/packages/siop-oid4vp/lib/rp/types.ts b/packages/siop-oid4vp/lib/rp/types.ts new file mode 100644 index 00000000..ffe9be37 --- /dev/null +++ b/packages/siop-oid4vp/lib/rp/types.ts @@ -0,0 +1,21 @@ +import { AuthorizationRequestState, AuthorizationResponseState } from '../types' + +export interface IRPSessionManager { + getRequestStateByCorrelationId(correlationId: string, errorOnNotFound?: boolean): Promise + + getRequestStateByNonce(nonce: string, errorOnNotFound?: boolean): Promise + + getRequestStateByState(state: string, errorOnNotFound?: boolean): Promise + + getResponseStateByCorrelationId(correlationId: string, errorOnNotFound?: boolean): Promise + + getResponseStateByNonce(nonce: string, errorOnNotFound?: boolean): Promise + + getResponseStateByState(state: string, errorOnNotFound?: boolean): Promise + + getCorrelationIdByNonce(nonce: string, errorOnNotFound?: boolean): Promise + + getCorrelationIdByState(state: string, errorOnNotFound?: boolean): Promise + + deleteStateForCorrelationId(correlationId: string) +} diff --git a/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD11.schema.ts b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD11.schema.ts new file mode 100644 index 00000000..f90c6d82 --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD11.schema.ts @@ -0,0 +1,1054 @@ +export const AuthorizationRequestPayloadVD11SchemaObj = { + "$id": "AuthorizationRequestPayloadVD11Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthorizationRequestPayloadVD11", + "definitions": { + "AuthorizationRequestPayloadVD11": { + "type": "object", + "properties": { + "id_token_type": { + "type": "string" + }, + "client_metadata": { + "$ref": "#/definitions/RPRegistrationMetadataPayload" + }, + "client_metadata_uri": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "aud": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "iat": { + "type": "number" + }, + "nbf": { + "type": "number" + }, + "type": { + "type": "string" + }, + "exp": { + "type": "number" + }, + "rexp": { + "type": "number" + }, + "jti": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "response_type": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseType" + }, + { + "type": "string" + } + ] + }, + "client_id": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + }, + "id_token_hint": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "state": { + "type": "string" + }, + "response_mode": { + "$ref": "#/definitions/ResponseMode" + }, + "request": { + "type": "string" + }, + "request_uri": { + "type": "string" + }, + "claims": { + "$ref": "#/definitions/ClaimPayloadCommon" + }, + "presentation_definition": { + "anyOf": [ + { + "$ref": "#/definitions/PresentationDefinitionV1" + }, + { + "$ref": "#/definitions/PresentationDefinitionV2" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV1" + } + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV2" + } + } + ] + }, + "presentation_definition_uri": { + "type": "string" + } + } + }, + "RPRegistrationMetadataPayload": { + "type": "object", + "properties": { + "client_id": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "vp_formats": { + "anyOf": [ + { + "$ref": "#/definitions/Format" + }, + {} + ] + }, + "client_name": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "logo_uri": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + }, + "client_purpose": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + } + } + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "ClaimPayloadCommon": { + "type": "object" + }, + "PresentationDefinitionV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV1" + } + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "SubmissionRequirement": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "rule": { + "$ref": "#/definitions/Rules" + }, + "count": { + "type": "number" + }, + "min": { + "type": "number" + }, + "max": { + "type": "number" + }, + "from": { + "type": "string" + }, + "from_nested": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + } + }, + "required": [ + "rule" + ], + "additionalProperties": false + }, + "Rules": { + "type": "string", + "enum": [ + "all", + "pick" + ] + }, + "InputDescriptorV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV1" + } + }, + "required": [ + "id", + "schema" + ], + "additionalProperties": false + }, + "Schema": { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "required": { + "type": "boolean" + } + }, + "required": [ + "uri" + ], + "additionalProperties": false + }, + "Issuance": { + "type": "object", + "properties": { + "manifest": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "ConstraintsV1": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV1" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "Optionality": { + "type": "string", + "enum": [ + "required", + "preferred" + ] + }, + "Statuses": { + "type": "object", + "properties": { + "active": { + "$ref": "#/definitions/PdStatus" + }, + "suspended": { + "$ref": "#/definitions/PdStatus" + }, + "revoked": { + "$ref": "#/definitions/PdStatus" + } + }, + "additionalProperties": false + }, + "PdStatus": { + "type": "object", + "properties": { + "directive": { + "$ref": "#/definitions/Directives" + } + }, + "additionalProperties": false + }, + "Directives": { + "type": "string", + "enum": [ + "required", + "allowed", + "disallowed" + ] + }, + "FieldV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV1" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV1": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "OneOfNumberStringBoolean": { + "type": [ + "boolean", + "number", + "string" + ] + }, + "OneOfNumberString": { + "type": [ + "number", + "string" + ] + }, + "HolderSubject": { + "type": "object", + "properties": { + "field_id": { + "type": "array", + "items": { + "type": "string" + } + }, + "directive": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "field_id", + "directive" + ], + "additionalProperties": false + }, + "PresentationDefinitionV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV2" + } + }, + "frame": { + "type": "object" + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "InputDescriptorV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV2" + } + }, + "required": [ + "id", + "constraints" + ], + "additionalProperties": false + }, + "ConstraintsV2": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV2" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "FieldV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV2" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV2": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "FilterV2Base": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "additionalProperties": false + }, + "FilterV2BaseItems": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD18.schema.ts b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD18.schema.ts new file mode 100644 index 00000000..49f6d03d --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD18.schema.ts @@ -0,0 +1,1069 @@ +export const AuthorizationRequestPayloadVD12OID4VPD18SchemaObj = { + "$id": "AuthorizationRequestPayloadVD12OID4VPD18Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthorizationRequestPayloadVD12OID4VPD18", + "definitions": { + "AuthorizationRequestPayloadVD12OID4VPD18": { + "type": "object", + "properties": { + "id_token_type": { + "type": "string" + }, + "client_metadata": { + "$ref": "#/definitions/RPRegistrationMetadataPayload" + }, + "client_metadata_uri": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "aud": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "iat": { + "type": "number" + }, + "nbf": { + "type": "number" + }, + "type": { + "type": "string" + }, + "exp": { + "type": "number" + }, + "rexp": { + "type": "number" + }, + "jti": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "response_type": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseType" + }, + { + "type": "string" + } + ] + }, + "client_id": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + }, + "id_token_hint": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "state": { + "type": "string" + }, + "response_mode": { + "$ref": "#/definitions/ResponseMode" + }, + "request": { + "type": "string" + }, + "request_uri": { + "type": "string" + }, + "claims": { + "$ref": "#/definitions/ClaimPayloadCommon" + }, + "presentation_definition": { + "anyOf": [ + { + "$ref": "#/definitions/PresentationDefinitionV1" + }, + { + "$ref": "#/definitions/PresentationDefinitionV2" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV1" + } + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV2" + } + } + ] + }, + "presentation_definition_uri": { + "type": "string" + }, + "client_id_scheme": { + "$ref": "#/definitions/ClientIdSchemeOID4VPD18" + }, + "response_uri": { + "type": "string" + } + } + }, + "RPRegistrationMetadataPayload": { + "type": "object", + "properties": { + "client_id": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "vp_formats": { + "anyOf": [ + { + "$ref": "#/definitions/Format" + }, + {} + ] + }, + "client_name": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "logo_uri": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + }, + "client_purpose": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + } + } + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "ClaimPayloadCommon": { + "type": "object" + }, + "PresentationDefinitionV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV1" + } + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "SubmissionRequirement": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "rule": { + "$ref": "#/definitions/Rules" + }, + "count": { + "type": "number" + }, + "min": { + "type": "number" + }, + "max": { + "type": "number" + }, + "from": { + "type": "string" + }, + "from_nested": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + } + }, + "required": [ + "rule" + ], + "additionalProperties": false + }, + "Rules": { + "type": "string", + "enum": [ + "all", + "pick" + ] + }, + "InputDescriptorV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV1" + } + }, + "required": [ + "id", + "schema" + ], + "additionalProperties": false + }, + "Schema": { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "required": { + "type": "boolean" + } + }, + "required": [ + "uri" + ], + "additionalProperties": false + }, + "Issuance": { + "type": "object", + "properties": { + "manifest": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "ConstraintsV1": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV1" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "Optionality": { + "type": "string", + "enum": [ + "required", + "preferred" + ] + }, + "Statuses": { + "type": "object", + "properties": { + "active": { + "$ref": "#/definitions/PdStatus" + }, + "suspended": { + "$ref": "#/definitions/PdStatus" + }, + "revoked": { + "$ref": "#/definitions/PdStatus" + } + }, + "additionalProperties": false + }, + "PdStatus": { + "type": "object", + "properties": { + "directive": { + "$ref": "#/definitions/Directives" + } + }, + "additionalProperties": false + }, + "Directives": { + "type": "string", + "enum": [ + "required", + "allowed", + "disallowed" + ] + }, + "FieldV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV1" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV1": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "OneOfNumberStringBoolean": { + "type": [ + "boolean", + "number", + "string" + ] + }, + "OneOfNumberString": { + "type": [ + "number", + "string" + ] + }, + "HolderSubject": { + "type": "object", + "properties": { + "field_id": { + "type": "array", + "items": { + "type": "string" + } + }, + "directive": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "field_id", + "directive" + ], + "additionalProperties": false + }, + "PresentationDefinitionV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV2" + } + }, + "frame": { + "type": "object" + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "InputDescriptorV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV2" + } + }, + "required": [ + "id", + "constraints" + ], + "additionalProperties": false + }, + "ConstraintsV2": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV2" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "FieldV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV2" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV2": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "FilterV2Base": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "additionalProperties": false + }, + "FilterV2BaseItems": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "ClientIdSchemeOID4VPD18": { + "type": "string", + "enum": [ + "pre-registered", + "redirect_uri", + "entity_id", + "did" + ] + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD20.schema.ts b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD20.schema.ts new file mode 100644 index 00000000..c9847749 --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVD12OID4VPD20.schema.ts @@ -0,0 +1,1088 @@ +export const AuthorizationRequestPayloadVD12OID4VPD20SchemaObj = { + "$id": "AuthorizationRequestPayloadVD12OID4VPD20Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthorizationRequestPayloadVD12OID4VPD20", + "definitions": { + "AuthorizationRequestPayloadVD12OID4VPD20": { + "type": "object", + "properties": { + "id_token_type": { + "type": "string" + }, + "client_metadata": { + "$ref": "#/definitions/RPRegistrationMetadataPayload" + }, + "client_metadata_uri": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "aud": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "iat": { + "type": "number" + }, + "nbf": { + "type": "number" + }, + "type": { + "type": "string" + }, + "exp": { + "type": "number" + }, + "rexp": { + "type": "number" + }, + "jti": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "response_type": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseType" + }, + { + "type": "string" + } + ] + }, + "client_id": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + }, + "id_token_hint": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "state": { + "type": "string" + }, + "response_mode": { + "$ref": "#/definitions/ResponseMode" + }, + "request": { + "type": "string" + }, + "request_uri": { + "type": "string" + }, + "claims": { + "$ref": "#/definitions/ClaimPayloadCommon" + }, + "presentation_definition": { + "anyOf": [ + { + "$ref": "#/definitions/PresentationDefinitionV1" + }, + { + "$ref": "#/definitions/PresentationDefinitionV2" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV1" + } + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PresentationDefinitionV2" + } + } + ] + }, + "presentation_definition_uri": { + "type": "string" + }, + "client_id_scheme": { + "$ref": "#/definitions/ClientIdSchemeOID4VPD20" + }, + "response_uri": { + "type": "string" + } + } + }, + "RPRegistrationMetadataPayload": { + "type": "object", + "properties": { + "client_id": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "vp_formats": { + "anyOf": [ + { + "$ref": "#/definitions/Format" + }, + {} + ] + }, + "client_name": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "logo_uri": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + }, + "client_purpose": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + } + } + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "ClaimPayloadCommon": { + "type": "object" + }, + "PresentationDefinitionV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV1" + } + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "SubmissionRequirement": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "rule": { + "$ref": "#/definitions/Rules" + }, + "count": { + "type": "number" + }, + "min": { + "type": "number" + }, + "max": { + "type": "number" + }, + "from": { + "type": "string" + }, + "from_nested": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + } + }, + "required": [ + "rule" + ], + "additionalProperties": false + }, + "Rules": { + "type": "string", + "enum": [ + "all", + "pick" + ] + }, + "InputDescriptorV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV1" + } + }, + "required": [ + "id", + "schema" + ], + "additionalProperties": false + }, + "Schema": { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "required": { + "type": "boolean" + } + }, + "required": [ + "uri" + ], + "additionalProperties": false + }, + "Issuance": { + "type": "object", + "properties": { + "manifest": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "ConstraintsV1": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV1" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "Optionality": { + "type": "string", + "enum": [ + "required", + "preferred" + ] + }, + "Statuses": { + "type": "object", + "properties": { + "active": { + "$ref": "#/definitions/PdStatus" + }, + "suspended": { + "$ref": "#/definitions/PdStatus" + }, + "revoked": { + "$ref": "#/definitions/PdStatus" + } + }, + "additionalProperties": false + }, + "PdStatus": { + "type": "object", + "properties": { + "directive": { + "$ref": "#/definitions/Directives" + } + }, + "additionalProperties": false + }, + "Directives": { + "type": "string", + "enum": [ + "required", + "allowed", + "disallowed" + ] + }, + "FieldV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV1" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV1": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "OneOfNumberStringBoolean": { + "type": [ + "boolean", + "number", + "string" + ] + }, + "OneOfNumberString": { + "type": [ + "number", + "string" + ] + }, + "HolderSubject": { + "type": "object", + "properties": { + "field_id": { + "type": "array", + "items": { + "type": "string" + } + }, + "directive": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "field_id", + "directive" + ], + "additionalProperties": false + }, + "PresentationDefinitionV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV2" + } + }, + "frame": { + "type": "object" + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "InputDescriptorV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV2" + } + }, + "required": [ + "id", + "constraints" + ], + "additionalProperties": false + }, + "ConstraintsV2": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV2" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "FieldV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV2" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV2": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "FilterV2Base": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "additionalProperties": false + }, + "FilterV2BaseItems": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "ClientIdSchemeOID4VPD20": { + "anyOf": [ + { + "$ref": "#/definitions/ClientIdSchemeOID4VPD18" + }, + { + "type": "string", + "const": "x509_san_dns" + }, + { + "type": "string", + "const": "x509_san_uri" + }, + { + "type": "string", + "const": "verifier_attestation" + } + ] + }, + "ClientIdSchemeOID4VPD18": { + "type": "string", + "enum": [ + "pre-registered", + "redirect_uri", + "entity_id", + "did" + ] + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVID1.schema.ts b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVID1.schema.ts new file mode 100644 index 00000000..137e9f18 --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/AuthorizationRequestPayloadVID1.schema.ts @@ -0,0 +1,1056 @@ +export const AuthorizationRequestPayloadVID1SchemaObj = { + "$id": "AuthorizationRequestPayloadVID1Schema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthorizationRequestPayloadVID1", + "definitions": { + "AuthorizationRequestPayloadVID1": { + "type": "object", + "properties": { + "registration": { + "$ref": "#/definitions/RPRegistrationMetadataPayload" + }, + "registration_uri": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "aud": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "iat": { + "type": "number" + }, + "nbf": { + "type": "number" + }, + "type": { + "type": "string" + }, + "exp": { + "type": "number" + }, + "rexp": { + "type": "number" + }, + "jti": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "response_type": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseType" + }, + { + "type": "string" + } + ] + }, + "client_id": { + "type": "string" + }, + "redirect_uri": { + "type": "string" + }, + "id_token_hint": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "state": { + "type": "string" + }, + "response_mode": { + "$ref": "#/definitions/ResponseMode" + }, + "request": { + "type": "string" + }, + "request_uri": { + "type": "string" + }, + "claims": { + "$ref": "#/definitions/ClaimPayloadVID1" + } + } + }, + "RPRegistrationMetadataPayload": { + "type": "object", + "properties": { + "client_id": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "vp_formats": { + "anyOf": [ + { + "$ref": "#/definitions/Format" + }, + {} + ] + }, + "client_name": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "logo_uri": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + }, + "client_purpose": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + } + } + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "ClaimPayloadVID1": { + "type": "object", + "properties": { + "id_token": { + "$ref": "#/definitions/IdTokenClaimPayload" + }, + "vp_token": { + "$ref": "#/definitions/VpTokenClaimPayload" + } + } + }, + "IdTokenClaimPayload": { + "type": "object" + }, + "VpTokenClaimPayload": { + "type": "object", + "properties": { + "presentation_definition": { + "anyOf": [ + { + "$ref": "#/definitions/PresentationDefinitionV1" + }, + { + "$ref": "#/definitions/PresentationDefinitionV2" + } + ] + }, + "presentation_definition_uri": { + "type": "string" + } + }, + "additionalProperties": false + }, + "PresentationDefinitionV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV1" + } + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "SubmissionRequirement": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "rule": { + "$ref": "#/definitions/Rules" + }, + "count": { + "type": "number" + }, + "min": { + "type": "number" + }, + "max": { + "type": "number" + }, + "from": { + "type": "string" + }, + "from_nested": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + } + }, + "required": [ + "rule" + ], + "additionalProperties": false + }, + "Rules": { + "type": "string", + "enum": [ + "all", + "pick" + ] + }, + "InputDescriptorV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV1" + } + }, + "required": [ + "id", + "schema" + ], + "additionalProperties": false + }, + "Schema": { + "type": "object", + "properties": { + "uri": { + "type": "string" + }, + "required": { + "type": "boolean" + } + }, + "required": [ + "uri" + ], + "additionalProperties": false + }, + "Issuance": { + "type": "object", + "properties": { + "manifest": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "ConstraintsV1": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV1" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "Optionality": { + "type": "string", + "enum": [ + "required", + "preferred" + ] + }, + "Statuses": { + "type": "object", + "properties": { + "active": { + "$ref": "#/definitions/PdStatus" + }, + "suspended": { + "$ref": "#/definitions/PdStatus" + }, + "revoked": { + "$ref": "#/definitions/PdStatus" + } + }, + "additionalProperties": false + }, + "PdStatus": { + "type": "object", + "properties": { + "directive": { + "$ref": "#/definitions/Directives" + } + }, + "additionalProperties": false + }, + "Directives": { + "type": "string", + "enum": [ + "required", + "allowed", + "disallowed" + ] + }, + "FieldV1": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV1" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV1": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "OneOfNumberStringBoolean": { + "type": [ + "boolean", + "number", + "string" + ] + }, + "OneOfNumberString": { + "type": [ + "number", + "string" + ] + }, + "HolderSubject": { + "type": "object", + "properties": { + "field_id": { + "type": "array", + "items": { + "type": "string" + } + }, + "directive": { + "$ref": "#/definitions/Optionality" + } + }, + "required": [ + "field_id", + "directive" + ], + "additionalProperties": false + }, + "PresentationDefinitionV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "submission_requirements": { + "type": "array", + "items": { + "$ref": "#/definitions/SubmissionRequirement" + } + }, + "input_descriptors": { + "type": "array", + "items": { + "$ref": "#/definitions/InputDescriptorV2" + } + }, + "frame": { + "type": "object" + } + }, + "required": [ + "id", + "input_descriptors" + ], + "additionalProperties": false + }, + "InputDescriptorV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "purpose": { + "type": "string" + }, + "format": { + "$ref": "#/definitions/Format" + }, + "group": { + "type": "array", + "items": { + "type": "string" + } + }, + "issuance": { + "type": "array", + "items": { + "$ref": "#/definitions/Issuance" + } + }, + "constraints": { + "$ref": "#/definitions/ConstraintsV2" + } + }, + "required": [ + "id", + "constraints" + ], + "additionalProperties": false + }, + "ConstraintsV2": { + "type": "object", + "properties": { + "limit_disclosure": { + "$ref": "#/definitions/Optionality" + }, + "statuses": { + "$ref": "#/definitions/Statuses" + }, + "fields": { + "type": "array", + "items": { + "$ref": "#/definitions/FieldV2" + } + }, + "subject_is_issuer": { + "$ref": "#/definitions/Optionality" + }, + "is_holder": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + }, + "same_subject": { + "type": "array", + "items": { + "$ref": "#/definitions/HolderSubject" + } + } + }, + "additionalProperties": false + }, + "FieldV2": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "path": { + "type": "array", + "items": { + "type": "string" + } + }, + "purpose": { + "type": "string" + }, + "filter": { + "$ref": "#/definitions/FilterV2" + }, + "predicate": { + "$ref": "#/definitions/Optionality" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "required": [ + "path" + ], + "additionalProperties": false + }, + "FilterV2": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + "FilterV2Base": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "additionalProperties": false + }, + "FilterV2BaseItems": { + "type": "object", + "properties": { + "const": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + }, + "enum": { + "type": "array", + "items": { + "$ref": "#/definitions/OneOfNumberStringBoolean" + } + }, + "exclusiveMinimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "exclusiveMaximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "format": { + "type": "string" + }, + "formatMaximum": { + "type": "string" + }, + "formatMinimum": { + "type": "string" + }, + "formatExclusiveMaximum": { + "type": "string" + }, + "formatExclusiveMinimum": { + "type": "string" + }, + "minLength": { + "type": "number" + }, + "maxLength": { + "type": "number" + }, + "minimum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "maximum": { + "$ref": "#/definitions/OneOfNumberString" + }, + "not": { + "type": "object" + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + }, + "contains": { + "$ref": "#/definitions/FilterV2Base" + }, + "items": { + "$ref": "#/definitions/FilterV2BaseItems" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/AuthorizationResponseOpts.schema.ts b/packages/siop-oid4vp/lib/schemas/AuthorizationResponseOpts.schema.ts new file mode 100644 index 00000000..3b11e30a --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/AuthorizationResponseOpts.schema.ts @@ -0,0 +1,2175 @@ +export const AuthorizationResponseOptsSchemaObj = { + "$id": "AuthorizationResponseOptsSchema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AuthorizationResponseOpts", + "definitions": { + "AuthorizationResponseOpts": { + "type": "object", + "properties": { + "responseURI": { + "type": "string" + }, + "responseURIType": { + "$ref": "#/definitions/ResponseURIType" + }, + "registration": { + "$ref": "#/definitions/ResponseRegistrationOpts" + }, + "version": { + "$ref": "#/definitions/SupportedVersion" + }, + "audience": { + "type": "string" + }, + "createJwtCallback": { + "$ref": "#/definitions/CreateJwtCallback" + }, + "jwtIssuer": { + "$ref": "#/definitions/JwtIssuer" + }, + "responseMode": { + "$ref": "#/definitions/ResponseMode" + }, + "expiresIn": { + "type": "number" + }, + "accessToken": { + "type": "string" + }, + "tokenType": { + "type": "string" + }, + "refreshToken": { + "type": "string" + }, + "presentationExchange": { + "$ref": "#/definitions/PresentationExchangeResponseOpts" + } + }, + "required": [ + "createJwtCallback" + ], + "additionalProperties": false + }, + "ResponseURIType": { + "type": "string", + "enum": [ + "response_uri", + "redirect_uri" + ] + }, + "ResponseRegistrationOpts": { + "anyOf": [ + { + "type": "object", + "properties": { + "passBy": { + "$ref": "#/definitions/PassBy" + }, + "reference_uri": { + "type": "string" + }, + "targets": { + "$ref": "#/definitions/PropertyTargets" + }, + "id_token_encrypted_response_alg": { + "$ref": "#/definitions/EncKeyAlgorithm" + }, + "id_token_encrypted_response_enc": { + "$ref": "#/definitions/EncSymmetricAlgorithmCode" + }, + "authorizationEndpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "responseTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subjectTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "idTokenSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "tokenEndpoint": { + "type": "string" + }, + "userinfoEndpoint": { + "type": "string" + }, + "jwksUri": { + "type": "string" + }, + "registrationEndpoint": { + "type": "string" + }, + "responseModesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grantTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acrValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "idTokenEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "idTokenEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "userinfoSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "requestObjectEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "tokenEndpointAuthMethodsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "tokenEndpointAuthSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "displayValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ] + }, + "claimsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "serviceDocumentation": { + "type": "string" + }, + "claimsLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "uiLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimsParameterSupported": { + "type": "boolean" + }, + "requestParameterSupported": { + "type": "boolean" + }, + "requestUriParameterSupported": { + "type": "boolean" + }, + "requireRequestUriRegistration": { + "type": "boolean" + }, + "opPolicyUri": { + "type": "string" + }, + "opTosUri": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "redirectUris": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "clientName": { + "type": "string" + }, + "tokenEndpointAuthMethod": { + "type": "string" + }, + "applicationType": { + "type": "string" + }, + "responseTypes": { + "type": "string" + }, + "grantTypes": { + "type": "string" + }, + "vpFormats": { + "$ref": "#/definitions/Format" + }, + "logo_uri": { + "type": "string" + }, + "clientPurpose": { + "type": "string" + } + }, + "required": [ + "passBy" + ] + }, + { + "type": "object", + "properties": { + "passBy": { + "$ref": "#/definitions/PassBy" + }, + "reference_uri": { + "type": "string" + }, + "targets": { + "$ref": "#/definitions/PropertyTargets" + }, + "id_token_encrypted_response_alg": { + "$ref": "#/definitions/EncKeyAlgorithm" + }, + "id_token_encrypted_response_enc": { + "$ref": "#/definitions/EncSymmetricAlgorithmCode" + }, + "authorizationEndpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "responseTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subjectTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "idTokenSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "tokenEndpoint": { + "type": "string" + }, + "userinfoEndpoint": { + "type": "string" + }, + "jwksUri": { + "type": "string" + }, + "registrationEndpoint": { + "type": "string" + }, + "responseModesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grantTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acrValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "idTokenEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "idTokenEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "userinfoSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "requestObjectEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "tokenEndpointAuthMethodsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "tokenEndpointAuthSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "displayValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ] + }, + "claimsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "serviceDocumentation": { + "type": "string" + }, + "claimsLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "uiLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimsParameterSupported": { + "type": "boolean" + }, + "requestParameterSupported": { + "type": "boolean" + }, + "requestUriParameterSupported": { + "type": "boolean" + }, + "requireRequestUriRegistration": { + "type": "boolean" + }, + "opPolicyUri": { + "type": "string" + }, + "opTosUri": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "redirectUris": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "clientName": { + "type": "string" + }, + "tokenEndpointAuthMethod": { + "type": "string" + }, + "applicationType": { + "type": "string" + }, + "responseTypes": { + "type": "string" + }, + "grantTypes": { + "type": "string" + }, + "vpFormats": { + "$ref": "#/definitions/Format" + } + }, + "required": [ + "passBy" + ] + }, + { + "type": "object", + "properties": { + "passBy": { + "$ref": "#/definitions/PassBy" + }, + "reference_uri": { + "type": "string" + }, + "targets": { + "$ref": "#/definitions/PropertyTargets" + }, + "id_token_encrypted_response_alg": { + "$ref": "#/definitions/EncKeyAlgorithm" + }, + "id_token_encrypted_response_enc": { + "$ref": "#/definitions/EncSymmetricAlgorithmCode" + }, + "authorizationEndpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "responseTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subjectTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "idTokenSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "tokenEndpoint": { + "type": "string" + }, + "userinfoEndpoint": { + "type": "string" + }, + "jwksUri": { + "type": "string" + }, + "registrationEndpoint": { + "type": "string" + }, + "responseModesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grantTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acrValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "idTokenEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "idTokenEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "userinfoSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfoEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "requestObjectEncryptionAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "requestObjectEncryptionEncValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "tokenEndpointAuthMethodsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "tokenEndpointAuthSigningAlgValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "displayValuesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ] + }, + "claimsSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "serviceDocumentation": { + "type": "string" + }, + "claimsLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "uiLocalesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claimsParameterSupported": { + "type": "boolean" + }, + "requestParameterSupported": { + "type": "boolean" + }, + "requestUriParameterSupported": { + "type": "boolean" + }, + "requireRequestUriRegistration": { + "type": "boolean" + }, + "opPolicyUri": { + "type": "string" + }, + "opTosUri": { + "type": "string" + }, + "idTokenTypesSupported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/IdTokenType" + } + }, + { + "$ref": "#/definitions/IdTokenType" + } + ] + }, + "vpFormatsSupported": { + "$ref": "#/definitions/Format" + } + }, + "required": [ + "passBy" + ] + } + ] + }, + "PassBy": { + "type": "string", + "enum": [ + "NONE", + "REFERENCE", + "VALUE" + ] + }, + "PropertyTargets": { + "anyOf": [ + { + "$ref": "#/definitions/PropertyTarget" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/PropertyTarget" + } + } + ] + }, + "PropertyTarget": { + "type": "string", + "enum": [ + "authorization-request", + "request-object" + ], + "description": "Determines where a property will end up. Methods that support this argument are optional. If you do not provide any value it will default to all targets." + }, + "EncKeyAlgorithm": { + "type": "string", + "const": "ECDH-ES" + }, + "EncSymmetricAlgorithmCode": { + "type": "string", + "const": "XC20P" + }, + "Schema": { + "type": "string", + "enum": [ + "openid:", + "openid-vc:" + ] + }, + "ResponseIss": { + "type": "string", + "enum": [ + "https://self-issued.me", + "https://self-issued.me/v2", + "https://self-issued.me/v2/openid-vc" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "GrantType": { + "type": "string", + "enum": [ + "authorization_code", + "implicit" + ] + }, + "AuthenticationContextReferences": { + "type": "string", + "enum": [ + "phr", + "phrh" + ] + }, + "TokenEndpointAuthMethod": { + "type": "string", + "enum": [ + "client_secret_post", + "client_secret_basic", + "client_secret_jwt", + "private_key_jwt" + ] + }, + "ClaimType": { + "type": "string", + "enum": [ + "normal", + "aggregated", + "distributed" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "IdTokenType": { + "type": "string", + "enum": [ + "subject_signed", + "attester_signed" + ] + }, + "SupportedVersion": { + "type": "number", + "enum": [ + 70, + 110, + 180, + 200, + 71 + ] + }, + "CreateJwtCallback": { + "properties": { + "isFunction": { + "type": "boolean", + "const": true + } + } + }, + "JwtIssuer": { + "anyOf": [ + { + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "did" + }, + "options": { + "type": "object", + "additionalProperties": {}, + "description": "Additional options for the issuance context" + }, + "didUrl": { + "type": "string" + }, + "alg": { + "$ref": "#/definitions/SigningAlgo" + } + }, + "required": [ + "alg", + "didUrl", + "method" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "x5c" + }, + "options": { + "type": "object", + "additionalProperties": {}, + "description": "Additional options for the issuance context" + }, + "x5c": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of base64-encoded certificate strings in the DER-format.\n\nThe certificate containing the public key corresponding to the key used to digitally sign the JWS MUST be the first certificate." + }, + "issuer": { + "type": "string", + "description": "The issuer jwt\n\nThis value will be used as the iss value of the issue jwt. It is also used as the client_id. And will also be set as the redirect_uri\n\nIt must match an entry in the x5c certificate leaf entry dnsName / uriName" + }, + "clientIdScheme": { + "type": "string", + "enum": [ + "x509_san_dns", + "x509_san_uri" + ] + } + }, + "required": [ + "clientIdScheme", + "issuer", + "method", + "x5c" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "jwk" + }, + "options": { + "type": "object", + "additionalProperties": {}, + "description": "Additional options for the issuance context" + }, + "jwk": { + "type": "object", + "properties": { + "alg": { + "type": "string" + }, + "crv": { + "type": "string" + }, + "d": { + "type": "string" + }, + "dp": { + "type": "string" + }, + "dq": { + "type": "string" + }, + "e": { + "type": "string" + }, + "ext": { + "type": "boolean" + }, + "k": { + "type": "string" + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + } + }, + "kty": { + "type": "string" + }, + "n": { + "type": "string" + }, + "oth": { + "type": "array", + "items": { + "type": "object", + "properties": { + "d": { + "type": "string" + }, + "r": { + "type": "string" + }, + "t": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "p": { + "type": "string" + }, + "q": { + "type": "string" + }, + "qi": { + "type": "string" + }, + "use": { + "type": "string" + }, + "x": { + "type": "string" + }, + "y": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "jwk", + "method" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "method": { + "type": "string", + "const": "custom" + }, + "options": { + "type": "object", + "additionalProperties": {}, + "description": "Additional options for the issuance context" + } + }, + "required": [ + "method" + ], + "additionalProperties": false + } + ] + }, + "PresentationExchangeResponseOpts": { + "type": "object", + "properties": { + "verifiablePresentations": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/definitions/W3CVerifiablePresentation" + }, + { + "$ref": "#/definitions/CompactSdJwtVc" + } + ] + } + }, + "vpTokenLocation": { + "$ref": "#/definitions/VPTokenLocation" + }, + "presentationSubmission": { + "$ref": "#/definitions/PresentationSubmission" + }, + "restrictToFormats": { + "$ref": "#/definitions/Format" + }, + "restrictToDIDMethods": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "verifiablePresentations" + ], + "additionalProperties": false + }, + "W3CVerifiablePresentation": { + "anyOf": [ + { + "$ref": "#/definitions/IVerifiablePresentation" + }, + { + "$ref": "#/definitions/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Presentation (includes proof), in either JSON or compact JWT format. See {@link https://www.w3.org/TR/vc-data-model/#presentations VC data model } See {@link https://www.w3.org/TR/vc-data-model/#proof-formats proof formats }" + }, + "IVerifiablePresentation": { + "type": "object", + "properties": { + "proof": { + "anyOf": [ + { + "$ref": "#/definitions/IProof" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/IProof" + } + } + ] + }, + "id": { + "type": "string" + }, + "@context": { + "anyOf": [ + { + "$ref": "#/definitions/ICredentialContextType" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/ICredentialContextType" + } + } + ] + }, + "type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "verifiableCredential": { + "type": "array", + "items": { + "$ref": "#/definitions/W3CVerifiableCredential" + } + }, + "presentation_submission": { + "$ref": "#/definitions/PresentationSubmission" + }, + "holder": { + "type": "string" + }, + "verifier": { + "type": "string" + } + }, + "required": [ + "@context", + "proof" + ] + }, + "IProof": { + "type": "object", + "properties": { + "type": { + "anyOf": [ + { + "$ref": "#/definitions/IProofType" + }, + { + "type": "string" + } + ] + }, + "created": { + "type": "string" + }, + "proofPurpose": { + "anyOf": [ + { + "$ref": "#/definitions/IProofPurpose" + }, + { + "type": "string" + } + ] + }, + "verificationMethod": { + "type": "string" + }, + "challenge": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "proofValue": { + "type": "string" + }, + "jws": { + "type": "string" + }, + "jwt": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "requiredRevealStatements": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "type", + "created", + "proofPurpose", + "verificationMethod" + ] + }, + "IProofType": { + "type": "string", + "enum": [ + "Ed25519Signature2018", + "Ed25519Signature2020", + "EcdsaSecp256k1Signature2019", + "EcdsaSecp256k1RecoverySignature2020", + "JsonWebSignature2020", + "RsaSignature2018", + "GpgSignature2020", + "JcsEd25519Signature2020", + "BbsBlsSignatureProof2020", + "BbsBlsBoundSignatureProof2020", + "JwtProof2020" + ] + }, + "IProofPurpose": { + "type": "string", + "enum": [ + "verificationMethod", + "assertionMethod", + "authentication", + "keyAgreement", + "contactAgreement", + "capabilityInvocation", + "capabilityDelegation" + ] + }, + "ICredentialContextType": { + "anyOf": [ + { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "did": { + "type": "string" + } + } + }, + { + "type": "string" + } + ] + }, + "W3CVerifiableCredential": { + "anyOf": [ + { + "$ref": "#/definitions/IVerifiableCredential" + }, + { + "$ref": "#/definitions/CompactJWT" + } + ], + "description": "Represents a signed Verifiable Credential (includes proof), in either JSON, compact JWT or compact SD-JWT VC format. See {@link https://www.w3.org/TR/vc-data-model/#credentials VC data model } See {@link https://www.w3.org/TR/vc-data-model/#proof-formats proof formats }" + }, + "IVerifiableCredential": { + "type": "object", + "properties": { + "proof": { + "anyOf": [ + { + "$ref": "#/definitions/IProof" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/IProof" + } + } + ] + }, + "@context": { + "anyOf": [ + { + "$ref": "#/definitions/ICredentialContextType" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/ICredentialContextType" + } + } + ] + }, + "type": { + "type": "array", + "items": { + "type": "string" + } + }, + "credentialSchema": { + "anyOf": [ + { + "$ref": "#/definitions/ICredentialSchemaType" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/ICredentialSchemaType" + } + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/IIssuerId" + }, + { + "$ref": "#/definitions/IIssuer" + } + ] + }, + "issuanceDate": { + "type": "string" + }, + "credentialSubject": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + }, + { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + } + } + } + ] + }, + "expirationDate": { + "type": "string" + }, + "id": { + "type": "string" + }, + "credentialStatus": { + "$ref": "#/definitions/ICredentialStatus" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "@context", + "credentialSubject", + "issuanceDate", + "issuer", + "proof", + "type" + ] + }, + "ICredentialSchemaType": { + "anyOf": [ + { + "$ref": "#/definitions/ICredentialSchema" + }, + { + "type": "string" + } + ] + }, + "ICredentialSchema": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + "IIssuerId": { + "type": "string" + }, + "IIssuer": { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + "ICredentialStatus": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "additionalProperties": false + }, + "CompactJWT": { + "type": "string", + "description": "Represents a Json Web Token in compact form." + }, + "PresentationSubmission": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "A UUID or some other unique ID to identify this Presentation Submission" + }, + "definition_id": { + "type": "string", + "description": "A UUID or some other unique ID to identify this Presentation Definition" + }, + "descriptor_map": { + "type": "array", + "items": { + "$ref": "#/definitions/Descriptor" + }, + "description": "List of descriptors of how the claims are being mapped to presentation definition" + } + }, + "required": [ + "id", + "definition_id", + "descriptor_map" + ], + "additionalProperties": false, + "description": "It expresses how the inputs are presented as proofs to a Verifier." + }, + "Descriptor": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID to identify the descriptor from Presentation Definition Input Descriptor it coresponds to." + }, + "path": { + "type": "string", + "description": "The path where the verifiable credential is located in the presentation submission json" + }, + "path_nested": { + "$ref": "#/definitions/Descriptor" + }, + "format": { + "type": "string", + "description": "The Proof or JWT algorith that the proof is in" + } + }, + "required": [ + "id", + "path", + "format" + ], + "additionalProperties": false, + "description": "descriptor map laying out the structure of the presentation submission." + }, + "CompactSdJwtVc": { + "type": "string", + "description": "Represents a selective disclosure JWT vc in compact form." + }, + "VPTokenLocation": { + "type": "string", + "enum": [ + "authorization_response", + "id_token", + "token_response" + ] + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/DiscoveryMetadataPayload.schema.ts b/packages/siop-oid4vp/lib/schemas/DiscoveryMetadataPayload.schema.ts new file mode 100644 index 00000000..35bf911f --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/DiscoveryMetadataPayload.schema.ts @@ -0,0 +1,1353 @@ +export const DiscoveryMetadataPayloadSchemaObj = { + "$id": "DiscoveryMetadataPayloadSchema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/DiscoveryMetadataPayload", + "definitions": { + "DiscoveryMetadataPayload": { + "anyOf": [ + { + "type": "object", + "properties": { + "authorization_endpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "token_endpoint": { + "type": "string" + }, + "userinfo_endpoint": { + "type": "string" + }, + "jwks_uri": { + "type": "string" + }, + "registration_endpoint": { + "type": "string" + }, + "response_modes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grant_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acr_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "id_token_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "id_token_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for the ID Token to encode the Claims in a JWT [JWT]." + }, + "userinfo_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) [JWA] supported by the UserInfo Endpoint to encode the Claims in a JWT [JWT]." + }, + "request_object_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for Request Objects. These algorithms are used both when the Request Object is passed by value and when it is passed by reference." + }, + "token_endpoint_auth_methods_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "token_endpoint_auth_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "display_values_supported": { + "anyOf": [ + { + "type": "array", + "items": {} + }, + {} + ], + "description": "OPTIONAL. JSON array containing a list of the display parameter values that the OpenID Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0 [OpenID.Core]." + }, + "claim_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ], + "description": "OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0 [OpenID.Core]. Values defined by this specification are normal, aggregated, and distributed. If omitted, the implementation supports only normal Claims." + }, + "claims_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, this might not be an exhaustive list." + }, + "service_documentation": { + "type": "string" + }, + "claims_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "ui_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claims_parameter_supported": { + "type": "boolean" + }, + "request_parameter_supported": { + "type": "boolean" + }, + "request_uri_parameter_supported": { + "type": "boolean" + }, + "require_request_uri_registration": { + "type": "boolean" + }, + "op_policy_uri": { + "type": "string" + }, + "op_tos_uri": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + } + }, + "client_name": { + "type": "string" + }, + "token_endpoint_auth_method": { + "type": "string" + }, + "application_type": { + "type": "string" + }, + "response_types": { + "type": "string" + }, + "grant_types": { + "type": "string" + }, + "vp_formats": { + "$ref": "#/definitions/Format" + } + } + }, + { + "type": "object", + "properties": { + "authorization_endpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "token_endpoint": { + "type": "string" + }, + "userinfo_endpoint": { + "type": "string" + }, + "jwks_uri": { + "type": "string" + }, + "registration_endpoint": { + "type": "string" + }, + "response_modes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grant_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acr_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "id_token_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "id_token_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for the ID Token to encode the Claims in a JWT [JWT]." + }, + "userinfo_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) [JWA] supported by the UserInfo Endpoint to encode the Claims in a JWT [JWT]." + }, + "request_object_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for Request Objects. These algorithms are used both when the Request Object is passed by value and when it is passed by reference." + }, + "token_endpoint_auth_methods_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "token_endpoint_auth_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "display_values_supported": { + "anyOf": [ + { + "type": "array", + "items": {} + }, + {} + ], + "description": "OPTIONAL. JSON array containing a list of the display parameter values that the OpenID Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0 [OpenID.Core]." + }, + "claim_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ], + "description": "OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0 [OpenID.Core]. Values defined by this specification are normal, aggregated, and distributed. If omitted, the implementation supports only normal Claims." + }, + "claims_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, this might not be an exhaustive list." + }, + "service_documentation": { + "type": "string" + }, + "claims_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "ui_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claims_parameter_supported": { + "type": "boolean" + }, + "request_parameter_supported": { + "type": "boolean" + }, + "request_uri_parameter_supported": { + "type": "boolean" + }, + "require_request_uri_registration": { + "type": "boolean" + }, + "op_policy_uri": { + "type": "string" + }, + "op_tos_uri": { + "type": "string" + }, + "client_id": { + "type": "string" + }, + "redirect_uris": { + "type": "array", + "items": { + "type": "string" + } + }, + "client_name": { + "type": "string" + }, + "token_endpoint_auth_method": { + "type": "string" + }, + "application_type": { + "type": "string" + }, + "response_types": { + "type": "string" + }, + "grant_types": { + "type": "string" + }, + "vp_formats": { + "$ref": "#/definitions/Format" + }, + "logo_uri": { + "type": "string" + }, + "client_purpose": { + "type": "string" + } + } + }, + { + "type": "object", + "properties": { + "authorization_endpoint": { + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "string" + } + ] + }, + "issuer": { + "anyOf": [ + { + "$ref": "#/definitions/ResponseIss" + }, + { + "type": "string" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "token_endpoint": { + "type": "string" + }, + "userinfo_endpoint": { + "type": "string" + }, + "jwks_uri": { + "type": "string" + }, + "registration_endpoint": { + "type": "string" + }, + "response_modes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseMode" + } + }, + { + "$ref": "#/definitions/ResponseMode" + } + ] + }, + "grant_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/GrantType" + } + }, + { + "$ref": "#/definitions/GrantType" + } + ] + }, + "acr_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/AuthenticationContextReferences" + } + }, + { + "$ref": "#/definitions/AuthenticationContextReferences" + } + ] + }, + "id_token_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "id_token_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for the ID Token to encode the Claims in a JWT [JWT]." + }, + "userinfo_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "userinfo_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) [JWA] supported by the UserInfo Endpoint to encode the Claims in a JWT [JWT]." + }, + "request_object_encryption_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_encryption_enc_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for Request Objects. These algorithms are used both when the Request Object is passed by value and when it is passed by reference." + }, + "token_endpoint_auth_methods_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + }, + { + "$ref": "#/definitions/TokenEndpointAuthMethod" + } + ] + }, + "token_endpoint_auth_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "display_values_supported": { + "anyOf": [ + { + "type": "array", + "items": {} + }, + {} + ], + "description": "OPTIONAL. JSON array containing a list of the display parameter values that the OpenID Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0 [OpenID.Core]." + }, + "claim_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ClaimType" + } + }, + { + "$ref": "#/definitions/ClaimType" + } + ], + "description": "OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0 [OpenID.Core]. Values defined by this specification are normal, aggregated, and distributed. If omitted, the implementation supports only normal Claims." + }, + "claims_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ], + "description": "RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, this might not be an exhaustive list." + }, + "service_documentation": { + "type": "string" + }, + "claims_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "ui_locales_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + }, + "claims_parameter_supported": { + "type": "boolean" + }, + "request_parameter_supported": { + "type": "boolean" + }, + "request_uri_parameter_supported": { + "type": "boolean" + }, + "require_request_uri_registration": { + "type": "boolean" + }, + "op_policy_uri": { + "type": "string" + }, + "op_tos_uri": { + "type": "string" + }, + "id_token_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/IdTokenType" + } + }, + { + "$ref": "#/definitions/IdTokenType" + } + ] + }, + "vp_formats_supported": { + "$ref": "#/definitions/Format" + } + } + } + ] + }, + "Schema": { + "type": "string", + "enum": [ + "openid:", + "openid-vc:" + ] + }, + "ResponseIss": { + "type": "string", + "enum": [ + "https://self-issued.me", + "https://self-issued.me/v2", + "https://self-issued.me/v2/openid-vc" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseMode": { + "type": "string", + "enum": [ + "fragment", + "form_post", + "post", + "direct_post", + "query" + ] + }, + "GrantType": { + "type": "string", + "enum": [ + "authorization_code", + "implicit" + ] + }, + "AuthenticationContextReferences": { + "type": "string", + "enum": [ + "phr", + "phrh" + ] + }, + "TokenEndpointAuthMethod": { + "type": "string", + "enum": [ + "client_secret_post", + "client_secret_basic", + "client_secret_jwt", + "private_key_jwt" + ] + }, + "ClaimType": { + "type": "string", + "enum": [ + "normal", + "aggregated", + "distributed" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "IdTokenType": { + "type": "string", + "enum": [ + "subject_signed", + "attester_signed" + ] + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/RPRegistrationMetadataPayload.schema.ts b/packages/siop-oid4vp/lib/schemas/RPRegistrationMetadataPayload.schema.ts new file mode 100644 index 00000000..0fcac0a7 --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/RPRegistrationMetadataPayload.schema.ts @@ -0,0 +1,270 @@ +export const RPRegistrationMetadataPayloadSchemaObj = { + "$id": "RPRegistrationMetadataPayloadSchema", + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/RPRegistrationMetadataPayload", + "definitions": { + "RPRegistrationMetadataPayload": { + "type": "object", + "properties": { + "client_id": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "id_token_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "request_object_signing_alg_values_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SigningAlgo" + } + }, + { + "$ref": "#/definitions/SigningAlgo" + } + ] + }, + "response_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ResponseType" + } + }, + { + "$ref": "#/definitions/ResponseType" + } + ] + }, + "scopes_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/Scope" + } + }, + { + "$ref": "#/definitions/Scope" + } + ] + }, + "subject_types_supported": { + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/SubjectType" + } + }, + { + "$ref": "#/definitions/SubjectType" + } + ] + }, + "subject_syntax_types_supported": { + "type": "array", + "items": { + "type": "string" + } + }, + "vp_formats": { + "anyOf": [ + { + "$ref": "#/definitions/Format" + }, + {} + ] + }, + "client_name": { + "anyOf": [ + { + "type": "string" + }, + {} + ] + }, + "logo_uri": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + }, + "client_purpose": { + "anyOf": [ + {}, + { + "type": "string" + } + ] + } + } + }, + "SigningAlgo": { + "type": "string", + "enum": [ + "EdDSA", + "RS256", + "PS256", + "ES256", + "ES256K" + ] + }, + "ResponseType": { + "type": "string", + "enum": [ + "id_token", + "vp_token" + ] + }, + "Scope": { + "type": "string", + "enum": [ + "openid", + "openid did_authn", + "profile", + "email", + "address", + "phone" + ] + }, + "SubjectType": { + "type": "string", + "enum": [ + "public", + "pairwise" + ] + }, + "Format": { + "type": "object", + "properties": { + "jwt": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vc_json": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp": { + "$ref": "#/definitions/JwtObject" + }, + "jwt_vp_json": { + "$ref": "#/definitions/JwtObject" + }, + "ldp": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vc": { + "$ref": "#/definitions/LdpObject" + }, + "ldp_vp": { + "$ref": "#/definitions/LdpObject" + }, + "di": { + "$ref": "#/definitions/DiObject" + }, + "di_vc": { + "$ref": "#/definitions/DiObject" + }, + "di_vp": { + "$ref": "#/definitions/DiObject" + }, + "vc+sd-jwt": { + "$ref": "#/definitions/SdJwtObject" + } + }, + "additionalProperties": false + }, + "JwtObject": { + "type": "object", + "properties": { + "alg": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "alg" + ], + "additionalProperties": false + }, + "LdpObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type" + ], + "additionalProperties": false + }, + "DiObject": { + "type": "object", + "properties": { + "proof_type": { + "type": "array", + "items": { + "type": "string" + } + }, + "cryptosuite": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "proof_type", + "cryptosuite" + ], + "additionalProperties": false + }, + "SdJwtObject": { + "type": "object", + "properties": { + "sd-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "kb-jwt_alg_values": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + } +}; \ No newline at end of file diff --git a/packages/siop-oid4vp/lib/schemas/index.ts b/packages/siop-oid4vp/lib/schemas/index.ts new file mode 100644 index 00000000..4df5d7db --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/index.ts @@ -0,0 +1,8 @@ +export * from './AuthorizationRequestPayloadVID1.schema'; +export * from './AuthorizationRequestPayloadVD11.schema'; +// export * from './AuthorizationRequestOpts.schema'; +export * from './AuthorizationResponseOpts.schema'; +export * from './DiscoveryMetadataPayload.schema'; +export * from './RPRegistrationMetadataPayload.schema'; +export * from './validation'; + diff --git a/packages/siop-oid4vp/lib/schemas/validation/index.ts b/packages/siop-oid4vp/lib/schemas/validation/index.ts new file mode 100644 index 00000000..3970f4e3 --- /dev/null +++ b/packages/siop-oid4vp/lib/schemas/validation/index.ts @@ -0,0 +1,15 @@ +import { + AuthorizationRequestPayloadVD11Schema, + AuthorizationRequestPayloadVID1Schema, + AuthorizationResponseOptsSchema, + RPRegistrationMetadataPayloadSchema + /*CreateAuthorizationRequestOptsSchema, */ +} from './schemaValidation.js'; + +export { + AuthorizationRequestPayloadVID1Schema, + AuthorizationRequestPayloadVD11Schema, + RPRegistrationMetadataPayloadSchema, + AuthorizationResponseOptsSchema + /*CreateAuthorizationRequestOptsSchema, */ +}; diff --git a/packages/siop-oid4vp/lib/types/Errors.ts b/packages/siop-oid4vp/lib/types/Errors.ts new file mode 100644 index 00000000..5950b30e --- /dev/null +++ b/packages/siop-oid4vp/lib/types/Errors.ts @@ -0,0 +1,53 @@ +enum SIOPErrors { + // todo: INVALID_REQUEST mapping onto response conforming to spec + INVALID_REQUEST = 'The request contained invalid or conflicting parameters', + AUTH_REQUEST_EXPECTS_VP = 'authentication request expects a verifiable presentation in the response', + AUTH_REQUEST_DOESNT_EXPECT_VP = "authentication request doesn't expect a verifiable presentation in the response", + BAD_STATE = 'The state in the payload does not match the supplied state', + BAD_NONCE = 'The nonce in the payload does not match the supplied nonce', + NO_ALG_SUPPORTED = 'Algorithm not supported.', + BAD_PARAMS = 'Wrong parameters provided.', + BAD_IDTOKEN_RESPONSE_OPTS = 'Id-token response options are not set.', + NO_REQUEST_VERSION = 'No request spec version provided.', + NO_REQUEST = 'No request (payload) provided.', + NO_RESPONSE = 'No response (payload) provided.', + NO_PRESENTATION_SUBMISSION = 'The VP did not contain a presentation submission. Did you forget to call PresentationExchange.checkSubmissionFrom?', + BAD_VERIFIER_ATTESTATION = 'Invalid verifier attestation. Bad JWT structure.', + CREDENTIAL_FORMATS_NOT_SUPPORTED = 'CREDENTIAL_FORMATS_NOT_SUPPORTED', + CREDENTIALS_FORMATS_NOT_PROVIDED = 'Credentials format not provided by RP/OP', + COULD_NOT_FIND_VCS_MATCHING_PD = 'Could not find VerifiableCredentials matching presentationDefinition object in the provided VC list', + DIDAUTH_REQUEST_PAYLOAD_NOT_CREATED = 'DidAuthRequestPayload not created', + DID_METHODS_NOT_SUPORTED = 'DID_METHODS_NOT_SUPPORTED', + ERROR_VERIFYING_SIGNATURE = 'Error verifying the DID Auth Token signature.', + INVALID_JWT = 'Received an invalid JWT.', + INVALID_REQUEST_OBJECT_X509_SCHEME_JWT = `Request Object uses client_id_scheme 'x509_san_dns' | 'x509_san_uri', but now x5c header is present.`, + INVALID_REQUEST_OBJECT_DID_SCHEME_JWT = `Request Object uses client_id_scheme 'did', but now kid header is present.`, + MISSING_ATTESTATION_JWT = `Request Object uses client_id_scheme 'verifier_attestation', but now jwt header is present.`, + MISSING_ATTESTATION_JWT_TYP = `Request Object uses client_id_scheme 'verifier_attestation', but the jwt is not 'verifier-attestation+jwt'.`, + INVALID_CLIENT_ID_SCHEME = 'Invalid client_id_scheme.', + EXPIRED = 'The token has expired', + INVALID_AUDIENCE = 'Audience is invalid. Should be a string value.', + NO_AUDIENCE = 'No audience found in JWT payload or not configured', + NO_JWT = 'no JWT was supplied', + NO_NONCE = 'No nonce found in JWT payload', + NO_REFERENCE_URI = 'referenceUri must be defined when REFERENCE option is used', + REFERENCE_URI_NO_PAYLOAD = 'referenceUri specified, but object to host there is not present', + NO_SELF_ISSUED_ISS = 'The Response Token Issuer Claim (iss) MUST start with https://self-isued.me/v2', + REGISTRATION_NOT_SET = 'Registration metadata not set.', + REQUEST_CLAIMS_PRESENTATION_DEFINITION_BY_REF_AND_VALUE_NON_EXCLUSIVE = "Request claims can't have both 'presentation_definition' and 'presentation_definition_uri'", + REQUEST_CLAIMS_PRESENTATION_DEFINITION_NOT_VALID = 'Presentation definition in the request claims is not valid', + REQUEST_OBJECT_TYPE_NOT_SET = 'Request object type is not set.', + RESPONSE_OPTS_PRESENTATIONS_SUBMISSION_IS_NOT_VALID = 'presentation_submission object inside the response opts vp should be valid', + RESPONSE_STATUS_UNEXPECTED = 'Received unexpected response status', + REG_OBJ_N_REG_URI_CANT_BE_SET_SIMULTANEOUSLY = 'Registration can either be passed by value or passed by reference. Hence, registration object and registration URI can not be set simultaneously', + REG_OBJ_MALFORMED = 'The registration object is malformed.', + REG_PASS_BY_REFERENCE_INCORRECTLY = 'Request error', + REGISTRATION_OBJECT_TYPE_NOT_SET = 'Registration object type is not set.', + SIOP_VERSION_NOT_SUPPORTED = 'The SIOP spec version could not inferred from the authentication request payload', + NO_VERIFIABLE_PRESENTATION_NO_CREDENTIALS = 'Either no verifiable presentation or no credentials found in the verifiable presentation', + VERIFY_BAD_PARAMS = 'Verify bad parameters', + VERIFIABLE_PRESENTATION_SIGNATURE_NOT_VALID = 'The signature of the verifiable presentation is not valid', + VERIFIABLE_PRESENTATION_VERIFICATION_FUNCTION_MISSING = 'The verifiable presentation verification function is missing', +} + +export default SIOPErrors diff --git a/packages/siop-oid4vp/lib/types/Events.ts b/packages/siop-oid4vp/lib/types/Events.ts new file mode 100644 index 00000000..ec96e177 --- /dev/null +++ b/packages/siop-oid4vp/lib/types/Events.ts @@ -0,0 +1,67 @@ +export enum AuthorizationEvents { + ON_AUTH_REQUEST_CREATED_SUCCESS = 'onAuthRequestCreatedSuccess', + ON_AUTH_REQUEST_CREATED_FAILED = 'onAuthRequestCreatedFailed', + + ON_AUTH_REQUEST_SENT_SUCCESS = 'onAuthRequestSentSuccess', + ON_AUTH_REQUEST_SENT_FAILED = 'onAuthRequestSentFailed', + + ON_AUTH_REQUEST_RECEIVED_SUCCESS = 'onAuthRequestReceivedSuccess', + ON_AUTH_REQUEST_RECEIVED_FAILED = 'onAuthRequestReceivedFailed', + + ON_AUTH_REQUEST_VERIFIED_SUCCESS = 'onAuthRequestVerifiedSuccess', + ON_AUTH_REQUEST_VERIFIED_FAILED = 'onAuthRequestVerifiedFailed', + + ON_AUTH_RESPONSE_CREATE_SUCCESS = 'onAuthResponseCreateSuccess', + ON_AUTH_RESPONSE_CREATE_FAILED = 'onAuthResponseCreateFailed', + + ON_AUTH_RESPONSE_SENT_SUCCESS = 'onAuthResponseSentSuccess', + ON_AUTH_RESPONSE_SENT_FAILED = 'onAuthResponseSentFailed', + + ON_AUTH_RESPONSE_RECEIVED_SUCCESS = 'onAuthResponseReceivedSuccess', + ON_AUTH_RESPONSE_RECEIVED_FAILED = 'onAuthResponseReceivedFailed', + + ON_AUTH_RESPONSE_VERIFIED_SUCCESS = 'onAuthResponseVerifiedSuccess', + ON_AUTH_RESPONSE_VERIFIED_FAILED = 'onAuthResponseVerifiedFailed', +} + +export class AuthorizationEvent { + private readonly _subject: T | undefined + private readonly _error?: Error + private readonly _timestamp: number + private readonly _correlationId: string + + public constructor(args: { correlationId: string; subject?: T; error?: Error }) { + //fixme: Create correlationId if not provided. Might need to be deferred to registry though + this._correlationId = args.correlationId + this._timestamp = Date.now() + this._subject = args.subject + this._error = args.error + } + + get subject(): T { + return this._subject + } + + get timestamp(): number { + return this._timestamp + } + + get error(): Error { + return this._error + } + + public hasError(): boolean { + return !!this._error + } + + get correlationId(): string { + return this._correlationId + } +} + +export interface RegisterEventListener { + event: AuthorizationEvents | AuthorizationEvents[] + + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + listener: (...args: any[]) => void +} diff --git a/packages/siop-oid4vp/lib/types/JWT.types.ts b/packages/siop-oid4vp/lib/types/JWT.types.ts new file mode 100644 index 00000000..8a166dae --- /dev/null +++ b/packages/siop-oid4vp/lib/types/JWT.types.ts @@ -0,0 +1,90 @@ +import { JwtHeader as jwtDecodeJwtHeader, JwtPayload as jwtDecodePayload } from 'jwt-decode' +export interface EcdsaSignature { + r: string + s: string + recoveryParam?: number | null +} + +export type JwtHeader = jwtDecodeJwtHeader & { + alg?: string + x5c?: string[] + kid?: string + jwk?: JsonWebKey + jwt?: string +} & Record + +export type JwtPayload = jwtDecodePayload & { + client_id?: string + nonce?: string + request_uri?: string + client_id_scheme?: string +} & Record + +export interface JWTPayload { + iss?: string + sub?: string + aud?: string | string[] + iat?: number + nbf?: number + type?: string + exp?: number + rexp?: number + jti?: string + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface VerifiedJWT { + payload: Partial // The JWT payload + issuer: string //The issuer (did) of the JWT + jwt: string // The JWT +} + +/** + * JSON Web Key ({@link https://www.rfc-editor.org/rfc/rfc7517 JWK}). "RSA", "EC", "OKP", and "oct" + * key types are supported. + */ +export interface JWK { + /** JWK "alg" (Algorithm) Parameter. */ + alg?: string + crv?: string + d?: string + dp?: string + dq?: string + e?: string + /** JWK "ext" (Extractable) Parameter. */ + ext?: boolean + k?: string + /** JWK "key_ops" (Key Operations) Parameter. */ + key_ops?: string[] + /** JWK "kid" (Key ID) Parameter. */ + kid?: string + /** JWK "kty" (Key Type) Parameter. */ + kty?: string + n?: string + oth?: Array<{ + d?: string + r?: string + t?: string + }> + p?: string + q?: string + qi?: string + /** JWK "use" (Public Key Use) Parameter. */ + use?: string + x?: string + y?: string + /** JWK "x5c" (X.509 Certificate Chain) Parameter. */ + x5c?: string[] + /** JWK "x5t" (X.509 Certificate SHA-1 Thumbprint) Parameter. */ + x5t?: string + /** "x5t#S256" (X.509 Certificate SHA-256 Thumbprint) Parameter. */ + 'x5t#S256'?: string + /** JWK "x5u" (X.509 URL) Parameter. */ + x5u?: string + + [propName: string]: unknown +} + +// export declare type ECCurve = 'P-256' | 'secp256k1' | 'P-384' | 'P-521'; diff --git a/packages/siop-oid4vp/lib/types/JwtIssuer.ts b/packages/siop-oid4vp/lib/types/JwtIssuer.ts new file mode 100644 index 00000000..8e85ccb5 --- /dev/null +++ b/packages/siop-oid4vp/lib/types/JwtIssuer.ts @@ -0,0 +1,75 @@ +import { AuthorizationResponseOpts } from '../authorization-response' +import { JwtProtectionMethod, JwtType } from '../helpers/jwtUtils' + +import { JwtHeader, JwtPayload } from './JWT.types' +import { SigningAlgo } from './SIOP.types' + +interface JwtIssuerBase { + method: JwtProtectionMethod + /** + * Additional options for the issuance context + */ + options?: Record +} + +interface JwtIssuanceContextBase extends JwtIssuerBase { + type: JwtType +} + +interface RequestObjectContext extends JwtIssuanceContextBase { + type: 'request-object' +} + +interface IdTokenContext extends JwtIssuanceContextBase { + type: 'id-token' + authorizationResponseOpts: AuthorizationResponseOpts +} + +export type JwtIssuanceContext = RequestObjectContext | IdTokenContext + +interface JwtIssuerDid extends JwtIssuerBase { + method: 'did' + + didUrl: string + alg: SigningAlgo +} + +interface JwtIssuerX5c extends JwtIssuerBase { + method: 'x5c' + + /** + * + * Array of base64-encoded certificate strings in the DER-format. + * + * The certificate containing the public key corresponding to the key used to digitally sign the JWS MUST be the first certificate. + */ + x5c: Array + + /** + * The issuer jwt + * + * This value will be used as the iss value of the issue jwt. + * It is also used as the client_id. + * And will also be set as the redirect_uri + * + * It must match an entry in the x5c certificate leaf entry dnsName / uriName + */ + issuer: string + + clientIdScheme: 'x509_san_dns' | 'x509_san_uri' +} + +interface JwtIssuerJwk extends JwtIssuerBase { + method: 'jwk' + + jwk: JsonWebKey +} + +interface JwtIssuerCustom extends JwtIssuerBase { + method: 'custom' +} + +export type JwtIssuer = JwtIssuerDid | JwtIssuerX5c | JwtIssuerJwk | JwtIssuerCustom +export type JwtIssuerWithContext = JwtIssuer & JwtIssuanceContext + +export type CreateJwtCallback = (jwtIssuer: JwtIssuerWithContext, jwt: { header: JwtHeader; payload: JwtPayload }) => Promise diff --git a/packages/siop-oid4vp/lib/types/JwtVerifier.ts b/packages/siop-oid4vp/lib/types/JwtVerifier.ts new file mode 100644 index 00000000..9be3ddf4 --- /dev/null +++ b/packages/siop-oid4vp/lib/types/JwtVerifier.ts @@ -0,0 +1,181 @@ +import { calculateJwkThumbprintUri, getDigestAlgorithmFromJwkThumbprintUri } from '../helpers' +import { JwtProtectionMethod, JwtType, parseJWT } from '../helpers/jwtUtils' + +import SIOPErrors from './Errors' +import { JWK, JwtHeader, JwtPayload } from './JWT.types' +import { RequestObjectPayload } from './SIOP.types' + +interface JwtVerifierBase { + type: JwtType + method: JwtProtectionMethod +} + +interface DidJwtVerifier extends JwtVerifierBase { + method: 'did' + didUrl: string +} + +interface X5cJwtVerifier extends JwtVerifierBase { + method: 'x5c' + + /** + * + * Array of base64-encoded certificate strings in the DER-format. + * + * The certificate containing the public key corresponding to the key used to digitally sign the JWS MUST be the first certificate. + */ + x5c: Array + + /** + * The jwt issuer + */ + issuer: string +} + +type JwkJwtVerifier = + | (JwtVerifierBase & { + method: 'jwk' + type: 'id-token' + + jwk: JsonWebKey + jwkThumbprint: string + }) + | (JwtVerifierBase & { + method: 'jwk' + type: 'request-object' | 'verifier-attestation' + + jwk: JsonWebKey + jwkThumbprint?: never + }) + +interface CustomJwtVerifier extends JwtVerifierBase { + method: 'custom' +} + +export type JwtVerifier = DidJwtVerifier | X5cJwtVerifier | CustomJwtVerifier | JwkJwtVerifier + +export const getJwtVerifierWithContext = async ( + jwt: { header: JwtHeader; payload: JwtPayload }, + options: { type: JwtType }, +): Promise => { + const type = options.type + + if (jwt.header.kid?.startsWith('did:')) { + if (!jwt.header.kid.includes('#')) { + throw new Error(`${SIOPErrors.INVALID_JWT}. '${type}' contains an invalid kid header.`) + } + return { method: 'did', didUrl: jwt.header.kid, type } + } else if (jwt.header.x5c) { + if (!Array.isArray(jwt.header.x5c) || jwt.header.x5c.length === 0 || !jwt.header.x5c.every((cert) => typeof cert === 'string')) { + throw new Error(`${SIOPErrors.INVALID_JWT}. '${type}' contains an invalid x5c header.`) + } + return { method: 'x5c', x5c: jwt.header.x5c, issuer: jwt.payload.iss, type } + } else if (jwt.header.jwk) { + if (typeof jwt.header.jwk !== 'object') { + throw new Error(`${SIOPErrors.INVALID_JWT} '${type}' contains an invalid jwk header.`) + } + if (type !== 'id-token') { + // Users need to check if the iss claim matches an entity they trust + // for type === 'verifier-attestation' + return { method: 'jwk', type, jwk: jwt.header.jwk } + } + + if (typeof jwt.payload.sub_jwk !== 'string') { + throw new Error(`${SIOPErrors.INVALID_JWT} '${type}' is missing the sub_jwk claim.`) + } + + const jwkThumbPrintUri = jwt.payload.sub_jwk + const digestAlgorithm = await getDigestAlgorithmFromJwkThumbprintUri(jwkThumbPrintUri) + const selfComputedJwkThumbPrintUri = await calculateJwkThumbprintUri(jwt.header.jwk as JWK, digestAlgorithm) + + if (selfComputedJwkThumbPrintUri !== jwkThumbPrintUri) { + throw new Error(`${SIOPErrors.INVALID_JWT} '${type}' contains an invalid sub_jwk claim.`) + } + + return { method: 'jwk', type, jwk: jwt.header.jwk, jwkThumbprint: jwt.payload.sub_jwk } + } + + return { method: 'custom', type } +} + +export type VerifyJwtCallback = (jwtVerifier: JwtVerifier, jwt: { header: JwtHeader; payload: JwtPayload; raw: string }) => Promise + +export const getRequestObjectJwtVerifier = async ( + jwt: { header: JwtHeader; payload: RequestObjectPayload }, + options: { type: 'request-object'; raw: string }, +): Promise => { + const type = options.type + + const clientIdScheme = jwt.payload.client_id_scheme + const clientId = jwt.payload.client_id + + if (clientIdScheme === 'did') { + if (!jwt.header.kid) { + throw new Error(SIOPErrors.INVALID_REQUEST_OBJECT_DID_SCHEME_JWT) + } + return getJwtVerifierWithContext(jwt, { type }) + } else if (clientIdScheme === 'pre-registered') { + // All validations must be done manually + // The Verifier metadata is obtained using [RFC7591] or through out-of-band mechanisms. + return getJwtVerifierWithContext(jwt, { type }) + } else if (clientIdScheme === 'x509_san_dns' || clientIdScheme === 'x509_san_uri') { + // Make sure that the jwt is x509 protected + if (!jwt.header.x5c) { + throw new Error(SIOPErrors.INVALID_REQUEST_OBJECT_X509_SCHEME_JWT) + } + return getJwtVerifierWithContext(jwt, { type }) + } else if (clientIdScheme === 'redirect_uri') { + if (jwt.payload.redirect_uri && jwt.payload.redirect_uri !== clientId) { + throw new Error(`Invalid request object payload. The redirect_uri must match the client_id with client_id_scheme 'redirect_uri'.`) + } + if (options.raw.split('.').length > 2) throw new Error(`${SIOPErrors.INVALID_JWT} The '${type}' Jwt must not not be signed.`) + return getJwtVerifierWithContext(jwt, { type }) + } else if (clientIdScheme === 'verifier_attestation') { + const verifierAttestationSubtype = 'verifier-attestation+jwt' + if (!jwt.header.jwt) { + throw new Error(SIOPErrors.MISSING_ATTESTATION_JWT) + } + // TODO: is this correct? not 100% sure based on the spec + if (jwt.header.typ !== verifierAttestationSubtype) { + throw new Error(SIOPErrors.MISSING_ATTESTATION_JWT_TYP) + } + + const attestationJwt = jwt.header.jwt + const { header: attestationHeader, payload: attestationPayload } = parseJWT(attestationJwt) + + if ( + attestationHeader.typ !== verifierAttestationSubtype || + attestationPayload.sub !== clientId || + !attestationPayload.iss || + typeof attestationPayload.iss !== 'string' || + !attestationPayload.exp || + typeof attestationPayload.exp !== 'number' || + typeof attestationPayload.cnf !== 'object' || + typeof attestationPayload.cnf['jwk'] !== 'object' + ) { + throw new Error(SIOPErrors.BAD_VERIFIER_ATTESTATION) + } + + if (attestationPayload.redirect_uris) { + if ( + !Array.isArray(attestationPayload.redirect_uris) || + attestationPayload.redirect_uris.some((value) => typeof value !== 'string') || + !jwt.payload.redirect_uri || + !attestationPayload.redirect_uris.includes(jwt.payload.redirect_uri) + ) { + throw new Error(`${SIOPErrors.BAD_VERIFIER_ATTESTATION} request object redirect_uri in not included in the verifier attestation jwt.`) + } + } + + // The iss claim value of the Verifier Attestation JWT MUST identify a party the Wallet trusts for issuing Verifier Attestation JWTs. + // If the Wallet cannot establish trust, it MUST refuse the request. + return { method: 'jwk', type, jwk: attestationPayload.cnf['jwk'] as JWK } + } else if (clientIdScheme === 'entity_id') { + // TODO! + throw new Error('Not implemented yet') + } else if (clientIdScheme) { + throw new Error(SIOPErrors.INVALID_CLIENT_ID_SCHEME) + } + + return getJwtVerifierWithContext(jwt, { type }) +} diff --git a/packages/siop-oid4vp/lib/types/SIOP.types.ts b/packages/siop-oid4vp/lib/types/SIOP.types.ts new file mode 100644 index 00000000..9faac5d8 --- /dev/null +++ b/packages/siop-oid4vp/lib/types/SIOP.types.ts @@ -0,0 +1,710 @@ +// noinspection JSUnusedGlobalSymbols + +import { Format, PresentationDefinitionV1, PresentationDefinitionV2 } from '@sphereon/pex-models' +import { + AdditionalClaims, + CompactSdJwtVc, + IPresentation, + IVerifiablePresentation, + PresentationSubmission, + W3CVerifiableCredential, + W3CVerifiablePresentation, + WrappedVerifiablePresentation, +} from '@sphereon/ssi-types' + +import { AuthorizationRequest, CreateAuthorizationRequestOpts, PropertyTargets, VerifyAuthorizationRequestOpts } from '../authorization-request' +import { + AuthorizationResponse, + AuthorizationResponseOpts, + PresentationDefinitionWithLocation, + PresentationVerificationCallback, + VerifyAuthorizationResponseOpts, +} from '../authorization-response' +import { RequestObject, RequestObjectOpts } from '../request-object' +import { IRPSessionManager } from '../rp' + +import { JWTPayload, VerifiedJWT } from './index' +export const DEFAULT_EXPIRATION_TIME = 10 * 60 + +// https://openid.net/specs/openid-connect-core-1_0.html#RequestObject +// request and request_uri parameters MUST NOT be included in Request Objects. +export interface RequestObjectPayload extends RequestCommonPayload, JWTPayload { + scope: string // REQUIRED. As specified in Section 3.1.2 of [OpenID.Core]. + response_type: ResponseType | string // REQUIRED. Constant string value id_token. + client_id: string // REQUIRED. RP's identifier at the Self-Issued OP. + client_id_scheme?: ClientIdScheme // The client_id_scheme enables deployments of this specification to use different mechanisms to obtain and validate metadata of the Verifier beyond the scope of [RFC6749]. The term client_id_scheme is used since the Verifier is acting as an OAuth 2.0 Client. + redirect_uri?: string // REQUIRED before OID4VP v18, now optional because of response_uri. URI to which the Self-Issued OP Response will be sent + response_uri?: string // New since OID4VP18 OPTIONAL. The Response URI to which the Wallet MUST send the Authorization Response using an HTTPS POST request as defined by the Response Mode direct_post. The Response URI receives all Authorization Response parameters as defined by the respective Response Type. When the response_uri parameter is present, the redirect_uri Authorization Request parameter MUST NOT be present. If the redirect_uri Authorization Request parameter is present when the Response Mode is direct_post, the Wallet MUST return an invalid_request Authorization Response error. + nonce: string + state: string +} + +export type RequestObjectJwt = string + +// https://openid.net/specs/openid-connect-self-issued-v2-1_0.html#section-8 + +export interface AuthorizationRequestCommonPayload extends RequestCommonPayload, JWTPayload { + request?: string // OPTIONAL. Request Object value, as specified in Section 6.1 of [OpenID.Core]. The Request Object MAY be encrypted to the Self-Issued OP by the RP. In this case, the sub (subject) of a previously issued ID Token for this RP MUST be sent as the kid (Key ID) of the JWE. + request_uri?: string // OPTIONAL. URL where Request Object value can be retrieved from, as specified in Section 6.2 of [OpenID.Core]. +} + +export interface RequestCommonPayload extends JWTPayload { + scope?: string // REQUIRED. As specified in Section 3.1.2 of [OpenID.Core]. + response_type?: ResponseType | string // REQUIRED. Constant string value id_token. + client_id?: string // REQUIRED. RP's identifier at the Self-Issued OP. + redirect_uri?: string // REQUIRED. URI to which the Self-Issued OP Response will be sent + + id_token_hint?: string // OPTIONAL. As specified in Section 3.1.2 of [OpenID.Core]. If the ID Token is encrypted for the Self-Issued OP, the sub (subject) of the signed ID Token MUST be sent as the kid (Key ID) of the JWE. + // claims?: ClaimPayloadCommon; // OPTIONAL. As specified in Section 5.5 of [OpenID.Core] + nonce?: string + state?: string + response_mode?: ResponseMode // This specification introduces a new response mode post in accordance with [OAuth.Responses]. This response mode is used to request the Self-Issued OP to deliver the result of the authentication process to a certain endpoint using the HTTP POST method. The additional parameter response_mode is used to carry this value. +} + +export interface AuthorizationRequestPayloadVID1 extends AuthorizationRequestCommonPayload, RequestRegistrationPayloadProperties { + claims?: ClaimPayloadVID1 +} + +export interface AuthorizationRequestPayloadVD11 + extends AuthorizationRequestCommonPayload, + RequestClientMetadataPayloadProperties, + RequestIdTokenPayloadProperties { + claims?: ClaimPayloadCommon // OPTIONAL. As specified in Section 5.5 of [OpenID.Core] + presentation_definition?: PresentationDefinitionV1 | PresentationDefinitionV2 | PresentationDefinitionV1[] | PresentationDefinitionV2[] + presentation_definition_uri?: string +} + +export interface AuthorizationRequestPayloadVD12OID4VPD18 + extends AuthorizationRequestCommonPayload, + RequestClientMetadataPayloadProperties, + RequestIdTokenPayloadProperties { + claims?: ClaimPayloadCommon // OPTIONAL. As specified in Section 5.5 of [OpenID.Core] + presentation_definition?: PresentationDefinitionV1 | PresentationDefinitionV2 | PresentationDefinitionV1[] | PresentationDefinitionV2[] + presentation_definition_uri?: string + client_id_scheme?: ClientIdSchemeOID4VPD18 + response_uri?: string // New since OID4VP18 OPTIONAL. The Response URI to which the Wallet MUST send the Authorization Response using an HTTPS POST request as defined by the Response Mode direct_post. The Response URI receives all Authorization Response parameters as defined by the respective Response Type. When the response_uri parameter is present, the redirect_uri Authorization Request parameter MUST NOT be present. If the redirect_uri Authorization Request parameter is present when the Response Mode is direct_post, the Wallet MUST return an invalid_request Authorization Response error. +} + +export interface AuthorizationRequestPayloadVD12OID4VPD20 + extends AuthorizationRequestCommonPayload, + RequestClientMetadataPayloadProperties, + RequestIdTokenPayloadProperties { + claims?: ClaimPayloadCommon // OPTIONAL. As specified in Section 5.5 of [OpenID.Core] + presentation_definition?: PresentationDefinitionV1 | PresentationDefinitionV2 | PresentationDefinitionV1[] | PresentationDefinitionV2[] + presentation_definition_uri?: string + client_id_scheme?: ClientIdSchemeOID4VPD20 + response_uri?: string // New since OID4VP18 OPTIONAL. The Response URI to which the Wallet MUST send the Authorization Response using an HTTPS POST request as defined by the Response Mode direct_post. The Response URI receives all Authorization Response parameters as defined by the respective Response Type. When the response_uri parameter is present, the redirect_uri Authorization Request parameter MUST NOT be present. If the redirect_uri Authorization Request parameter is present when the Response Mode is direct_post, the Wallet MUST return an invalid_request Authorization Response error. +} + +export type ClientIdSchemeOID4VPD18 = 'pre-registered' | 'redirect_uri' | 'entity_id' | 'did' +export type ClientIdSchemeOID4VPD20 = ClientIdSchemeOID4VPD18 | 'x509_san_dns' | 'x509_san_uri' | 'verifier_attestation' +export type ClientIdScheme = ClientIdSchemeOID4VPD18 | ClientIdSchemeOID4VPD20 + +// https://openid.bitbucket.io/connect/openid-connect-self-issued-v2-1_0.html#section-10 +export type AuthorizationRequestPayload = + | AuthorizationRequestPayloadVID1 + | AuthorizationRequestPayloadVD11 + | AuthorizationRequestPayloadVD12OID4VPD18 + | AuthorizationRequestPayloadVD12OID4VPD20 + +export type JWTVcPresentationProfileAuthenticationRequestPayload = RequestIdTokenPayloadProperties + +export interface RequestIdTokenPayloadProperties { + id_token_type?: string // OPTIONAL. Space-separated string that specifies the types of ID token the RP wants to obtain, with the values appearing in order of preference. The allowed individual values are subject_signed and attester_signed (see Section 8.2). The default value is attester_signed. The RP determines the type if ID token returned based on the comparison of the iss and sub claims values (see(see Section 12.1). In order to preserve compatibility with existing OpenID Connect deployments, the OP MAY return an ID token that does not fulfill the requirements as expressed in this parameter. So the RP SHOULD be prepared to reliably handle such an outcome. +} + +export interface RequestClientMetadataPayloadProperties { + client_metadata?: RPRegistrationMetadataPayload // OPTIONAL. This parameter is used by the RP to provide information about itself to a Self-Issued OP that would normally be provided to an OP during Dynamic RP Registration, as specified in {#rp-registration-parameter}. + client_metadata_uri?: string // OPTIONAL. This parameter is used by the RP to provide information about itself to a Self-Issued OP that would normally be provided to an OP during Dynamic RP Registration, as specified in {#rp-registration-parameter}. +} + +export interface RequestRegistrationPayloadProperties { + registration?: RPRegistrationMetadataPayload //This parameter is used by the RP to provide information about itself to a Self-Issued OP that would normally be provided to an OP during Dynamic RP Registration, as specified in Section 2.2.1. + registration_uri?: string // OPTIONAL. This parameter is used by the RP to provide information about itself to a Self-Issued OP that would normally be provided to an OP during Dynamic RP Registration, as specified in 2.2.1. +} + +export type ResponseURIType = 'response_uri' | 'redirect_uri' + +export interface VerifiedAuthorizationRequest extends Partial { + responseURIType: ResponseURIType + responseURI?: string + clientIdScheme?: string + correlationId: string + authorizationRequest: AuthorizationRequest + authorizationRequestPayload: AuthorizationRequestPayload + requestObject?: RequestObject // The Request object + registrationMetadataPayload: RPRegistrationMetadataPayload + presentationDefinitions?: PresentationDefinitionWithLocation[] // The optional presentation definition objects that the RP requests + verifyOpts: VerifyAuthorizationRequestOpts // The verification options for the authentication request + versions: SupportedVersion[] +} + +export type IDTokenJwt = string + +export interface IDTokenPayload extends JWTPayload { + iss?: ResponseIss.SELF_ISSUED_V2 | string + sub?: string // did (or thumbprint of sub_jwk key when type is jkt) + aud?: string // redirect_uri from request + iat?: number // Issued at time + exp?: number // Expiration time + auth_time?: number + nonce?: string + _vp_token?: { + /* + This profile currently supports including only a single VP in the VP Token. + In such cases, as defined in section 5.2 of OpenID4VP ID1, when the Self-Issued OP returns a single VP in the vp_token, + VP Token is not an array, and a single VP is passed as a vp_token. In this case, the descriptor map would contain a simple path expression “$”. + * It's not clear from the ID1 specs how to handle presentation submission in case of multiple VPs + */ + presentation_submission: PresentationSubmission + } +} + +export interface AuthorizationResponsePayload { + access_token?: string + token_type?: string + refresh_token?: string + expires_in?: number + state?: string + id_token?: string + vp_token?: Array | W3CVerifiablePresentation | CompactSdJwtVc + presentation_submission?: PresentationSubmission + verifiedData?: IPresentation | AdditionalClaims + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface IdTokenClaimPayload { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface VpTokenClaimPayload { + presentation_definition?: PresentationDefinitionV1 | PresentationDefinitionV2 + presentation_definition_uri?: string +} + +export interface ClaimPayloadCommon { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface ClaimPayloadVID1 extends ClaimPayloadCommon { + id_token?: IdTokenClaimPayload + vp_token?: VpTokenClaimPayload +} + +/** + * A wrapper for verifiablePresentation + * + */ +export interface VerifiablePresentationWithFormat { + format: VerifiablePresentationTypeFormat + presentation: W3CVerifiablePresentation +} + +export interface RequestStateInfo { + client_id: string // RP ID + + // sub: string + nonce: string + state: string + iat: number +} + +interface DiscoveryMetadataCommonOpts { + //TODO add the check: Mandatory if PassBy.Value + authorizationEndpoint?: Schema | string + // this is a confusion point. In the interop profile it mentions "https://self-issued.me/v2/openid-vc", but in the SIOPv2 it's mentioning "https://self-issued.me/v2" + // @Niels also created an issue here: https://github.com/decentralized-identity/jwt-vc-presentation-profile/issues/63 so we can keep an eye on this for clarification + //TODO add the check: Mandatory if PassBy.Value + issuer?: ResponseIss | string + //TODO add the check: Mandatory if PassBy.Value + responseTypesSupported?: ResponseType[] | ResponseType + scopesSupported?: Scope[] | Scope + subjectTypesSupported?: SubjectType[] | SubjectType + idTokenSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo + requestObjectSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo + //TODO add the check: Mandatory if PassBy.Value + subject_syntax_types_supported?: string[] + tokenEndpoint?: string // from openid connect discovery 1_0 + userinfoEndpoint?: string // from openid connect discovery 1_0 + jwksUri?: string // from openid connect discovery 1_0 + registrationEndpoint?: string // from openid connect discovery 1_0 + responseModesSupported?: ResponseMode[] | ResponseMode // from openid connect discovery 1_0 + grantTypesSupported?: GrantType[] | GrantType // from openid connect discovery 1_0 + acrValuesSupported?: AuthenticationContextReferences[] | AuthenticationContextReferences // from openid connect discovery 1_0 + idTokenEncryptionAlgValuesSupported?: SigningAlgo[] | SigningAlgo // from openid connect discovery 1_0 + idTokenEncryptionEncValuesSupported?: string[] | string // from openid connect discovery 1_0 + userinfoSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo // from openid connect discovery 1_0 + userinfoEncryptionAlgValuesSupported?: SigningAlgo[] | SigningAlgo // from openid connect discovery 1_0 + userinfoEncryptionEncValuesSupported?: string[] | string // from openid connect discovery 1_0 + requestObjectEncryptionAlgValuesSupported?: SigningAlgo[] | SigningAlgo // from openid connect discovery 1_0 + requestObjectEncryptionEncValuesSupported?: string[] | string // from openid connect discovery 1_0 + tokenEndpointAuthMethodsSupported?: TokenEndpointAuthMethod[] | TokenEndpointAuthMethod // from openid connect discovery 1_0 + tokenEndpointAuthSigningAlgValuesSupported?: SigningAlgo[] | SigningAlgo // from openid connect discovery 1_0 + displayValuesSupported?: string[] | string // from openid connect discovery 1_0 + claimTypesSupported?: ClaimType[] | ClaimType // from openid connect discovery 1_0 + claimsSupported?: string[] | string // recommended, from openid connect discovery 1_0 + serviceDocumentation?: string // from openid connect discovery 1_0 + claimsLocalesSupported?: string[] | string // from openid connect discovery 1_0 + uiLocalesSupported?: string[] | string // from openid connect discovery 1_0 + claimsParameterSupported?: boolean // from openid connect discovery 1_0 + requestParameterSupported?: boolean // from openid connect discovery 1_0 + requestUriParameterSupported?: boolean // from openid connect discovery 1_0 + requireRequestUriRegistration?: boolean // from openid connect discovery 1_0 + opPolicyUri?: string // from openid connect discovery 1_0 + opTosUri?: string // from openid connect discovery 1_0 + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +//same for jwt_vc +interface DiscoveryMetadataOptsVID1 extends DiscoveryMetadataCommonOpts { + client_id?: string // from oidc4vp + redirectUris?: string[] | string // from oidc4vp + clientName?: string // from oidc4vp + tokenEndpointAuthMethod?: string // from oidc4vp + applicationType?: string // from oidc4vp + responseTypes?: string // from oidc4vp, also name suggests array + grantTypes?: string // from oidc4vp, also name suggests array + //TODO add the check: Mandatory if PassBy.Value + vpFormats?: Format // from oidc4vp +} + +interface JWT_VCDiscoveryMetadataOpts extends DiscoveryMetadataOptsVID1 { + logo_uri?: string + clientPurpose?: string +} + +interface DiscoveryMetadataOptsVD11 extends DiscoveryMetadataCommonOpts { + idTokenTypesSupported?: IdTokenType[] | IdTokenType + vpFormatsSupported?: Format // from oidc4vp +} + +// https://openid.net/specs/openid-connect-self-issued-v2-1_0.html#section-8.2 +// https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata +interface DiscoveryMetadataCommonPayload { + authorization_endpoint?: Schema | string + issuer?: ResponseIss | string + response_types_supported?: ResponseType[] | ResponseType + scopes_supported?: Scope[] | Scope + subject_types_supported?: SubjectType[] | SubjectType + id_token_signing_alg_values_supported?: SigningAlgo[] | SigningAlgo + request_object_signing_alg_values_supported?: SigningAlgo[] | SigningAlgo + subject_syntax_types_supported?: string[] + token_endpoint?: string + userinfo_endpoint?: string + jwks_uri?: string + // marked as required by https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata + registration_endpoint?: string + response_modes_supported?: ResponseMode[] | ResponseMode + grant_types_supported?: GrantType[] | GrantType + acr_values_supported?: AuthenticationContextReferences[] | AuthenticationContextReferences + id_token_encryption_alg_values_supported?: SigningAlgo[] | SigningAlgo + /** + * OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for the ID Token to encode the Claims in a JWT [JWT]. + */ + //TODO: maybe add an enum for this with: A256GCM, A128CBC-HS256, ... + id_token_encryption_enc_values_supported?: string[] | string + userinfo_signing_alg_values_supported?: SigningAlgo[] | SigningAlgo + userinfo_encryption_alg_values_supported?: SigningAlgo[] | SigningAlgo + /** + * OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) [JWA] supported by the UserInfo Endpoint to encode the Claims in a JWT [JWT]. + */ + userinfo_encryption_enc_values_supported?: string[] | string + request_object_encryption_alg_values_supported?: SigningAlgo[] | SigningAlgo + /** + * OPTIONAL. JSON array containing a list of the JWE encryption algorithms (enc values) supported by the OP for Request Objects. These algorithms are used both when the Request Object is passed by value and when it is passed by reference. + */ + request_object_encryption_enc_values_supported?: string[] | string + token_endpoint_auth_methods_supported?: TokenEndpointAuthMethod[] | TokenEndpointAuthMethod + token_endpoint_auth_signing_alg_values_supported?: SigningAlgo[] | SigningAlgo + /** + * OPTIONAL. JSON array containing a list of the display parameter values that the OpenID Provider supports. These values are described in Section 3.1.2.1 of OpenID Connect Core 1.0 [OpenID.Core]. + */ + display_values_supported?: unknown[] | unknown + /** + * OPTIONAL. JSON array containing a list of the Claim Types that the OpenID Provider supports. These Claim Types are described in Section 5.6 of OpenID Connect Core 1.0 [OpenID.Core]. Values defined by this specification are normal, aggregated, and distributed. If omitted, the implementation supports only normal Claims. + */ + claim_types_supported?: ClaimType[] | ClaimType + /** + * RECOMMENDED. JSON array containing a list of the Claim Names of the Claims that the OpenID Provider MAY be able to supply values for. Note that for privacy or other reasons, this might not be an exhaustive list. + */ + claims_supported?: string[] | string + service_documentation?: string + claims_locales_supported?: string[] | string + ui_locales_supported?: string[] | string + claims_parameter_supported?: boolean + request_parameter_supported?: boolean + request_uri_parameter_supported?: boolean + require_request_uri_registration?: boolean + op_policy_uri?: string + op_tos_uri?: string + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +interface DiscoveryMetadataPayloadVID1 extends DiscoveryMetadataCommonPayload { + client_id?: string + redirect_uris?: string[] + client_name?: string + token_endpoint_auth_method?: string + application_type?: string + response_types?: string + grant_types?: string + vp_formats?: Format +} + +interface JWT_VCDiscoveryMetadataPayload extends DiscoveryMetadataPayloadVID1 { + logo_uri?: string + client_purpose?: string +} + +interface DiscoveryMetadataPayloadVD11 extends DiscoveryMetadataCommonPayload { + id_token_types_supported?: IdTokenType[] | IdTokenType + vp_formats_supported?: Format // from oidc4vp +} + +export type DiscoveryMetadataPayload = DiscoveryMetadataPayloadVID1 | JWT_VCDiscoveryMetadataPayload | DiscoveryMetadataPayloadVD11 + +export type DiscoveryMetadataOpts = (JWT_VCDiscoveryMetadataOpts | DiscoveryMetadataOptsVID1 | DiscoveryMetadataOptsVD11) & + DiscoveryMetadataCommonOpts + +export type ClientMetadataOpts = RPRegistrationMetadataOpts & ClientMetadataProperties + +export type ResponseRegistrationOpts = DiscoveryMetadataOpts & ClientMetadataProperties + +export type RPRegistrationMetadataOpts = Partial< + Pick< + DiscoveryMetadataOpts, + | 'client_id' + | 'idTokenSigningAlgValuesSupported' + | 'requestObjectSigningAlgValuesSupported' + | 'responseTypesSupported' + | 'scopesSupported' + | 'subjectTypesSupported' + | 'subject_syntax_types_supported' + | 'vpFormatsSupported' + | 'clientName' + | 'logo_uri' + | 'tos_uri' + | 'clientPurpose' + > +> & { + client_id_scheme?: ClientIdScheme + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export type RPRegistrationMetadataPayload = Pick< + DiscoveryMetadataPayload, + | 'client_id' + | 'id_token_signing_alg_values_supported' + | 'request_object_signing_alg_values_supported' + | 'response_types_supported' + | 'scopes_supported' + | 'subject_types_supported' + | 'subject_syntax_types_supported' + | 'vp_formats' + | 'client_name' + | 'logo_uri' + | 'client_purpose' +> & { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [x: string]: any +} + +export interface CommonSupportedMetadata { + subject_syntax_types_supported?: string[] + vp_formats: Format +} + +export interface ObjectBy { + passBy: PassBy + reference_uri?: string // for pass by reference + + targets?: PropertyTargets +} + +export enum AuthenticationContextReferences { + PHR = 'phr', + PHRH = 'phrh', +} + +export enum ClaimType { + NORMAL = 'normal', + AGGREGATED = 'aggregated', + DISTRIBUTED = 'distributed', +} + +export enum IdTokenType { + SUBJECT_SIGNED = 'subject_signed', + ATTESTER_SIGNED = 'attester_signed', +} + +export interface ClientMetadataProperties extends ObjectBy { + id_token_encrypted_response_alg?: EncKeyAlgorithm + id_token_encrypted_response_enc?: EncSymmetricAlgorithmCode +} + +export enum VerifiablePresentationTypeFormat { + JWT_VP = 'jwt_vp', + LDP_VP = 'ldp_vp', + SD_JWT_VC = 'vc+sd-jwt', +} + +export enum VerifiableCredentialTypeFormat { + LDP_VC = 'ldp_vc', + JWT_VC = 'jwt_vc', + SD_JWT_VC = 'vc+sd-jwt', +} + +export enum EncSymmetricAlgorithmCode { + XC20P = 'XC20P', // default +} + +export enum EncKeyAlgorithm { + ECDH_ES = 'ECDH-ES', // default +} + +export enum PassBy { + NONE = 'NONE', + REFERENCE = 'REFERENCE', + VALUE = 'VALUE', +} + +export enum ResponseContext { + RP = 'rp', + OP = 'op', +} + +export interface Verification { + presentationVerificationCallback?: PresentationVerificationCallback + revocationOpts?: RevocationOpts + replayRegistry?: IRPSessionManager +} + +export interface ResponseClaims { + verified_claims?: string + encryption_key?: JsonWebKey +} + +export interface VerifiedIDToken { + jwt: string + payload: IDTokenPayload + verifyOpts: VerifyAuthorizationResponseOpts +} + +export interface VerifiedOpenID4VPSubmission { + submissionData: PresentationSubmission + presentationDefinitions: PresentationDefinitionWithLocation[] + presentations: WrappedVerifiablePresentation[] + nonce: string +} + +export interface VerifiedAuthorizationResponse { + correlationId: string + + authorizationResponse: AuthorizationResponse + + oid4vpSubmission?: VerifiedOpenID4VPSubmission + + nonce?: string + state: string + + idToken?: VerifiedIDToken + verifyOpts?: VerifyAuthorizationResponseOpts +} + +export enum GrantType { + AUTHORIZATION_CODE = 'authorization_code', + IMPLICIT = 'implicit', +} + +export enum ResponseMode { + FRAGMENT = 'fragment', + FORM_POST = 'form_post', + POST = 'post', // Used in OID4VP spec <= version 17 + // Defined in openid4vp spec > 17 and replaces POST above + // See https://openid.net/specs/openid-4-verifiable-presentations-1_0.html#name-response-mode-direct_post + DIRECT_POST = 'direct_post', + QUERY = 'query', +} + +export enum ProtocolFlow { + SAME_DEVICE = 'same_device', + CROSS_DEVICE = 'cross_device', +} + +export interface SignatureResponse { + jws: string +} + +export enum UrlEncodingFormat { + FORM_URL_ENCODED = 'application/x-www-form-urlencoded', +} + +export type SIOPURI = { + encodedUri: string // The encoded URI + encodingFormat: UrlEncodingFormat // The encoding format used +} + +export interface UriResponse extends SIOPURI { + responseMode?: ResponseMode // The response mode as passed in during creation + bodyEncoded?: string // The URI encoded body (JWS) +} + +export interface AuthorizationRequestURI extends SIOPURI { + scheme: string + requestObjectBy: ObjectBy // The supplied request opts as passed in to the method + authorizationRequestPayload: AuthorizationRequestPayload // The authorization request payload + requestObjectJwt?: RequestObjectJwt // The JWT request object +} + +export interface ParsedAuthorizationRequestURI extends SIOPURI { + scheme: string + requestObjectJwt?: RequestObjectJwt + authorizationRequestPayload: AuthorizationRequestPayload // The json payload that ends up signed in the JWT + registration: RPRegistrationMetadataPayload +} + +export enum KeyType { + EC = 'EC', +} + +export enum KeyCurve { + SECP256k1 = 'secp256k1', + ED25519 = 'ed25519', +} + +export enum TokenEndpointAuthMethod { + CLIENT_SECRET_POST = 'client_secret_post', + CLIENT_SECRET_BASIC = 'client_secret_basic', + CLIENT_SECRET_JWT = 'client_secret_jwt', + PRIVATE_KEY_JWT = 'private_key_jwt', +} + +export enum SigningAlgo { + EDDSA = 'EdDSA', + RS256 = 'RS256', + PS256 = 'PS256', + ES256 = 'ES256', + ES256K = 'ES256K', +} + +export enum Scope { + OPENID = 'openid', + OPENID_DIDAUTHN = 'openid did_authn', + //added based on the https://openid.net/specs/openid-connect-implicit-1_0.html#SelfIssuedDiscovery + PROFILE = 'profile', + EMAIL = 'email', + ADDRESS = 'address', + PHONE = 'phone', +} + +export enum ResponseType { + ID_TOKEN = 'id_token', + VP_TOKEN = 'vp_token', +} + +export enum SubjectIdentifierType { + JKT = 'jkt', + DID = 'did', +} + +export enum SubjectSyntaxTypesSupportedValues { + DID = 'did', + JWK_THUMBPRINT = 'urn:ietf:params:oauth:jwk-thumbprint', +} + +export enum CredentialFormat { + JSON_LD = 'w3cvc-jsonld', + JWT = 'jwt', +} + +export enum SubjectType { + PUBLIC = 'public', + PAIRWISE = 'pairwise', +} + +export enum Schema { + OPENID = 'openid:', + OPENID_VC = 'openid-vc:', +} + +export enum ResponseIss { + SELF_ISSUED_V1 = 'https://self-issued.me', + SELF_ISSUED_V2 = 'https://self-issued.me/v2', + JWT_VC_PRESENTATION_V1 = 'https://self-issued.me/v2/openid-vc', +} + +export const isRequestOpts = (object: CreateAuthorizationRequestOpts | AuthorizationResponseOpts): object is CreateAuthorizationRequestOpts => + 'requestBy' in object + +export const isResponseOpts = ( + object: RequestObjectOpts | AuthorizationResponseOpts, +): object is RequestObjectOpts => 'did' in object + +export const isRequestPayload = ( + object: AuthorizationRequestPayload | RequestObjectPayload | AuthorizationResponsePayload | IDTokenPayload, +): object is AuthorizationRequestPayload => 'response_mode' in object && 'response_type' in object + +export const isResponsePayload = (object: RequestObjectPayload | IDTokenPayload): object is IDTokenPayload => 'iss' in object && 'aud' in object + +export const isVP = (object: IVerifiablePresentation | IPresentation): object is IVerifiablePresentation => 'presentation' in object +export const isPresentation = (object: IVerifiablePresentation | IPresentation): object is IPresentation => 'presentation_submission' in object + +export enum RevocationStatus { + VALID = 'valid', + INVALID = 'invalid', +} + +export interface IRevocationVerificationStatus { + status: RevocationStatus + error?: string +} + +export type RevocationVerificationCallback = ( + vc: W3CVerifiableCredential, + type: VerifiableCredentialTypeFormat, +) => Promise + +export enum RevocationVerification { + NEVER = 'never', // We don't want to verify revocation + IF_PRESENT = 'if_present', // If credentialStatus is present, did-auth-siop will verify revocation. If present and not valid an exception is thrown + ALWAYS = 'always', // We'll always check the revocation, if not present or not valid, throws an exception +} + +export interface RevocationOpts { + revocationVerification: RevocationVerification + revocationVerificationCallback?: RevocationVerificationCallback +} + +export enum SupportedVersion { + SIOPv2_ID1 = 70, + SIOPv2_D11 = 110, + SIOPv2_D12_OID4VP_D18 = 180, + SIOPv2_D12_OID4VP_D20 = 200, + JWT_VC_PRESENTATION_PROFILE_v1 = 71, +} + +export interface SIOPResonse { + origResponse: Response + successBody?: T + errorBody?: ErrorResponse +} + +export interface ErrorResponse extends Response { + error: string + error_description?: string + error_uri?: string + state?: string +} + +export enum ContentType { + FORM_URL_ENCODED = 'application/x-www-form-urlencoded', + UTF_8 = 'UTF-8', +} diff --git a/packages/siop-oid4vp/lib/types/SessionManager.ts b/packages/siop-oid4vp/lib/types/SessionManager.ts new file mode 100644 index 00000000..30268547 --- /dev/null +++ b/packages/siop-oid4vp/lib/types/SessionManager.ts @@ -0,0 +1,36 @@ +import { AuthorizationRequest } from '../authorization-request' +import { AuthorizationResponse } from '../authorization-response' + +export interface AuthorizationRequestState { + correlationId?: string + request: AuthorizationRequest + status: AuthorizationRequestStateStatus + timestamp: number + lastUpdated: number + error?: Error +} + +export interface AuthorizationResponseState { + correlationId?: string + response: AuthorizationResponse + status: AuthorizationResponseStateStatus + timestamp: number + lastUpdated: number + error?: Error +} + +export enum AuthorizationRequestStateStatus { + CREATED = 'created', + SENT = 'sent', + RECEIVED = 'received', + VERIFIED = 'verified', + ERROR = 'error', +} + +export enum AuthorizationResponseStateStatus { + CREATED = 'created', + SENT = 'sent', + RECEIVED = 'received', + VERIFIED = 'verified', + ERROR = 'error', +} diff --git a/packages/siop-oid4vp/lib/types/index.ts b/packages/siop-oid4vp/lib/types/index.ts new file mode 100644 index 00000000..f7971e6a --- /dev/null +++ b/packages/siop-oid4vp/lib/types/index.ts @@ -0,0 +1,9 @@ +import SIOPErrors from './Errors' + +export { SIOPErrors } +export * from './JWT.types' +export * from './SIOP.types' +export * from './Events' +export * from './SessionManager' +export * from './JwtIssuer' +export * from './JwtVerifier' diff --git a/packages/siop-oid4vp/package.json b/packages/siop-oid4vp/package.json new file mode 100644 index 00000000..58dee156 --- /dev/null +++ b/packages/siop-oid4vp/package.json @@ -0,0 +1,114 @@ +{ + "name": "@sphereon/did-auth-siop", + "version": "0.6.4", + "description": "Self Issued OpenID V2 (SIOPv2) and OpenID 4 Verifiable Presentations (OID4VP)", + "source": "lib/index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "pnpm run-s build:*", + "build:main": "tsc -p tsconfig.build.json", + "build:schemaGenerator": "node --loader=tsimp/loader generator/schemaGenerator.ts", + "clean": "rimraf dist coverage", + "uninstall": "rimraf dist coverage node_modules" + }, + "dependencies": { + "@astronautlabs/jsonpath": "^1.1.2", + "@sphereon/did-uni-client": "^0.6.2", + "@sphereon/pex": "^3.3.2", + "@sphereon/pex-models": "^2.2.4", + "@sphereon/ssi-types": "0.22.0", + "@sphereon/wellknown-dids-client": "^0.1.3", + "cross-fetch": "^4.0.0", + "jwt-decode": "^4.0.0", + "events": "^3.3.0", + "language-tags": "^1.0.9", + "multiformats": "^12.1.3", + "qs": "^6.11.2", + "sha.js": "^2.4.11", + "uint8arrays": "^3.1.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@babel/core": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.16.0", + "@babel/preset-env": "^7.16.0", + "did-jwt": "6.11.6", + "did-resolver": "^4.1.0", + "@cef-ebsi/ebsi-did-resolver": "^3.2.0", + "@cef-ebsi/key-did-resolver": "^1.1.0", + "@cef-ebsi/oauth2-auth": "^3.0.0", + "@cef-ebsi/siop-auth": "^4.0.0", + "@cef-ebsi/verifiable-presentation": "^6.1.0", + "@cef-ebsi/wallet-lib": "^4.2.0", + "@digitalcredentials/did-method-key": "^2.0.3", + "@digitalcredentials/ed25519-signature-2020": "^3.0.2", + "@digitalcredentials/jsonld-signatures": "^9.3.2", + "@digitalcredentials/vc": "^6.0.0", + "@transmute/did-key-ed25519": "^0.3.0-unstable.10", + "@transmute/ed25519-key-pair": "0.7.0-unstable.82", + "@transmute/ed25519-signature-2018": "^0.7.0-unstable.82", + "@types/jest": "^29.5.11", + "@types/jwt-decode": "^3.1.0", + "@types/language-tags": "^1.0.4", + "@types/qs": "^6.9.11", + "@types/sha.js": "^2.4.4", + "@types/uuid": "^9.0.7", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "ajv": "^8.12.0", + "bs58": "^5.0.0", + "codecov": "^3.8.3", + "cspell": "^6.26.3", + "dotenv": "^16.3.1", + "eslint": "^8.34.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-import": "^2.27.5", + "ethers": "^6.10.0", + "jest": "^29.7.0", + "jest-junit": "^16.0.0", + "jest-resolver-enhanced": "^1.1.0", + "jose": "^4.15.5", + "moment": "^2.30.1", + "nock": "^13.5.4", + "open-cli": "^8.0.0", + "prettier": "^3.2.5", + "ts-interface-checker": "^1.0.2", + "ts-jest": "^29.1.2", + "ts-json-schema-generator": "1.5.0", + "tsimp": "^2.0.11", + "typescript": "^5.4.2" + }, + "resolutions": { + "isomorphic-webcrypto": "npm:@sphereon/isomorphic-webcrypto@^2.4.1-unstable.0", + "esline/**/strip-ansi": "6.0.1" + }, + "engines": { + "node": ">=18" + }, + "files": [ + "lib/**/*", + "dist/**/*" + ], + "keywords": [ + "Sphereon", + "SSI", + "Credentials", + "OpenID", + "SIOP", + "Self Issued OpenID Connect", + "SIOPv2", + "OID4VC", + "OID4VP", + "OpenID4VP", + "OpenID4VC", + "OIDC4VP" + ], + "author": "Sphereon", + "license": "Apache-2.0", + "private": false, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/siop-oid4vp/tsconfig.build.json b/packages/siop-oid4vp/tsconfig.build.json new file mode 100644 index 00000000..57c88787 --- /dev/null +++ b/packages/siop-oid4vp/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["test/**/*.ts", "generator/**/*.ts"], + "ts-node": { + "esm": false + } +} diff --git a/packages/siop-oid4vp/tsconfig.json b/packages/siop-oid4vp/tsconfig.json new file mode 100644 index 00000000..b7e457a4 --- /dev/null +++ b/packages/siop-oid4vp/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../tsconfig-base.json", + "compilerOptions": { + "rootDir": "./lib", + "outDir": "./dist", + "declarationDir": "./dist", + "esModuleInterop": true, + "allowJs": true, + "strict": false, + "noImplicitReturns": true, + "listEmittedFiles": false, + "traceResolution": false + }, + "references": [ + { + "path": "../common" + } + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fad60a26..aff08a3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,7 @@ overrides: node-fetch: 2.6.12 importers: + .: devDependencies: '@types/debug': @@ -42,7 +43,7 @@ importers: version: 5.0.8 ts-jest: specifier: ^29.1.5 - version: 29.1.5(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5) typescript: specifier: 5.4.5 version: 5.4.5 @@ -188,7 +189,7 @@ importers: version: 7.2.0 ts-jest: specifier: ^29.1.5 - version: 29.1.5(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.5.3) + version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@18.19.39)(typescript@5.5.3) @@ -350,40 +351,261 @@ importers: version: 6.3.3 ts-jest: specifier: ^29.1.0 - version: 29.1.1(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.4.5) + version: 29.1.1(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5) + + packages/siop-oid4vp: + dependencies: + '@astronautlabs/jsonpath': + specifier: ^1.1.2 + version: 1.1.2 + '@sphereon/did-uni-client': + specifier: ^0.6.2 + version: 0.6.3 + '@sphereon/pex': + specifier: ^3.3.2 + version: 3.3.3 + '@sphereon/pex-models': + specifier: ^2.2.4 + version: 2.2.4 + '@sphereon/ssi-types': + specifier: 0.22.0 + version: 0.22.0 + '@sphereon/wellknown-dids-client': + specifier: ^0.1.3 + version: 0.1.3 + cross-fetch: + specifier: ^4.0.0 + version: 4.0.0 + events: + specifier: ^3.3.0 + version: 3.3.0 + jwt-decode: + specifier: ^4.0.0 + version: 4.0.0 + language-tags: + specifier: ^1.0.9 + version: 1.0.9 + multiformats: + specifier: ^12.1.3 + version: 12.1.3 + qs: + specifier: ^6.11.2 + version: 6.11.2 + sha.js: + specifier: ^2.4.11 + version: 2.4.11 + uint8arrays: + specifier: ^3.1.1 + version: 3.1.1 + uuid: + specifier: ^9.0.0 + version: 9.0.1 + devDependencies: + '@babel/core': + specifier: ^7.23.9 + version: 7.24.7 + '@babel/plugin-transform-runtime': + specifier: ^7.16.0 + version: 7.22.15(@babel/core@7.24.7) + '@babel/preset-env': + specifier: ^7.16.0 + version: 7.22.20(@babel/core@7.24.7) + '@cef-ebsi/ebsi-did-resolver': + specifier: ^3.2.0 + version: 3.2.0 + '@cef-ebsi/key-did-resolver': + specifier: ^1.1.0 + version: 1.1.0 + '@cef-ebsi/oauth2-auth': + specifier: ^3.0.0 + version: 3.0.1 + '@cef-ebsi/siop-auth': + specifier: ^4.0.0 + version: 4.0.1 + '@cef-ebsi/verifiable-presentation': + specifier: ^6.1.0 + version: 6.4.0(ajv@8.12.0) + '@cef-ebsi/wallet-lib': + specifier: ^4.2.0 + version: 4.2.0 + '@digitalcredentials/did-method-key': + specifier: ^2.0.3 + version: 2.0.3 + '@digitalcredentials/ed25519-signature-2020': + specifier: ^3.0.2 + version: 3.0.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/jsonld-signatures': + specifier: ^9.3.2 + version: 9.3.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/vc': + specifier: ^6.0.0 + version: 6.0.1(expo@48.0.20)(react-native@0.71.13) + '@transmute/did-key-ed25519': + specifier: ^0.3.0-unstable.10 + version: 0.3.0-unstable.10 + '@transmute/ed25519-key-pair': + specifier: 0.7.0-unstable.82 + version: 0.7.0-unstable.82 + '@transmute/ed25519-signature-2018': + specifier: ^0.7.0-unstable.82 + version: 0.7.0-unstable.82 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/jwt-decode': + specifier: ^3.1.0 + version: 3.1.0 + '@types/language-tags': + specifier: ^1.0.4 + version: 1.0.4 + '@types/qs': + specifier: ^6.9.11 + version: 6.9.15 + '@types/sha.js': + specifier: ^2.4.4 + version: 2.4.4 + '@types/uuid': + specifier: ^9.0.7 + version: 9.0.8 + '@typescript-eslint/eslint-plugin': + specifier: ^5.52.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': + specifier: ^5.52.0 + version: 5.62.0(eslint@8.57.0)(typescript@5.5.3) + ajv: + specifier: ^8.12.0 + version: 8.12.0 + bs58: + specifier: ^5.0.0 + version: 5.0.0 + codecov: + specifier: ^3.8.3 + version: 3.8.3 + cspell: + specifier: ^6.26.3 + version: 6.31.3 + did-jwt: + specifier: 6.11.6 + version: 6.11.6 + did-resolver: + specifier: ^4.1.0 + version: 4.1.0 + dotenv: + specifier: ^16.3.1 + version: 16.4.5 + eslint: + specifier: ^8.34.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.10.0(eslint@8.57.0) + eslint-plugin-eslint-comments: + specifier: ^3.2.0 + version: 3.2.0(eslint@8.57.0) + eslint-plugin-import: + specifier: ^2.27.5 + version: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) + ethers: + specifier: ^6.10.0 + version: 6.13.1 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.39) + jest-junit: + specifier: ^16.0.0 + version: 16.0.0 + jest-resolver-enhanced: + specifier: ^1.1.0 + version: 1.1.0 + jose: + specifier: ^4.15.5 + version: 4.15.9 + moment: + specifier: ^2.30.1 + version: 2.30.1 + nock: + specifier: ^13.5.4 + version: 13.5.4 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + open-cli: + specifier: ^8.0.0 + version: 8.0.0 + prettier: + specifier: ^3.2.5 + version: 3.3.2 + ts-interface-checker: + specifier: ^1.0.2 + version: 1.0.2 + ts-jest: + specifier: ^29.1.2 + version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3) + ts-json-schema-generator: + specifier: 1.5.0 + version: 1.5.0 + tsimp: + specifier: ^2.0.11 + version: 2.0.11(typescript@5.5.3) + typescript: + specifier: ^5.4.2 + version: 5.5.3 packages: + /@aashutoshrathi/word-wrap@1.2.6: - resolution: { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@adraffy/ens-normalize@1.10.1: + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} dev: true /@ampproject/remapping@2.2.1: - resolution: { integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 + /@astronautlabs/jsonpath@1.1.2: + resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==} + dependencies: + static-eval: 2.0.2 + dev: false + /@babel/code-frame@7.10.4: - resolution: { integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== } + resolution: {integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==} dependencies: '@babel/highlight': 7.22.20 /@babel/code-frame@7.22.13: - resolution: { integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.22.20 chalk: 2.4.2 + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.0 + /@babel/compat-data@7.22.20: - resolution: { integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + + /@babel/compat-data@7.24.7: + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + engines: {node: '>=6.9.0'} /@babel/core@7.23.0: - resolution: { integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 @@ -403,30 +625,61 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core@7.24.7: + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + /@babel/generator@7.23.0: - resolution: { integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 + /@babel/generator@7.24.7: + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + /@babel/helper-annotate-as-pure@7.22.5: - resolution: { integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: { integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 /@babel/helper-compilation-targets@7.22.15: - resolution: { integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/compat-data': 7.22.20 '@babel/helper-validator-option': 7.22.15 @@ -434,9 +687,19 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 + /@babel/helper-compilation-targets@7.24.7: + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.2 + lru-cache: 5.1.1 + semver: 6.3.1 + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -451,9 +714,26 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 semver: 6.3.1 + /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -462,8 +742,19 @@ packages: regexpu-core: 5.3.2 semver: 6.3.1 + /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.23.0): - resolution: { integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== } + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -476,38 +767,80 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.24.7): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.5 + lodash.debounce: 4.0.8 + resolve: 1.22.6 + transitivePeerDependencies: + - supports-color + /@babel/helper-environment-visitor@7.22.20: - resolution: { integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 /@babel/helper-function-name@7.23.0: - resolution: { integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + /@babel/helper-hoist-variables@7.22.5: - resolution: { integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 + /@babel/helper-member-expression-to-functions@7.23.0: - resolution: { integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 /@babel/helper-module-imports@7.22.15: - resolution: { integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -518,19 +851,47 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 + /@babel/helper-module-transforms@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color + /@babel/helper-optimise-call-expression@7.22.5: - resolution: { integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 /@babel/helper-plugin-utils@7.22.5: - resolution: { integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0): - resolution: { integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -539,9 +900,20 @@ packages: '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 + /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.7): + resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-wrap-function': 7.22.20 + /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.0): - resolution: { integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -550,47 +922,85 @@ packages: '@babel/helper-member-expression-to-functions': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 + /@babel/helper-replace-supers@7.22.20(@babel/core@7.24.7): + resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 + /@babel/helper-simple-access@7.22.5: - resolution: { integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: { integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 /@babel/helper-split-export-declaration@7.22.6: - resolution: { integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.0 + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 + /@babel/helper-string-parser@7.22.5: - resolution: { integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-string-parser@7.24.7: + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: - resolution: { integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} /@babel/helper-validator-option@7.22.15: - resolution: { integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.24.7: + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + engines: {node: '>=6.9.0'} /@babel/helper-wrap-function@7.22.20: - resolution: { integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.22.15 '@babel/types': 7.23.0 /@babel/helpers@7.23.1: - resolution: { integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.23.0 @@ -598,33 +1008,66 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers@7.24.7: + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 + /@babel/highlight@7.22.20: - resolution: { integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + /@babel/parser@7.23.0: - resolution: { integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.23.0 + /@babel/parser@7.24.7: + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.7 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: @@ -633,9 +1076,21 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.24.7) + dev: true + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.23.0): - resolution: { integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -646,9 +1101,22 @@ packages: '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.7): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.23.0): - resolution: { integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -657,9 +1125,20 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.7): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + /@babel/plugin-proposal-decorators@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -671,8 +1150,8 @@ packages: '@babel/plugin-syntax-decorators': 7.22.10(@babel/core@7.23.0) /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.23.0): - resolution: { integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -680,9 +1159,31 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.23.0) + /@babel/plugin-proposal-export-default-from@7.22.17(@babel/core@7.24.7): + resolution: {integrity: sha512-cop/3quQBVvdz6X5SJC6AhUv3C9DrVTM06LUEXimEdWAhCSyOJIr9NiZDU9leHZ0/aiG0Sh7Zmvaku5TWYNgbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.24.7) + + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.24.7): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.0): - resolution: { integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -691,9 +1192,20 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.7): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.23.0): - resolution: { integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -705,9 +1217,23 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.7): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.7) + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.23.0): - resolution: { integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 @@ -716,593 +1242,565 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.0): - resolution: { integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== } - engines: { node: '>=6.9.0' } - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.7): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): - resolution: { integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== } - engines: { node: '>=6.9.0' } + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.23.0): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): - resolution: { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== } + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.7): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== } + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): - resolution: { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== } + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.24.7 + dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): - resolution: { integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.0): - resolution: { integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== } + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== } + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-decorators@7.22.10(@babel/core@7.23.0): + resolution: {integrity: sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): - resolution: { integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== } + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== } + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): - resolution: { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== } + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== } + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): - resolution: { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== } + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== } + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== } + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): - resolution: { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== } + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): - resolution: { integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): - resolution: { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): - resolution: { integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + dev: true - /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 - /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.0) - /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + dev: true - /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-async-generator-functions@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + dev: true - /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) - /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 - '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 + '@babel/core': 7.24.7 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.7) - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) - /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-block-scoping@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -1310,404 +1808,1839 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): - resolution: { integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-classes@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.7) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.15 - /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/types': 7.23.0 + '@babel/template': 7.22.15 - /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): - resolution: { integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 - /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-destructuring@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.22.15 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) '@babel/helper-plugin-utils': 7.22.5 + dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.23.0) - /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): - resolution: { integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.24.7) + + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-for-of@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): - resolution: { integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - /@babel/preset-env@7.22.20(@babel/core@7.23.0): - resolution: { integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.22.20 '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) - '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) - '@babel/types': 7.23.0 - babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) - babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) - babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) - core-js-compat: 3.32.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/preset-flow@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.23.0) - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): - resolution: { integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== } + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.0 - esutils: 2.0.3 - /@babel/preset-typescript@7.23.0(@babel/core@7.23.0): - resolution: { integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-modules-amd@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) - '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.23.0) + '@babel/helper-simple-access': 7.22.5 + + /@babel/plugin-transform-modules-commonjs@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 - /@babel/register@7.22.15(@babel/core@7.23.0): - resolution: { integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.0 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 - /@babel/regjsgen@0.8.0: - resolution: { integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== } + /@babel/plugin-transform-modules-systemjs@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + dev: true - /@babel/runtime@7.23.1: - resolution: { integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - regenerator-runtime: 0.14.0 + '@babel/core': 7.23.0 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 - /@babel/template@7.22.15: - resolution: { integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== } - engines: { node: '>=6.9.0' } + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 + '@babel/core': 7.24.7 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + + /@babel/plugin-transform-object-rest-spread@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.7) + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + + /@babel/plugin-transform-optional-chaining@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-parameters@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.23.0): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.24.7): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + dev: true + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) + '@babel/types': 7.23.0 + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.7) + '@babel/types': 7.23.0 + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.23.0): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.24.7): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-runtime@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.24.7) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.24.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.23.0): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + + /@babel/plugin-transform-typescript@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.24.7) + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.23.0): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.24.7): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.22.5 + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.24.7): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.22.20(@babel/core@7.23.0): + resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.0) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.23.0) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.23.0) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.23.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.0) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.23.0) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.23.0) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.23.0) + core-js-compat: 3.32.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/preset-env@7.22.20(@babel/core@7.24.7): + resolution: {integrity: sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-async-generator-functions': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-modules-amd': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-modules-systemjs': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-object-rest-spread': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-optional-chaining': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.24.7) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.24.7) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.24.7) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.7) + '@babel/types': 7.23.0 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.24.7) + babel-plugin-polyfill-corejs3: 0.8.4(@babel/core@7.24.7) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.24.7) + core-js-compat: 3.32.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-flow@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.24.7) + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.7): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.23.0 + esutils: 2.0.3 + dev: true + + /@babel/preset-typescript@7.23.0(@babel/core@7.24.7): + resolution: {integrity: sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.24.7) + + /@babel/register@7.22.15(@babel/core@7.24.7): + resolution: {integrity: sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + /@babel/runtime@7.23.1: + resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.24.7: + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + /@babel/types@7.24.7: + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@bitauth/libauth@1.19.1: + resolution: {integrity: sha512-R524tD5VwOt3QRHr7N518nqTVR/HKgfWL4LypekcGuNQN8R4PWScvuRcRzrY39A28kLztMv+TJdiKuMNbkU1ug==} + engines: {node: '>=8.9'} + dev: true + + /@cef-ebsi/ebsi-did-resolver@3.2.0: + resolution: {integrity: sha512-4wM5TK5l6xRBSkOCEZRP64Xqsd0BqmvjfSpREn8fXbrpMZqOafku77YQSMzqFmOIQ62HSEi5Vf4CSzDHAmalig==} + engines: {node: '>=16.10.0'} + dependencies: + axios: 1.6.8 + did-resolver: 4.1.0 + jose: 4.15.9 + multiformats: 9.9.0 + transitivePeerDependencies: + - debug + dev: true + + /@cef-ebsi/ebsi-did-resolver@4.0.1: + resolution: {integrity: sha512-C41kMKdEMRZJfE9QL0J+wowyNWLD8yc4x9fRwtIbtz/EhABeeC8OZHJ950NVGgYGwv34CtuRWfp4fIyodrcG5Q==} + dependencies: + axios: 1.6.8 + did-resolver: 4.1.0 + multiformats: 12.1.3 + transitivePeerDependencies: + - debug + dev: true + + /@cef-ebsi/key-did-resolver@1.1.0: + resolution: {integrity: sha512-fx8otCet0vRM/PnndGHHhuWBy5EpX142RsfKT3DTH8/a3Yjkdo8S+C9bGHbDdc6PowPyp4FgF/6XVQUH45iu1A==} + engines: {node: '>=16.10.0'} + dependencies: + did-resolver: 4.1.0 + jose: 4.15.9 + lodash.isplainobject: 4.0.6 + multiformats: 9.9.0 + web-encoding: 1.1.5 + dev: true + + /@cef-ebsi/key-did-resolver@2.0.1: + resolution: {integrity: sha512-+OqXuw5ci+DPTR5D7Ap8C6l5xU4FbY4nWTPc5rHXqWB3poWZrJA3xrddqNUshLUZj/nkw1UzRPhFmuD8jWBZRg==} + dependencies: + did-resolver: 4.1.0 + jose: 4.15.9 + lodash.isplainobject: 4.0.6 + multiformats: 12.1.3 + dev: true + + /@cef-ebsi/key-encoder@1.0.1: + resolution: {integrity: sha512-r6tQjW3eVz6p6NlJr0eYsHFo8gfV33DIBOCyD5bHLhunA9AE1BmGtUsbG+kuOr92uCaWKF/vpOfycEbtr6SDEw==} + dependencies: + asn1.js: 5.4.1 + elliptic: 6.5.5 + dev: true + + /@cef-ebsi/oauth2-auth@3.0.1: + resolution: {integrity: sha512-9693Rgxty7Pda/H24yTd+kKITz0r88pKe+d4Ukq8zr54Eso/uxb0o3W4JzmDHBZAtGMYZk90wRlv387KaLpmnA==} + dependencies: + '@cef-ebsi/key-encoder': 1.0.1 + '@cef-ebsi/siop-auth': 4.0.1 + '@noble/hashes': 1.4.0 + did-jwt: 8.0.4 + eciesjs: 0.4.7 + elliptic: 6.5.5 + jose: 4.15.9 + multiformats: 12.1.3 + uuid: 9.0.1 + transitivePeerDependencies: + - debug + dev: true + + /@cef-ebsi/siop-auth@4.0.1: + resolution: {integrity: sha512-t2uqabqZ6vbOxsSX4M/wsBZjrm6J8X/yPdDL4G9PlA9GGeUI2TU2O6VdpmatVbKoDOWRIhiR8aFXNtswogKn6g==} + dependencies: + '@cef-ebsi/ebsi-did-resolver': 4.0.1 + '@cef-ebsi/key-did-resolver': 2.0.1 + '@cef-ebsi/key-encoder': 1.0.1 + '@noble/hashes': 1.4.0 + axios: 1.6.8 + did-jwt: 8.0.4 + did-resolver: 4.1.0 + eciesjs: 0.4.7 + elliptic: 6.5.5 + jose: 4.15.9 + multiformats: 12.1.3 + uuid: 9.0.1 + transitivePeerDependencies: + - debug + dev: true + + /@cef-ebsi/vcdm1.1-accreditation-schema@1.3.0: + resolution: {integrity: sha512-1kjxKsnR3tD8+tzL56jV9E1Si3bL65i1fYuG0APVmlEa9pmzLUwpUO6TUHBbsJephDZpgsgEL7C7eWXXrqdujQ==} + dependencies: + '@cef-ebsi/vcdm1.1-attestation-schema': 1.3.0 + dev: true + + /@cef-ebsi/vcdm1.1-attestation-schema@1.3.0: + resolution: {integrity: sha512-A8ol6bUOGdYFeAWRAg8WMymgCtzQXRXP5S6zi7JB8o4VU3ICylRqYcQM83BHwmZNGF+uwRwEmkIGX9Z0kF9dDg==} + dev: true + + /@cef-ebsi/vcdm1.1-presentation-schema@1.0.3: + resolution: {integrity: sha512-MAbThvUOBG75kSE4iSSGvEFTxMgBFUrMQCsPCXi+oteStXpHSIy8JEg6UFyrLqmDqKK1MY4SzuopkW9dm5Y1+A==} + dev: true + + /@cef-ebsi/vcdm1.1-revocation-statuslist-schema@1.3.0: + resolution: {integrity: sha512-nFRBQFVI33lRUwuGM5ow7xX+Vm17GdbXhK5cZ+qmFkx3dsFUpFxOEUqobvRr0MH0vwkLKIU4v9bzlHXUPmlIGA==} + dependencies: + '@cef-ebsi/vcdm1.1-attestation-schema': 1.3.0 + dev: true + + /@cef-ebsi/verifiable-credential@5.5.0: + resolution: {integrity: sha512-WmHlKT0ykovbbYTO6rBvECEyTGFnFZhw65Hy8x+p9/jn+GBjj0qsh78qahKUZM+Biau8wKNx6r8n+pKjK8dHjg==} + dependencies: + '@cef-ebsi/ebsi-did-resolver': 4.0.1 + '@cef-ebsi/key-did-resolver': 2.0.1 + '@cef-ebsi/vcdm1.1-accreditation-schema': 1.3.0 + '@cef-ebsi/vcdm1.1-attestation-schema': 1.3.0 + '@cef-ebsi/vcdm1.1-revocation-statuslist-schema': 1.3.0 + '@segment/ajv-human-errors': 2.13.0(ajv@8.12.0) + '@transmute/json-web-signature': 0.7.0-unstable.82 + '@transmute/vc.js': 0.7.0-unstable.82 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + axios: 1.6.8 + did-resolver: 4.1.0 + elliptic: 6.5.5 + ethers: 5.7.2 + jose: 4.15.9 + lodash.clonedeep: 4.5.0 + memoize: 10.0.0 + multiformats: 12.1.3 + pako: 2.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - utf-8-validate + - web-streams-polyfill + dev: true + + /@cef-ebsi/verifiable-presentation@6.4.0(ajv@8.12.0): + resolution: {integrity: sha512-ESx/xngeQOWvIE8O71ZbrSudlCEYZX7lu+ImzX3Y3IFvQLKS8WJzjXkrpBTqK1Q8gNmPsh02Td1iVH3auBkInA==} + dependencies: + '@cef-ebsi/ebsi-did-resolver': 4.0.1 + '@cef-ebsi/key-did-resolver': 2.0.1 + '@cef-ebsi/vcdm1.1-presentation-schema': 1.0.3 + '@cef-ebsi/verifiable-credential': 5.5.0 + '@segment/ajv-human-errors': 2.13.0(ajv@8.12.0) + '@transmute/json-web-signature': 0.7.0-unstable.82 + '@transmute/vc.js': 0.7.0-unstable.82 + did-resolver: 4.1.0 + jose: 4.15.9 + memoize: 10.0.0 + multiformats: 12.1.3 + transitivePeerDependencies: + - ajv + - bufferutil + - debug + - encoding + - utf-8-validate + - web-streams-polyfill + dev: true + + /@cef-ebsi/wallet-lib@4.2.0: + resolution: {integrity: sha512-cvoAflA5M1//xr4R7mGzJhjDlgImpsOQjOmv9jH3Tatoz9yscJrjbhc8ISftsdtghmMnzw982SfLWEY02spVcw==} + dependencies: + '@cef-ebsi/ebsi-did-resolver': 3.2.0 + '@cef-ebsi/key-did-resolver': 1.1.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + bn.js: 5.2.1 + did-jwt: 6.11.6 + elliptic: 6.5.4 + jose: 4.15.9 + js-sha3: 0.8.0 + key-encoder: 2.0.3 + multiformats: 9.9.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + dev: true + + /@cspell/cspell-bundled-dicts@6.31.3: + resolution: {integrity: sha512-KXy3qKWYzXOGYwqOGMCXHem3fV39iEmoKLiNhoWWry/SFdvAafmeY+LIDcQTXAcOQLkMDCwP2/rY/NadcWnrjg==} + engines: {node: '>=14'} + dependencies: + '@cspell/dict-ada': 4.0.2 + '@cspell/dict-aws': 3.0.0 + '@cspell/dict-bash': 4.1.3 + '@cspell/dict-companies': 3.1.2 + '@cspell/dict-cpp': 5.1.10 + '@cspell/dict-cryptocurrencies': 3.0.1 + '@cspell/dict-csharp': 4.0.2 + '@cspell/dict-css': 4.0.12 + '@cspell/dict-dart': 2.0.3 + '@cspell/dict-django': 4.1.0 + '@cspell/dict-docker': 1.1.7 + '@cspell/dict-dotnet': 5.0.2 + '@cspell/dict-elixir': 4.0.3 + '@cspell/dict-en-common-misspellings': 1.0.2 + '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.3.23 + '@cspell/dict-filetypes': 3.0.4 + '@cspell/dict-fonts': 3.0.2 + '@cspell/dict-fullstack': 3.1.8 + '@cspell/dict-gaming-terms': 1.0.5 + '@cspell/dict-git': 2.0.0 + '@cspell/dict-golang': 6.0.9 + '@cspell/dict-haskell': 4.0.1 + '@cspell/dict-html': 4.0.5 + '@cspell/dict-html-symbol-entities': 4.0.0 + '@cspell/dict-java': 5.0.7 + '@cspell/dict-k8s': 1.0.5 + '@cspell/dict-latex': 4.0.0 + '@cspell/dict-lorem-ipsum': 3.0.0 + '@cspell/dict-lua': 4.0.3 + '@cspell/dict-node': 4.0.3 + '@cspell/dict-npm': 5.0.16 + '@cspell/dict-php': 4.0.8 + '@cspell/dict-powershell': 5.0.4 + '@cspell/dict-public-licenses': 2.0.7 + '@cspell/dict-python': 4.2.1 + '@cspell/dict-r': 2.0.1 + '@cspell/dict-ruby': 5.0.2 + '@cspell/dict-rust': 4.0.4 + '@cspell/dict-scala': 5.0.2 + '@cspell/dict-software-terms': 3.4.10 + '@cspell/dict-sql': 2.1.3 + '@cspell/dict-svelte': 1.0.2 + '@cspell/dict-swift': 2.0.1 + '@cspell/dict-typescript': 3.1.5 + '@cspell/dict-vue': 3.0.0 + dev: true + + /@cspell/cspell-json-reporter@6.31.3: + resolution: {integrity: sha512-ZJwj2vT4lxncYxduXcxy0dCvjjMvXIfphbLSCN5CXvufrtupB4KlcjZUnOofCi4pfpp8qocCSn1lf2DU9xgUXA==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-types': 6.31.3 + dev: true + + /@cspell/cspell-pipe@6.31.3: + resolution: {integrity: sha512-Lv/y4Ya/TJyU1pf66yl1te7LneFZd3lZg1bN5oe1cPrKSmfWdiX48v7plTRecWd/OWyLGd0yN807v79A+/0W7A==} + engines: {node: '>=14'} + dev: true + + /@cspell/cspell-service-bus@6.31.3: + resolution: {integrity: sha512-x5j8j3n39KN8EXOAlv75CpircdpF5WEMCC5pcO916o6GBmJBy8SrdzdsBGJhVcYGGilqy6pf8R9RCZ3yAmG8gQ==} + engines: {node: '>=14'} + dev: true + + /@cspell/cspell-types@6.31.3: + resolution: {integrity: sha512-wZ+t+lUsQJB65M31btZM4fH3K1CkRgE8pSeTiCwxYcnCL19pi4TMcEEMKdO8yFZMdocW4B7VRwzxNoQMw2ewBg==} + engines: {node: '>=14'} + dev: true + + /@cspell/dict-ada@4.0.2: + resolution: {integrity: sha512-0kENOWQeHjUlfyId/aCM/mKXtkEgV0Zu2RhUXCBr4hHo9F9vph+Uu8Ww2b0i5a4ZixoIkudGA+eJvyxrG1jUpA==} + dev: true + + /@cspell/dict-aws@3.0.0: + resolution: {integrity: sha512-O1W6nd5y3Z00AMXQMzfiYrIJ1sTd9fB1oLr+xf/UD7b3xeHeMeYE2OtcWbt9uyeHim4tk+vkSTcmYEBKJgS5bQ==} + dev: true + + /@cspell/dict-bash@4.1.3: + resolution: {integrity: sha512-tOdI3QVJDbQSwPjUkOiQFhYcu2eedmX/PtEpVWg0aFps/r6AyjUQINtTgpqMYnYuq8O1QUIQqnpx21aovcgZCw==} + dev: true + + /@cspell/dict-companies@3.1.2: + resolution: {integrity: sha512-OwR5i1xbYuJX7FtHQySmTy3iJtPV1rZQ3jFCxFGwrA1xRQ4rtRcDQ+sTXBCIAoJHkXa84f9J3zsngOKmMGyS/w==} + dev: true + + /@cspell/dict-cpp@5.1.10: + resolution: {integrity: sha512-BmIF0sAz2BgGEOwzYIeEm9ALneDjd1tcTbFbo+A1Hcq3zOKP8yViSgxS9CEN30KOZIyph6Tldp531UPEpoEl0Q==} + dev: true + + /@cspell/dict-cryptocurrencies@3.0.1: + resolution: {integrity: sha512-Tdlr0Ahpp5yxtwM0ukC13V6+uYCI0p9fCRGMGZt36rWv8JQZHIuHfehNl7FB/Qc09NCF7p5ep0GXbL+sVTd/+w==} + dev: true + + /@cspell/dict-csharp@4.0.2: + resolution: {integrity: sha512-1JMofhLK+4p4KairF75D3A924m5ERMgd1GvzhwK2geuYgd2ZKuGW72gvXpIV7aGf52E3Uu1kDXxxGAiZ5uVG7g==} + dev: true + + /@cspell/dict-css@4.0.12: + resolution: {integrity: sha512-vGBgPM92MkHQF5/2jsWcnaahOZ+C6OE/fPvd5ScBP72oFY9tn5GLuomcyO0z8vWCr2e0nUSX1OGimPtcQAlvSw==} + dev: true + + /@cspell/dict-dart@2.0.3: + resolution: {integrity: sha512-cLkwo1KT5CJY5N5RJVHks2genFkNCl/WLfj+0fFjqNR+tk3tBI1LY7ldr9piCtSFSm4x9pO1x6IV3kRUY1lLiw==} + dev: true + + /@cspell/dict-data-science@2.0.1: + resolution: {integrity: sha512-xeutkzK0eBe+LFXOFU2kJeAYO6IuFUc1g7iRLr7HeCmlC4rsdGclwGHh61KmttL3+YHQytYStxaRBdGAXWC8Lw==} + dev: true + + /@cspell/dict-django@4.1.0: + resolution: {integrity: sha512-bKJ4gPyrf+1c78Z0Oc4trEB9MuhcB+Yg+uTTWsvhY6O2ncFYbB/LbEZfqhfmmuK/XJJixXfI1laF2zicyf+l0w==} + dev: true + + /@cspell/dict-docker@1.1.7: + resolution: {integrity: sha512-XlXHAr822euV36GGsl2J1CkBIVg3fZ6879ZOg5dxTIssuhUOCiV2BuzKZmt6aIFmcdPmR14+9i9Xq+3zuxeX0A==} + dev: true + + /@cspell/dict-dotnet@5.0.2: + resolution: {integrity: sha512-UD/pO2A2zia/YZJ8Kck/F6YyDSpCMq0YvItpd4YbtDVzPREfTZ48FjZsbYi4Jhzwfvc6o8R56JusAE58P+4sNQ==} + dev: true + + /@cspell/dict-elixir@4.0.3: + resolution: {integrity: sha512-g+uKLWvOp9IEZvrIvBPTr/oaO6619uH/wyqypqvwpmnmpjcfi8+/hqZH8YNKt15oviK8k4CkINIqNhyndG9d9Q==} + dev: true + + /@cspell/dict-en-common-misspellings@1.0.2: + resolution: {integrity: sha512-jg7ZQZpZH7+aAxNBlcAG4tGhYF6Ksy+QS5Df73Oo+XyckBjC9QS+PrRwLTeYoFIgXy5j3ICParK5r3MSSoL4gw==} + dev: true + + /@cspell/dict-en-gb@1.1.33: + resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} + dev: true + + /@cspell/dict-en_us@4.3.23: + resolution: {integrity: sha512-l0SoEQBsi3zDSl3OuL4/apBkxjuj4hLIg/oy6+gZ7LWh03rKdF6VNtSZNXWAmMY+pmb1cGA3ouleTiJIglbsIg==} + dev: true + + /@cspell/dict-filetypes@3.0.4: + resolution: {integrity: sha512-IBi8eIVdykoGgIv5wQhOURi5lmCNJq0we6DvqKoPQJHthXbgsuO1qrHSiUVydMiQl/XvcnUWTMeAlVUlUClnVg==} + dev: true + + /@cspell/dict-fonts@3.0.2: + resolution: {integrity: sha512-Z5QdbgEI7DV+KPXrAeDA6dDm/vTzyaW53SGlKqz6PI5VhkOjgkBXv3YtZjnxMZ4dY2ZIqq+RUK6qa9Pi8rQdGQ==} + dev: true + + /@cspell/dict-fullstack@3.1.8: + resolution: {integrity: sha512-YRlZupL7uqMCtEBK0bDP9BrcPnjDhz7m4GBqCc1EYqfXauHbLmDT8ELha7T/E7wsFKniHSjzwDZzhNXo2lusRQ==} + dev: true + + /@cspell/dict-gaming-terms@1.0.5: + resolution: {integrity: sha512-C3riccZDD3d9caJQQs1+MPfrUrQ+0KHdlj9iUR1QD92FgTOF6UxoBpvHUUZ9YSezslcmpFQK4xQQ5FUGS7uWfw==} + dev: true + + /@cspell/dict-git@2.0.0: + resolution: {integrity: sha512-n1AxyX5Kgxij/sZFkxFJlzn3K9y/sCcgVPg/vz4WNJ4K9YeTsUmyGLA2OQI7d10GJeiuAo2AP1iZf2A8j9aj2w==} + dev: true + + /@cspell/dict-golang@6.0.9: + resolution: {integrity: sha512-etDt2WQauyEQDA+qPS5QtkYTb2I9l5IfQftAllVoB1aOrT6bxxpHvMEpJ0Hsn/vezxrCqa/BmtUbRxllIxIuSg==} + dev: true + + /@cspell/dict-haskell@4.0.1: + resolution: {integrity: sha512-uRrl65mGrOmwT7NxspB4xKXFUenNC7IikmpRZW8Uzqbqcu7ZRCUfstuVH7T1rmjRgRkjcIjE4PC11luDou4wEQ==} + dev: true + + /@cspell/dict-html-symbol-entities@4.0.0: + resolution: {integrity: sha512-HGRu+48ErJjoweR5IbcixxETRewrBb0uxQBd6xFGcxbEYCX8CnQFTAmKI5xNaIt2PKaZiJH3ijodGSqbKdsxhw==} + dev: true + + /@cspell/dict-html@4.0.5: + resolution: {integrity: sha512-p0brEnRybzSSWi8sGbuVEf7jSTDmXPx7XhQUb5bgG6b54uj+Z0Qf0V2n8b/LWwIPJNd1GygaO9l8k3HTCy1h4w==} + dev: true + + /@cspell/dict-java@5.0.7: + resolution: {integrity: sha512-ejQ9iJXYIq7R09BScU2y5OUGrSqwcD+J5mHFOKbduuQ5s/Eh/duz45KOzykeMLI6KHPVxhBKpUPBWIsfewECpQ==} + dev: true + + /@cspell/dict-k8s@1.0.5: + resolution: {integrity: sha512-Cj+/ZV4S+MKlwfocSJZqe/2UAd/sY8YtlZjbK25VN1nCnrsKrBjfkX29vclwSj1U9aJg4Z9jw/uMjoaKu9ZrpQ==} + dev: true + + /@cspell/dict-latex@4.0.0: + resolution: {integrity: sha512-LPY4y6D5oI7D3d+5JMJHK/wxYTQa2lJMSNxps2JtuF8hbAnBQb3igoWEjEbIbRRH1XBM0X8dQqemnjQNCiAtxQ==} + dev: true + + /@cspell/dict-lorem-ipsum@3.0.0: + resolution: {integrity: sha512-msEV24qEpzWZs2kcEicqYlhyBpR0amfDkJOs+iffC07si9ftqtQ+yP3lf1VFLpgqw3SQh1M1vtU7RD4sPrNlcQ==} + dev: true + + /@cspell/dict-lua@4.0.3: + resolution: {integrity: sha512-lDHKjsrrbqPaea13+G9s0rtXjMO06gPXPYRjRYawbNmo4E/e3XFfVzeci3OQDQNDmf2cPOwt9Ef5lu2lDmwfJg==} + dev: true + + /@cspell/dict-node@4.0.3: + resolution: {integrity: sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==} + dev: true + + /@cspell/dict-npm@5.0.16: + resolution: {integrity: sha512-ZWPnLAziEcSCvV0c8k9Qj88pfMu+wZwM5Qks87ShsfBgI8uLZ9tGHravA7gmjH1Gd7Bgxy2ulvXtSqIWPh1lew==} + dev: true + + /@cspell/dict-php@4.0.8: + resolution: {integrity: sha512-TBw3won4MCBQ2wdu7kvgOCR3dY2Tb+LJHgDUpuquy3WnzGiSDJ4AVelrZdE1xu7mjFJUr4q48aB21YT5uQqPZA==} + dev: true + + /@cspell/dict-powershell@5.0.4: + resolution: {integrity: sha512-eosDShapDgBWN9ULF7+sRNdUtzRnUdsfEdBSchDm8FZA4HOqxUSZy3b/cX/Rdw0Fnw0AKgk0kzgXw7tS6vwJMQ==} + dev: true + + /@cspell/dict-public-licenses@2.0.7: + resolution: {integrity: sha512-KlBXuGcN3LE7tQi/GEqKiDewWGGuopiAD0zRK1QilOx5Co8XAvs044gk4MNIQftc8r0nHeUI+irJKLGcR36DIQ==} + dev: true + + /@cspell/dict-python@4.2.1: + resolution: {integrity: sha512-9X2jRgyM0cxBoFQRo4Zc8oacyWnXi+0/bMI5FGibZNZV4y/o9UoFEr6agjU260/cXHTjIdkX233nN7eb7dtyRg==} + dependencies: + '@cspell/dict-data-science': 2.0.1 + dev: true + + /@cspell/dict-r@2.0.1: + resolution: {integrity: sha512-KCmKaeYMLm2Ip79mlYPc8p+B2uzwBp4KMkzeLd5E6jUlCL93Y5Nvq68wV5fRLDRTf7N1LvofkVFWfDcednFOgA==} + dev: true + + /@cspell/dict-ruby@5.0.2: + resolution: {integrity: sha512-cIh8KTjpldzFzKGgrqUX4bFyav5lC52hXDKo4LbRuMVncs3zg4hcSf4HtURY+f2AfEZzN6ZKzXafQpThq3dl2g==} + dev: true + + /@cspell/dict-rust@4.0.4: + resolution: {integrity: sha512-v9/LcZknt/Xq7m1jdTWiQEtmkVVKdE1etAfGL2sgcWpZYewEa459HeWndNA0gfzQrpWX9sYay18mt7pqClJEdA==} + dev: true + + /@cspell/dict-scala@5.0.2: + resolution: {integrity: sha512-v97ClgidZt99JUm7OjhQugDHmhx4U8fcgunHvD/BsXWjXNj4cTr0m0YjofyZoL44WpICsNuFV9F/sv9OM5HUEw==} + dev: true + + /@cspell/dict-software-terms@3.4.10: + resolution: {integrity: sha512-S5S2sz98v4GWJ9TMo62Vp4L5RM/329e5UQfFn7yJfieTcrfXRH4IweVdz34rZcK9o5coGptgBUIv/Jcrd4cMpg==} + dev: true + + /@cspell/dict-sql@2.1.3: + resolution: {integrity: sha512-SEyTNKJrjqD6PAzZ9WpdSu6P7wgdNtGV2RV8Kpuw1x6bV+YsSptuClYG+JSdRExBTE6LwIe1bTklejUp3ZP8TQ==} + dev: true + + /@cspell/dict-svelte@1.0.2: + resolution: {integrity: sha512-rPJmnn/GsDs0btNvrRBciOhngKV98yZ9SHmg8qI6HLS8hZKvcXc0LMsf9LLuMK1TmS2+WQFAan6qeqg6bBxL2Q==} + dev: true + + /@cspell/dict-swift@2.0.1: + resolution: {integrity: sha512-gxrCMUOndOk7xZFmXNtkCEeroZRnS2VbeaIPiymGRHj5H+qfTAzAKxtv7jJbVA3YYvEzWcVE2oKDP4wcbhIERw==} + dev: true + + /@cspell/dict-typescript@3.1.5: + resolution: {integrity: sha512-EkIwwNV/xqEoBPJml2S16RXj65h1kvly8dfDLgXerrKw6puybZdvAHerAph6/uPTYdtLcsPyJYkPt5ISOJYrtw==} + dev: true - /@babel/traverse@7.23.0: - resolution: { integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== } - engines: { node: '>=6.9.0' } - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + /@cspell/dict-vue@3.0.0: + resolution: {integrity: sha512-niiEMPWPV9IeRBRzZ0TBZmNnkK3olkOPYxC1Ny2AX4TGlYRajcW0WUtoSHmvvjZNfWLSg2L6ruiBeuPSbjnG6A==} + dev: true - /@babel/types@7.23.0: - resolution: { integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== } - engines: { node: '>=6.9.0' } + /@cspell/dynamic-import@6.31.3: + resolution: {integrity: sha512-A6sT00+6UNGFksQ5SxW2ohNl6vUutai8F4jwJMHTjZL/9vivQpU7y5V4PpsfoPZtx3WZcbrzuTvJ+tLfdbWc4A==} + engines: {node: '>=14'} dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - - /@bcoe/v8-coverage@0.2.3: - resolution: { integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== } + import-meta-resolve: 2.2.2 dev: true - /@bitauth/libauth@1.19.1: - resolution: { integrity: sha512-R524tD5VwOt3QRHr7N518nqTVR/HKgfWL4LypekcGuNQN8R4PWScvuRcRzrY39A28kLztMv+TJdiKuMNbkU1ug== } - engines: { node: '>=8.9' } + /@cspell/strong-weak-map@6.31.3: + resolution: {integrity: sha512-znwc9IlgGUPioHGshP/zyM8HsuYg1OY5S7HSiVXARh5H8RqcyBsnyn8abc0PPhqPrfDy9Fh5xHsAEPZ55dl1vQ==} + engines: {node: '>=14.6'} dev: true /@cspotcode/source-map-support@0.8.1: - resolution: { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 dev: true /@did-core/data-model@0.1.1-unstable.15: - resolution: { integrity: sha512-l7gxLxegcXW7389G+j6o+S24lS8uasmJx5txWpW3QadNvOawKwvWn8bV59SdHSK806xNzIZaCLKmXKxebs8yAQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-l7gxLxegcXW7389G+j6o+S24lS8uasmJx5txWpW3QadNvOawKwvWn8bV59SdHSK806xNzIZaCLKmXKxebs8yAQ==} + engines: {node: '>=10'} dependencies: factory.ts: 0.5.2 dev: true /@did-core/did-ld-json@0.1.1-unstable.15: - resolution: { integrity: sha512-p2jKRxSU+eJJqd+ewCklYp/XZ6ysISk8VU2/kANCoB/WwUy/kVgw2rUNScRDXw2utr9Qj36P8EZTYi4aj7vRCQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-p2jKRxSU+eJJqd+ewCklYp/XZ6ysISk8VU2/kANCoB/WwUy/kVgw2rUNScRDXw2utr9Qj36P8EZTYi4aj7vRCQ==} + engines: {node: '>=10'} dependencies: '@transmute/did-context': 0.6.1-unstable.37 jsonld-checker: 0.1.8 @@ -1716,9 +3649,17 @@ packages: - web-streams-polyfill dev: true + /@digitalbazaar/bitstring@3.1.0: + resolution: {integrity: sha512-Cii+Sl++qaexOvv3vchhgZFfSmtHPNIPzGegaq4ffPnflVXFu+V2qrJ17aL2+gfLxrlC/zazZFuAltyKTPq7eg==} + engines: {node: '>=16'} + dependencies: + base64url-universal: 2.0.0 + pako: 2.1.0 + dev: true + /@digitalbazaar/http-client@1.2.0: - resolution: { integrity: sha512-W9KQQ5pUJcaR0I4c2HPJC0a7kRbZApIorZgPnEDwMBgj16iQzutGLrCXYaZOmxqVLVNqqlQ4aUJh+HBQZy4W6Q== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-W9KQQ5pUJcaR0I4c2HPJC0a7kRbZApIorZgPnEDwMBgj16iQzutGLrCXYaZOmxqVLVNqqlQ4aUJh+HBQZy4W6Q==} + engines: {node: '>=10.0.0'} dependencies: esm: 3.2.25 ky: 0.25.1 @@ -1728,21 +3669,71 @@ packages: - web-streams-polyfill dev: true + /@digitalbazaar/http-client@3.4.1: + resolution: {integrity: sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==} + engines: {node: '>=14.0'} + dependencies: + ky: 0.33.3 + ky-universal: 0.11.0(ky@0.33.3) + undici: 5.28.4 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + /@digitalbazaar/security-context@1.0.1: - resolution: { integrity: sha512-0WZa6tPiTZZF8leBtQgYAfXQePFQp2z5ivpCEN/iZguYYZ0TB9qRmWtan5XH6mNFuusHtMcyIzAcReyE6rZPhA== } - dev: false + resolution: {integrity: sha512-0WZa6tPiTZZF8leBtQgYAfXQePFQp2z5ivpCEN/iZguYYZ0TB9qRmWtan5XH6mNFuusHtMcyIzAcReyE6rZPhA==} /@digitalbazaar/vc-status-list-context@3.0.1: - resolution: { integrity: sha512-vQsqQXpmSXKNy/C0xxFUOBzz60dHh6oupQam1xRC8IspVC11hYJiX9SAhmbI0ulHvX1R2JfqZaJHZjmAyMZ/aA== } - dev: false + resolution: {integrity: sha512-vQsqQXpmSXKNy/C0xxFUOBzz60dHh6oupQam1xRC8IspVC11hYJiX9SAhmbI0ulHvX1R2JfqZaJHZjmAyMZ/aA==} + + /@digitalbazaar/vc-status-list@7.1.0: + resolution: {integrity: sha512-p5uxKJlX13N8TcTuv9qFDeej+6bndU+Rh1Cez2MT+bXQE6Jpn5t336FBSHmcECB4yUfZQpkmV/LOcYU4lW8Ojw==} + engines: {node: '>=16'} + dependencies: + '@digitalbazaar/bitstring': 3.1.0 + '@digitalbazaar/vc': 5.0.0 + '@digitalbazaar/vc-status-list-context': 3.0.1 + credentials-context: 2.0.0 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + + /@digitalbazaar/vc@5.0.0: + resolution: {integrity: sha512-XmLM7Ag5W+XidGnFuxFIyUFSMnHnWEMJlHei602GG94+WzFJ6Ik8txzPQL8T18egSoiTsd1VekymbIlSimhuaQ==} + engines: {node: '>=14'} + dependencies: + credentials-context: 2.0.0 + jsonld: 8.3.2 + jsonld-signatures: 11.2.1 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true /@digitalcredentials/base58-universal@1.0.1: - resolution: { integrity: sha512-1xKdJnfITMvrF/sCgwBx2C4p7qcNAARyIvrAOZGqIHmBaT/hAenpC8bf44qVY+UIMuCYP23kqpIfJQebQDThDQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-1xKdJnfITMvrF/sCgwBx2C4p7qcNAARyIvrAOZGqIHmBaT/hAenpC8bf44qVY+UIMuCYP23kqpIfJQebQDThDQ==} + engines: {node: '>=12'} + + /@digitalcredentials/base64url-universal@2.0.6: + resolution: {integrity: sha512-QJyK6xS8BYNnkKLhEAgQc6Tb9DMe+GkHnBAWJKITCxVRXJAFLhJnr+FsJnCThS3x2Y0UiiDAXoWjwMqtUrp4Kg==} + engines: {node: '>=14'} + dependencies: + base64url: 3.0.1 + dev: true + + /@digitalcredentials/bitstring@2.0.1: + resolution: {integrity: sha512-9priXvsEJGI4LYHPwLqf5jv9HtQGlG0MgeuY8Q4NHN+xWz5rYMylh1TYTVThKa3XI6xF2pR2oEfKZD21eWXveQ==} + engines: {node: '>=14'} + dependencies: + '@digitalcredentials/base64url-universal': 2.0.6 + pako: 2.1.0 + dev: true /@digitalcredentials/bnid@2.1.2(react-native@0.71.13): - resolution: { integrity: sha512-pSQSZ7OH9dCVV/0CNoS5+7UHGekUjyJBOt4uTOLpCJWMINjD8RDVEpJLPvcV/kT9dq+S4DPA4ZyNDb/NmXCHGA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-pSQSZ7OH9dCVV/0CNoS5+7UHGekUjyJBOt4uTOLpCJWMINjD8RDVEpJLPvcV/kT9dq+S4DPA4ZyNDb/NmXCHGA==} + engines: {node: '>=14'} hasBin: true dependencies: '@digitalcredentials/base58-universal': 1.0.1 @@ -1753,31 +3744,31 @@ packages: dev: false /@digitalcredentials/crypto-ld@7.0.6: - resolution: { integrity: sha512-wxgjiU08rIMUaPhaOOVUjcdWZoL1FVfzGuX9ADHiyx0O34lJ4wdXnGk5QMYgwpl7B4gy1vDDp5VVHpO8l+aVFQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-wxgjiU08rIMUaPhaOOVUjcdWZoL1FVfzGuX9ADHiyx0O34lJ4wdXnGk5QMYgwpl7B4gy1vDDp5VVHpO8l+aVFQ==} + engines: {node: '>=16'} dev: false /@digitalcredentials/dcc-context@1.0.0: - resolution: { integrity: sha512-iun3HTqOqcAoG0lz5GWx/fJYxpbKjzqq866dBo0osxs+pj/CwZDNHKXVC6sdd662tXg9EF0r4YdZ/AW6DOnS6A== } + resolution: {integrity: sha512-iun3HTqOqcAoG0lz5GWx/fJYxpbKjzqq866dBo0osxs+pj/CwZDNHKXVC6sdd662tXg9EF0r4YdZ/AW6DOnS6A==} dev: false /@digitalcredentials/did-io@1.0.2: - resolution: { integrity: sha512-z6lLRe4drHYwtfxbySQJZZl2YbCPvG5UDkh/H3kAK2NSZY9GaIm9iz9A6E/J5Lu6rct/BOj1XQhtEJnzRdB8wQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-z6lLRe4drHYwtfxbySQJZZl2YbCPvG5UDkh/H3kAK2NSZY9GaIm9iz9A6E/J5Lu6rct/BOj1XQhtEJnzRdB8wQ==} + engines: {node: '>=12'} dependencies: '@digitalcredentials/lru-memoize': 2.1.4 /@digitalcredentials/did-method-key@2.0.3: - resolution: { integrity: sha512-b31TOIKJm+qcay7m9kxV6TDNyJwdb/XZIS/OjHarONlXGB3k0M38NXmbRDI95FTmy3GhYCFSJ3VEikqNKTXU2A== } - engines: { node: '>=12' } + resolution: {integrity: sha512-b31TOIKJm+qcay7m9kxV6TDNyJwdb/XZIS/OjHarONlXGB3k0M38NXmbRDI95FTmy3GhYCFSJ3VEikqNKTXU2A==} + engines: {node: '>=12'} dependencies: '@digitalcredentials/did-io': 1.0.2 '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 '@digitalcredentials/x25519-key-agreement-key-2020': 2.0.2 /@digitalcredentials/ed25519-signature-2020@3.0.2(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-R8IrR21Dh+75CYriQov3nVHKaOVusbxfk9gyi6eCAwLHKn6fllUt+2LQfuUrL7Ts/sGIJqQcev7YvkX9GvyYRA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-R8IrR21Dh+75CYriQov3nVHKaOVusbxfk9gyi6eCAwLHKn6fllUt+2LQfuUrL7Ts/sGIJqQcev7YvkX9GvyYRA==} + engines: {node: '>=14'} dependencies: '@digitalcredentials/base58-universal': 1.0.1 '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 @@ -1789,11 +3780,10 @@ packages: - expo - react-native - web-streams-polyfill - dev: false /@digitalcredentials/ed25519-verification-key-2020@3.2.2: - resolution: { integrity: sha512-ZfxNFZlA379MZpf+gV2tUYyiZ15eGVgjtCQLWlyu3frWxsumUgv++o0OJlMnrDsWGwzFMRrsXcosd5+752rLOA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-ZfxNFZlA379MZpf+gV2tUYyiZ15eGVgjtCQLWlyu3frWxsumUgv++o0OJlMnrDsWGwzFMRrsXcosd5+752rLOA==} + engines: {node: '>=14'} dependencies: '@digitalcredentials/base58-universal': 1.0.1 '@stablelib/ed25519': 1.0.3 @@ -1801,8 +3791,8 @@ packages: crypto-ld: 6.0.0 /@digitalcredentials/ed25519-verification-key-2020@4.0.0: - resolution: { integrity: sha512-GrfITgp1guFbExZckj2q6LOxxm08PFSScr0lBYtDRezJa6CTpA9XQ8yXSSXE3LvpEi5/2uOMFxxIfKAtL1J2ww== } - engines: { node: '>=18' } + resolution: {integrity: sha512-GrfITgp1guFbExZckj2q6LOxxm08PFSScr0lBYtDRezJa6CTpA9XQ8yXSSXE3LvpEi5/2uOMFxxIfKAtL1J2ww==} + engines: {node: '>=18'} dependencies: '@digitalcredentials/keypair': 1.0.5 '@noble/ed25519': 1.7.3 @@ -1810,19 +3800,18 @@ packages: dev: false /@digitalcredentials/http-client@1.2.2: - resolution: { integrity: sha512-YOwaE+vUDSwiDhZT0BbXSWVg+bvp1HA1eg/gEc8OCwCOj9Bn9FRQdu8P9Y/fnYqyFCioDwwTRzGxgJLl50baEg== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-YOwaE+vUDSwiDhZT0BbXSWVg+bvp1HA1eg/gEc8OCwCOj9Bn9FRQdu8P9Y/fnYqyFCioDwwTRzGxgJLl50baEg==} + engines: {node: '>=12.0.0'} dependencies: ky: 0.25.1 ky-universal: 0.8.2(ky@0.25.1) transitivePeerDependencies: - encoding - web-streams-polyfill - dev: false /@digitalcredentials/jsonld-signatures@9.3.2(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-auubZrr3D7et5O6zCdqoXsLhI8/F26HqneE94gIoZYVuxNHBNaFoDQ1Z71RfddRqwJonHkfkWgeZSzqjv6aUmg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-auubZrr3D7et5O6zCdqoXsLhI8/F26HqneE94gIoZYVuxNHBNaFoDQ1Z71RfddRqwJonHkfkWgeZSzqjv6aUmg==} + engines: {node: '>=12'} dependencies: '@digitalbazaar/security-context': 1.0.1 '@digitalcredentials/jsonld': 6.0.0(expo@48.0.20)(react-native@0.71.13) @@ -1834,11 +3823,10 @@ packages: - expo - react-native - web-streams-polyfill - dev: false /@digitalcredentials/jsonld@5.2.2(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-hz7YR3kv6+8UUdgMyTGl1o8NjVKKwnMry/Rh/rWeAvwL+NqgoUHorWzI3rM+PW+MPFyDC0ieXStClt9n9D9SGA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-hz7YR3kv6+8UUdgMyTGl1o8NjVKKwnMry/Rh/rWeAvwL+NqgoUHorWzI3rM+PW+MPFyDC0ieXStClt9n9D9SGA==} + engines: {node: '>=12'} dependencies: '@digitalcredentials/http-client': 1.2.2 '@digitalcredentials/rdf-canonize': 1.0.0(expo@48.0.20)(react-native@0.71.13) @@ -1849,11 +3837,10 @@ packages: - expo - react-native - web-streams-polyfill - dev: false /@digitalcredentials/jsonld@6.0.0(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-5tTakj0/GsqAJi8beQFVMQ97wUJZnuxViW9xRuAATL6eOBIefGBwHkVryAgEq2I4J/xKgb/nEyw1ZXX0G8wQJQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-5tTakj0/GsqAJi8beQFVMQ97wUJZnuxViW9xRuAATL6eOBIefGBwHkVryAgEq2I4J/xKgb/nEyw1ZXX0G8wQJQ==} + engines: {node: '>=12'} dependencies: '@digitalcredentials/http-client': 1.2.2 '@digitalcredentials/rdf-canonize': 1.0.0(expo@48.0.20)(react-native@0.71.13) @@ -1864,150 +3851,499 @@ packages: - expo - react-native - web-streams-polyfill - dev: false /@digitalcredentials/keypair@1.0.5: - resolution: { integrity: sha512-g0QvhJMTSFCoUkEvSeggwVTJa2jFkQXjf/mpTn9sePkz+5OouMEDfXUWL61juTaxK5JWPEFc0PKlolXzHaHHHQ== } - engines: { node: '>=16.0' } + resolution: {integrity: sha512-g0QvhJMTSFCoUkEvSeggwVTJa2jFkQXjf/mpTn9sePkz+5OouMEDfXUWL61juTaxK5JWPEFc0PKlolXzHaHHHQ==} + engines: {node: '>=16.0'} dev: false /@digitalcredentials/lru-memoize@2.1.4: - resolution: { integrity: sha512-dvgeYYHW8lAWJrGyIY1qhuTahqvVJYXxuSkJ2A1MgenFLb/nWnIcSov0K/5nDnPYA5TilItmMpAxt6iuNtaKQg== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-dvgeYYHW8lAWJrGyIY1qhuTahqvVJYXxuSkJ2A1MgenFLb/nWnIcSov0K/5nDnPYA5TilItmMpAxt6iuNtaKQg==} + engines: {node: '>=10.0.0'} dependencies: lru-cache: 6.0.0 /@digitalcredentials/open-badges-context@0.1.2: - resolution: { integrity: sha512-uaaL1htmUsJESfb3v7bAXKA4xu/xc7bzmK2R7BlYJEKY1QZpYOH9PZBrGqUEWfcMHfu1V2ILErIU4vMDz20lHQ== } + resolution: {integrity: sha512-uaaL1htmUsJESfb3v7bAXKA4xu/xc7bzmK2R7BlYJEKY1QZpYOH9PZBrGqUEWfcMHfu1V2ILErIU4vMDz20lHQ==} dev: false + /@digitalcredentials/open-badges-context@2.1.0: + resolution: {integrity: sha512-VK7X5u6OoBFxkyIFplNqUPVbo+8vFSAEoam8tSozpj05KPfcGw41Tp5p9fqMnY38oPfwtZR2yDNSctj/slrE0A==} + dev: true + /@digitalcredentials/rdf-canonize@1.0.0(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-z8St0Ex2doecsExCFK1uI4gJC+a5EqYYu1xpRH1pKmqSS9l/nxfuVxexNFyaeEum4dUdg1EetIC2rTwLIFhPRA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-z8St0Ex2doecsExCFK1uI4gJC+a5EqYYu1xpRH1pKmqSS9l/nxfuVxexNFyaeEum4dUdg1EetIC2rTwLIFhPRA==} + engines: {node: '>=12'} dependencies: fast-text-encoding: 1.0.6 isomorphic-webcrypto: 2.3.8(expo@48.0.20)(react-native@0.71.13) transitivePeerDependencies: - expo - react-native + + /@digitalcredentials/security-document-loader@1.0.0(react-native@0.71.13): + resolution: {integrity: sha512-J7vbTgI5k1kdvaAgzPan30laJUTMcRdKBQ11b7a1viSWlHXOwFGIRFeVOcV8gZ+iOIaDHRo/uRHlyyLMapaS9w==} + engines: {node: '>=16.0'} + dependencies: + '@digitalbazaar/vc-status-list-context': 3.0.1 + '@digitalcredentials/crypto-ld': 7.0.6 + '@digitalcredentials/dcc-context': 1.0.0 + '@digitalcredentials/did-io': 1.0.2 + '@digitalcredentials/did-method-key': 2.0.3 + '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 + '@digitalcredentials/open-badges-context': 0.1.2 + '@digitalcredentials/x25519-key-agreement-key-2020': 3.0.0 + '@interop/did-web-resolver': 3.0.1(react-native@0.71.13) + credentials-context: 2.0.0 + crypto-ld: 7.0.0 + did-context: 3.1.1 + ed25519-signature-2020-context: 1.1.0 + html-entities: 2.4.0 + jsonld-document-loader: 1.2.1 + x25519-key-agreement-2020-context: 1.0.0 + transitivePeerDependencies: + - encoding + - react-native + - web-streams-polyfill + dev: false + + /@digitalcredentials/vc-status-list@5.0.2(expo@48.0.20)(react-native@0.71.13): + resolution: {integrity: sha512-PI0N7SM0tXpaNLelbCNsMAi34AjOeuhUzMSYTkHdeqRPX7oT2F3ukyOssgr4koEqDxw9shHtxHu3fSJzrzcPMQ==} + engines: {node: '>=14'} + dependencies: + '@digitalbazaar/vc-status-list-context': 3.0.1 + '@digitalcredentials/bitstring': 2.0.1 + '@digitalcredentials/vc': 4.2.0(expo@48.0.20)(react-native@0.71.13) + credentials-context: 2.0.0 + transitivePeerDependencies: + - encoding + - expo + - react-native + - web-streams-polyfill + dev: true + + /@digitalcredentials/vc@4.2.0(expo@48.0.20)(react-native@0.71.13): + resolution: {integrity: sha512-8Rxpn77JghJN7noBQdcMuzm/tB8vhDwPoFepr3oGd5w+CyJxOk2RnBlgIGlAAGA+mALFWECPv1rANfXno+hdjA==} + engines: {node: '>=12'} + dependencies: + '@digitalcredentials/jsonld': 5.2.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/jsonld-signatures': 9.3.2(expo@48.0.20)(react-native@0.71.13) + credentials-context: 2.0.0 + transitivePeerDependencies: + - encoding + - expo + - react-native + - web-streams-polyfill + dev: true + + /@digitalcredentials/vc@5.0.0(expo@48.0.20)(react-native@0.71.13): + resolution: {integrity: sha512-87ARRxlAdIuUPArbMYJ8vUY7QqkIvJGFrBwfTH1PcB8Wz1E/M4q3oc/WLrDyJNg4o/irVVB5gkA9iIntTYSpoA==} + engines: {node: '>=12'} + dependencies: + '@digitalcredentials/jsonld': 5.2.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/jsonld-signatures': 9.3.2(expo@48.0.20)(react-native@0.71.13) + credentials-context: 2.0.0 + transitivePeerDependencies: + - encoding + - expo + - react-native + - web-streams-polyfill + dev: false + + /@digitalcredentials/vc@6.0.1(expo@48.0.20)(react-native@0.71.13): + resolution: {integrity: sha512-TZgLoi00Jc9uv3b6jStH+G8+bCqpHIqFw9DYODz+fVjNh197ksvcYqSndUDHa2oi0HCcK+soI8j4ba3Sa4Pl4w==} + engines: {node: '>=12'} + dependencies: + '@digitalbazaar/vc-status-list': 7.1.0 + '@digitalcredentials/ed25519-signature-2020': 3.0.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/jsonld': 6.0.0(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/jsonld-signatures': 9.3.2(expo@48.0.20)(react-native@0.71.13) + '@digitalcredentials/open-badges-context': 2.1.0 + '@digitalcredentials/vc-status-list': 5.0.2(expo@48.0.20)(react-native@0.71.13) + credentials-context: 2.0.0 + fix-esm: 1.0.1 + transitivePeerDependencies: + - encoding + - expo + - react-native + - supports-color + - web-streams-polyfill + dev: true + + /@digitalcredentials/x25519-key-agreement-key-2020@2.0.2: + resolution: {integrity: sha512-7Ay5AkGfIEWBRJiHl6PhrpFrjAqCZ/+G4rV6sqTUGK8fBnkxqlJ/XiD7NouUF6uTalVm7mJWJXHuCN5FAuXGsg==} + engines: {node: '>=12'} + dependencies: + '@digitalcredentials/base58-universal': 1.0.1 + crypto-ld: 6.0.0 + ed2curve: 0.3.0 + tweetnacl: 1.0.3 + + /@digitalcredentials/x25519-key-agreement-key-2020@3.0.0: + resolution: {integrity: sha512-mCh6eRh6opBZiEtAWZ3RvCGs6JP9QpN2/xPxncQIKBK9WBUxONgL1CEsTUTRcisGvWQrUcqVXRHQ0Tl6b8weSQ==} + engines: {node: '>=12'} + dependencies: + '@digitalcredentials/base58-universal': 1.0.1 + '@noble/ed25519': 1.7.3 + crypto-ld: 6.0.0 + tweetnacl: 1.0.3 dev: false - /@digitalcredentials/security-document-loader@1.0.0(react-native@0.71.13): - resolution: { integrity: sha512-J7vbTgI5k1kdvaAgzPan30laJUTMcRdKBQ11b7a1viSWlHXOwFGIRFeVOcV8gZ+iOIaDHRo/uRHlyyLMapaS9w== } - engines: { node: '>=16.0' } + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.9.0: + resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.22.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: true + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: true + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: true + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: true + + /@ethersproject/basex@5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: true + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: true + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: true + + /@ethersproject/contracts@5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: true + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/hdnode@5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: true + + /@ethersproject/json-wallets@5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: true + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: true + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: true + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/pbkdf2@5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: true + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: true + + /@ethersproject/providers@5.7.2: + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} dependencies: - '@digitalbazaar/vc-status-list-context': 3.0.1 - '@digitalcredentials/crypto-ld': 7.0.6 - '@digitalcredentials/dcc-context': 1.0.0 - '@digitalcredentials/did-io': 1.0.2 - '@digitalcredentials/did-method-key': 2.0.3 - '@digitalcredentials/ed25519-verification-key-2020': 3.2.2 - '@digitalcredentials/open-badges-context': 0.1.2 - '@digitalcredentials/x25519-key-agreement-key-2020': 3.0.0 - '@interop/did-web-resolver': 3.0.1(react-native@0.71.13) - credentials-context: 2.0.0 - crypto-ld: 7.0.0 - did-context: 3.1.1 - ed25519-signature-2020-context: 1.1.0 - html-entities: 2.4.0 - jsonld-document-loader: 1.2.1 - x25519-key-agreement-2020-context: 1.0.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 transitivePeerDependencies: - - encoding - - react-native - - web-streams-polyfill - dev: false + - bufferutil + - utf-8-validate + dev: true - /@digitalcredentials/vc@5.0.0(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-87ARRxlAdIuUPArbMYJ8vUY7QqkIvJGFrBwfTH1PcB8Wz1E/M4q3oc/WLrDyJNg4o/irVVB5gkA9iIntTYSpoA== } - engines: { node: '>=12' } + /@ethersproject/random@5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} dependencies: - '@digitalcredentials/jsonld': 5.2.2(expo@48.0.20)(react-native@0.71.13) - '@digitalcredentials/jsonld-signatures': 9.3.2(expo@48.0.20)(react-native@0.71.13) - credentials-context: 2.0.0 - transitivePeerDependencies: - - encoding - - expo - - react-native - - web-streams-polyfill - dev: false + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true - /@digitalcredentials/x25519-key-agreement-key-2020@2.0.2: - resolution: { integrity: sha512-7Ay5AkGfIEWBRJiHl6PhrpFrjAqCZ/+G4rV6sqTUGK8fBnkxqlJ/XiD7NouUF6uTalVm7mJWJXHuCN5FAuXGsg== } - engines: { node: '>=12' } + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} dependencies: - '@digitalcredentials/base58-universal': 1.0.1 - crypto-ld: 6.0.0 - ed2curve: 0.3.0 - tweetnacl: 1.0.3 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true - /@digitalcredentials/x25519-key-agreement-key-2020@3.0.0: - resolution: { integrity: sha512-mCh6eRh6opBZiEtAWZ3RvCGs6JP9QpN2/xPxncQIKBK9WBUxONgL1CEsTUTRcisGvWQrUcqVXRHQ0Tl6b8weSQ== } - engines: { node: '>=12' } + /@ethersproject/sha2@5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} dependencies: - '@digitalcredentials/base58-universal': 1.0.1 - '@noble/ed25519': 1.7.3 - crypto-ld: 6.0.0 - tweetnacl: 1.0.3 - dev: false + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 dev: true - /@eslint-community/regexpp@4.9.0: - resolution: { integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ== } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + /@ethersproject/solidity@5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 dev: true - /@eslint/eslintrc@2.1.4: - resolution: { integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.22.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 dev: true - /@eslint/js@8.57.0: - resolution: { integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 dev: true - /@ethersproject/bytes@5.7.0: - resolution: { integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== } + /@ethersproject/units@5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 '@ethersproject/logger': 5.7.0 dev: true - /@ethersproject/logger@5.7.0: - resolution: { integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== } + /@ethersproject/wallet@5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 dev: true - /@ethersproject/random@5.7.0: - resolution: { integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== } + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/wordlists@5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} dependencies: '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 dev: true /@expo/bunyan@4.0.0: - resolution: { integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA== } - engines: { '0': node >=0.10.0 } + resolution: {integrity: sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==} + engines: {'0': node >=0.10.0} dependencies: uuid: 8.3.2 optionalDependencies: @@ -2015,7 +4351,7 @@ packages: safe-json-stringify: 1.2.0 /@expo/cli@0.7.3(expo-modules-autolinking@1.2.0): - resolution: { integrity: sha512-uMGHbAhApqXR2sd1KPhgvpbOhBBnspad8msEqHleT2PHXwKIwTUDzBGO9+jdOAWwCx2MJfw3+asYjzoD3DN9Bg== } + resolution: {integrity: sha512-uMGHbAhApqXR2sd1KPhgvpbOhBBnspad8msEqHleT2PHXwKIwTUDzBGO9+jdOAWwCx2MJfw3+asYjzoD3DN9Bg==} hasBin: true dependencies: '@babel/runtime': 7.23.1 @@ -2088,13 +4424,13 @@ packages: - utf-8-validate /@expo/code-signing-certificates@0.0.5: - resolution: { integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw== } + resolution: {integrity: sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==} dependencies: node-forge: 1.3.1 nullthrows: 1.1.1 /@expo/config-plugins@6.0.2: - resolution: { integrity: sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ== } + resolution: {integrity: sha512-Cn01fXMHwjU042EgO9oO3Mna0o/UCrW91MQLMbJa4pXM41CYGjNgVy1EVXiuRRx/upegHhvltBw5D+JaUm8aZQ==} dependencies: '@expo/config-types': 48.0.0 '@expo/json-file': 8.2.37 @@ -2115,10 +4451,10 @@ packages: - supports-color /@expo/config-types@48.0.0: - resolution: { integrity: sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A== } + resolution: {integrity: sha512-DwyV4jTy/+cLzXGAo1xftS6mVlSiLIWZjl9DjTCLPFVgNYQxnh7htPilRv4rBhiNs7KaznWqKU70+4zQoKVT9A==} /@expo/config@8.0.5: - resolution: { integrity: sha512-3CnLmtAQUWqLZwTRliS23QoFwdyhg4AWtp6gZ0qfcXthR84RvlZKcCDQQIyPiRUgu8dZa+gQDcdRJtgE+GM5XQ== } + resolution: {integrity: sha512-3CnLmtAQUWqLZwTRliS23QoFwdyhg4AWtp6gZ0qfcXthR84RvlZKcCDQQIyPiRUgu8dZa+gQDcdRJtgE+GM5XQ==} dependencies: '@babel/code-frame': 7.10.4 '@expo/config-plugins': 6.0.2 @@ -2135,7 +4471,7 @@ packages: - supports-color /@expo/dev-server@0.3.0: - resolution: { integrity: sha512-2A6/8uZADSKAtzyR6YqhCBUFxb5DFmjxmFn0EHMqnPnsh13ZSiKEjrZPrRkM6Li2EHLYqHK2rmweJ7O/7q9pPQ== } + resolution: {integrity: sha512-2A6/8uZADSKAtzyR6YqhCBUFxb5DFmjxmFn0EHMqnPnsh13ZSiKEjrZPrRkM6Li2EHLYqHK2rmweJ7O/7q9pPQ==} dependencies: '@expo/bunyan': 4.0.0 '@expo/metro-config': 0.7.1 @@ -2158,7 +4494,7 @@ packages: - supports-color /@expo/devcert@1.1.0: - resolution: { integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA== } + resolution: {integrity: sha512-ghUVhNJQOCTdQckSGTHctNp/0jzvVoMMkVh+6SHn+TZj8sU15U/npXIDt8NtQp0HedlPaCgkVdMu8Sacne0aEA==} dependencies: application-config-path: 0.1.1 command-exists: 1.2.9 @@ -2177,7 +4513,7 @@ packages: - supports-color /@expo/image-utils@0.3.22: - resolution: { integrity: sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ== } + resolution: {integrity: sha512-uzq+RERAtkWypOFOLssFnXXqEqKjNj9eXN7e97d/EXUAojNcLDoXc0sL+F5B1I4qtlsnhX01kcpoIBBZD8wZNQ==} dependencies: '@expo/spawn-async': 1.5.0 chalk: 4.1.2 @@ -2194,14 +4530,14 @@ packages: - encoding /@expo/json-file@8.2.37: - resolution: { integrity: sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q== } + resolution: {integrity: sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==} dependencies: '@babel/code-frame': 7.10.4 json5: 2.2.3 write-file-atomic: 2.4.3 /@expo/metro-config@0.7.1: - resolution: { integrity: sha512-vGWU62Zp5pRGw5IEHDNdqvsy62/hu/Na7bswePYVjoaItOjJY7+qilFeF0AAK+3V8qAM8fpltH3ByylKfWaA7A== } + resolution: {integrity: sha512-vGWU62Zp5pRGw5IEHDNdqvsy62/hu/Na7bswePYVjoaItOjJY7+qilFeF0AAK+3V8qAM8fpltH3ByylKfWaA7A==} dependencies: '@expo/config': 8.0.5 chalk: 4.1.2 @@ -2214,14 +4550,14 @@ packages: - supports-color /@expo/osascript@2.0.33: - resolution: { integrity: sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-FQinlwHrTlJbntp8a7NAlCKedVXe06Va/0DSLXRO8lZVtgbEMrYYSUZWQNcOlNtc58c2elNph6z9dMOYwSo3JQ==} + engines: {node: '>=12'} dependencies: '@expo/spawn-async': 1.5.0 exec-async: 2.2.0 /@expo/package-manager@1.0.3: - resolution: { integrity: sha512-NpdwcRar22gJDDug3GEb62Ka6vy+Yi//3zTdYhdkzwekY6qzg7+vZCeEKayFJjvbCjjOPNSrauNR4zD+WJmRIQ== } + resolution: {integrity: sha512-NpdwcRar22gJDDug3GEb62Ka6vy+Yi//3zTdYhdkzwekY6qzg7+vZCeEKayFJjvbCjjOPNSrauNR4zD+WJmRIQ==} dependencies: '@expo/json-file': 8.2.37 '@expo/spawn-async': 1.5.0 @@ -2236,14 +4572,14 @@ packages: sudo-prompt: 9.1.1 /@expo/plist@0.0.20: - resolution: { integrity: sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA== } + resolution: {integrity: sha512-UXQ4LXCfTZ580LDHGJ5q62jSTwJFFJ1GqBu8duQMThiHKWbMJ+gajJh6rsB6EJ3aLUr9wcauxneL5LVRFxwBEA==} dependencies: '@xmldom/xmldom': 0.7.13 base64-js: 1.5.1 xmlbuilder: 14.0.0 /@expo/prebuild-config@6.0.1(expo-modules-autolinking@1.2.0): - resolution: { integrity: sha512-WK3FDht1tdXZGCvtG5s7HSwzhsc7Tyu2DdqV9jVUsLtGD42oqUepk13mEWlU9LOTBgLsoEueKjoSK4EXOXFctw== } + resolution: {integrity: sha512-WK3FDht1tdXZGCvtG5s7HSwzhsc7Tyu2DdqV9jVUsLtGD42oqUepk13mEWlU9LOTBgLsoEueKjoSK4EXOXFctw==} peerDependencies: expo-modules-autolinking: '>=0.8.1' dependencies: @@ -2263,8 +4599,8 @@ packages: - supports-color /@expo/rudder-sdk-node@1.1.1: - resolution: { integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==} + engines: {node: '>=12'} dependencies: '@expo/bunyan': 4.0.0 '@segment/loosely-validate-event': 2.0.0 @@ -2277,19 +4613,19 @@ packages: - encoding /@expo/sdk-runtime-versions@1.0.0: - resolution: { integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ== } + resolution: {integrity: sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==} /@expo/spawn-async@1.5.0: - resolution: { integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew== } - engines: { node: '>=4' } + resolution: {integrity: sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==} + engines: {node: '>=4'} dependencies: cross-spawn: 6.0.5 /@expo/vector-icons@13.0.0: - resolution: { integrity: sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA== } + resolution: {integrity: sha512-TI+l71+5aSKnShYclFa14Kum+hQMZ86b95SH6tQUG3qZEmLTarvWpKwqtTwQKqvlJSJrpFiSFu3eCuZokY6zWA==} /@expo/xcpretty@4.2.2: - resolution: { integrity: sha512-Lke/geldJqUV0Dfxg5/QIOugOzdqZ/rQ9yHKSgGbjZtG1uiSqWyFwWvXmrdd3/sIdX33eykGvIcf+OrvvcXVUw== } + resolution: {integrity: sha512-Lke/geldJqUV0Dfxg5/QIOugOzdqZ/rQ9yHKSgGbjZtG1uiSqWyFwWvXmrdd3/sIdX33eykGvIcf+OrvvcXVUw==} hasBin: true dependencies: '@babel/code-frame': 7.10.4 @@ -2297,31 +4633,36 @@ packages: find-up: 5.0.0 js-yaml: 4.1.0 + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true + /@fastify/deepmerge@1.3.0: - resolution: { integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A== } + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} dev: false /@gar/promisify@1.1.3: - resolution: { integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== } + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} /@graphql-typed-document-node/core@3.2.0(graphql@15.8.0): - resolution: { integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== } + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: graphql: 15.8.0 /@hapi/hoek@9.3.0: - resolution: { integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== } + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} /@hapi/topo@5.1.0: - resolution: { integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== } + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} dependencies: '@hapi/hoek': 9.3.0 /@humanwhocodes/config-array@0.11.14: - resolution: { integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== } - engines: { node: '>=10.10.0' } + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -2332,23 +4673,23 @@ packages: dev: true /@humanwhocodes/module-importer@1.0.1: - resolution: { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} dev: true /@humanwhocodes/object-schema@2.0.3: - resolution: { integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== } + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead dev: true /@hutson/parse-repository-url@3.0.2: - resolution: { integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} dev: true /@interop/did-web-resolver@3.0.1(react-native@0.71.13): - resolution: { integrity: sha512-OuwYvbFaRf3qFoa5aL6rx123bXxndLawmbY770k6zIYGPjEdbq2nEkrL7Vl0WovdSeU1lcwL04CgBqOpjoZPGQ== } - engines: { node: '>=12.0' } + resolution: {integrity: sha512-OuwYvbFaRf3qFoa5aL6rx123bXxndLawmbY770k6zIYGPjEdbq2nEkrL7Vl0WovdSeU1lcwL04CgBqOpjoZPGQ==} + engines: {node: '>=12.0'} dependencies: '@digitalcredentials/bnid': 2.1.2(react-native@0.71.13) '@digitalcredentials/did-io': 1.0.2 @@ -2363,9 +4704,19 @@ packages: - web-streams-polyfill dev: false + /@isaacs/cached@1.0.1: + resolution: {integrity: sha512-7kGcJ9Hc1f4qpTApWz3swxbF9Qv1NF/GxuPtXeTptbsgvJIoufSd0h854Nq/2bw80F5C1onsFgEI05l+q0e4vw==} + dependencies: + '@isaacs/catcher': 1.0.4 + dev: true + + /@isaacs/catcher@1.0.4: + resolution: {integrity: sha512-g2klMwbnguClWNnCeQ1zYaDJsvPbIbnjdJPDE0z09MqoejJDZSLK5vIKiClq2Bkg5ubuI8vaN6wfIUi5GYzMVA==} + dev: true + /@isaacs/cliui@8.0.2: - resolution: { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 string-width-cjs: /string-width@4.2.3 @@ -2376,12 +4727,12 @@ packages: dev: true /@isaacs/string-locale-compare@1.1.0: - resolution: { integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== } + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} dev: true /@istanbuljs/load-nyc-config@1.1.0: - resolution: { integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -2391,13 +4742,13 @@ packages: dev: true /@istanbuljs/schema@0.1.3: - resolution: { integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} dev: true /@jest/console@29.7.0: - resolution: { integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 18.19.39 @@ -2408,8 +4759,8 @@ packages: dev: true /@jest/core@29.7.0(ts-node@10.9.2): - resolution: { integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2451,14 +4802,14 @@ packages: dev: true /@jest/create-cache-key-function@29.7.0: - resolution: { integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 /@jest/environment@29.7.0: - resolution: { integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 @@ -2466,15 +4817,15 @@ packages: jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: - resolution: { integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 dev: true /@jest/expect@29.7.0: - resolution: { integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 @@ -2483,8 +4834,8 @@ packages: dev: true /@jest/fake-timers@29.7.0: - resolution: { integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -2494,8 +4845,8 @@ packages: jest-util: 29.7.0 /@jest/globals@29.7.0: - resolution: { integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -2506,8 +4857,8 @@ packages: dev: true /@jest/reporters@29.7.0: - resolution: { integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2543,14 +4894,14 @@ packages: dev: true /@jest/schemas@29.6.3: - resolution: { integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 /@jest/source-map@29.6.3: - resolution: { integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jridgewell/trace-mapping': 0.3.19 callsites: 3.1.0 @@ -2558,8 +4909,8 @@ packages: dev: true /@jest/test-result@29.7.0: - resolution: { integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 @@ -2568,8 +4919,8 @@ packages: dev: true /@jest/test-sequencer@29.7.0: - resolution: { integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 @@ -2578,10 +4929,10 @@ packages: dev: true /@jest/transform@29.7.0: - resolution: { integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -2601,8 +4952,8 @@ packages: dev: true /@jest/types@26.6.2: - resolution: { integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== } - engines: { node: '>= 10.14.2' } + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.2 @@ -2611,8 +4962,8 @@ packages: chalk: 4.1.2 /@jest/types@27.5.1: - resolution: { integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.2 @@ -2621,8 +4972,8 @@ packages: chalk: 4.1.2 /@jest/types@29.6.3: - resolution: { integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 @@ -2632,46 +4983,64 @@ packages: chalk: 4.1.2 /@jridgewell/gen-mapping@0.3.3: - resolution: { integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + /@jridgewell/resolve-uri@3.1.1: - resolution: { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} /@jridgewell/set-array@1.1.2: - resolution: { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} /@jridgewell/source-map@0.3.5: - resolution: { integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== } + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/sourcemap-codec@1.4.15: - resolution: { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} /@jridgewell/trace-mapping@0.3.19: - resolution: { integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== } + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 /@jridgewell/trace-mapping@0.3.9: - resolution: { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 dev: true /@lerna/create@8.1.6(typescript@5.5.3): - resolution: { integrity: sha512-z7CjDSWFKS6cqydxP2XDrnmp1MYavSk2sU70ku1uo/38SZvFeUlEAkV6evxc2QJOqWQFsGKOO26zX2DBnQ45YQ== } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-z7CjDSWFKS6cqydxP2XDrnmp1MYavSk2sU70ku1uo/38SZvFeUlEAkV6evxc2QJOqWQFsGKOO26zX2DBnQ45YQ==} + engines: {node: '>=18.0.0'} dependencies: '@npmcli/arborist': 7.5.3 '@npmcli/package-json': 5.2.0 @@ -2755,7 +5124,7 @@ packages: dev: true /@mapbox/node-pre-gyp@1.0.11: - resolution: { integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ== } + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true requiresBuild: true dependencies: @@ -2773,8 +5142,8 @@ packages: - supports-color /@mattrglobal/bbs-signatures@1.3.1: - resolution: { integrity: sha512-syZGkapPpktD2el4lPTCQRw/LSia6/NwBS83hzCKu4dTlaJRO636qo5NCiiQb+iBYWyZQQEzN0jdRik8N9EUGA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-syZGkapPpktD2el4lPTCQRw/LSia6/NwBS83hzCKu4dTlaJRO636qo5NCiiQb+iBYWyZQQEzN0jdRik8N9EUGA==} + engines: {node: '>=14'} dependencies: '@stablelib/random': 1.0.0 optionalDependencies: @@ -2785,8 +5154,8 @@ packages: dev: true /@mattrglobal/bls12381-key-pair@1.2.1: - resolution: { integrity: sha512-Xh63NP1iSGBLW10N5uRpDyoPo2LtNHHh/TRGVJEHRgo+07yxgl8tS06Q2zO9gN9+b+GU5COKvR3lACwrvn+MYw== } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-Xh63NP1iSGBLW10N5uRpDyoPo2LtNHHh/TRGVJEHRgo+07yxgl8tS06Q2zO9gN9+b+GU5COKvR3lACwrvn+MYw==} + engines: {node: '>=14.0.0'} dependencies: '@mattrglobal/bbs-signatures': 1.3.1 bs58: 4.0.1 @@ -2797,8 +5166,8 @@ packages: dev: true /@mattrglobal/node-bbs-signatures@0.18.1: - resolution: { integrity: sha512-s9ccL/1TTvCP1N//4QR84j/d5D/stx/AI1kPcRgiE4O3KrxyF7ZdL9ca8fmFuN6yh9LAbn/OiGRnOXgvn38Dgg== } - engines: { node: '>=14', yarn: 1.x } + resolution: {integrity: sha512-s9ccL/1TTvCP1N//4QR84j/d5D/stx/AI1kPcRgiE4O3KrxyF7ZdL9ca8fmFuN6yh9LAbn/OiGRnOXgvn38Dgg==} + engines: {node: '>=14', yarn: 1.x} requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -2809,44 +5178,74 @@ packages: dev: true optional: true + /@multiformats/base-x@4.0.1: + resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} + dev: true + + /@noble/ciphers@0.5.3: + resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} + dev: true + + /@noble/curves@1.2.0: + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 + dev: true + + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 + dev: true + /@noble/ed25519@1.7.3: - resolution: { integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== } + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} dev: false + /@noble/hashes@1.3.2: + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + dev: true + + /@noble/hashes@1.4.0: + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + dev: true + /@nodelib/fs.scandir@2.1.5: - resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 /@nodelib/fs.stat@2.0.5: - resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} /@nodelib/fs.walk@1.2.8: - resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 /@npmcli/agent@2.2.2: - resolution: { integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: agent-base: 7.1.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 - lru-cache: 10.0.1 + lru-cache: 10.3.1 socks-proxy-agent: 8.0.3 transitivePeerDependencies: - supports-color dev: true /@npmcli/arborist@7.5.3: - resolution: { integrity: sha512-7gbMdDNSYUzi0j2mpb6FoXRg3BxXWplMQZH1MZlvNjSdWFObaUz2Ssvo0Nlh2xmWks1OPo+gpsE6qxpT/5M7lQ== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-7gbMdDNSYUzi0j2mpb6FoXRg3BxXWplMQZH1MZlvNjSdWFObaUz2Ssvo0Nlh2xmWks1OPo+gpsE6qxpT/5M7lQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: '@isaacs/string-locale-compare': 1.1.0 @@ -2890,31 +5289,31 @@ packages: dev: true /@npmcli/fs@1.1.1: - resolution: { integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== } + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 semver: 7.5.4 /@npmcli/fs@3.1.0: - resolution: { integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 dev: true /@npmcli/fs@3.1.1: - resolution: { integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 dev: true /@npmcli/git@5.0.6: - resolution: { integrity: sha512-4x/182sKXmQkf0EtXxT26GEsaOATpD7WVtza5hrYivWZeo6QefC6xq9KAXrnjtFKBZ4rZwR7aX/zClYYXgtwLw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-4x/182sKXmQkf0EtXxT26GEsaOATpD7WVtza5hrYivWZeo6QefC6xq9KAXrnjtFKBZ4rZwR7aX/zClYYXgtwLw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/promise-spawn': 7.0.1 - lru-cache: 10.0.1 + lru-cache: 10.3.1 npm-pick-manifest: 9.0.0 proc-log: 4.2.0 promise-inflight: 1.0.1 @@ -2926,8 +5325,8 @@ packages: dev: true /@npmcli/installed-package-contents@2.0.2: - resolution: { integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: npm-bundled: 3.0.0 @@ -2935,8 +5334,8 @@ packages: dev: true /@npmcli/installed-package-contents@2.1.0: - resolution: { integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: npm-bundled: 3.0.0 @@ -2944,8 +5343,8 @@ packages: dev: true /@npmcli/map-workspaces@3.0.6: - resolution: { integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: '@npmcli/name-from-folder': 2.0.0 glob: 10.3.10 @@ -2954,8 +5353,8 @@ packages: dev: true /@npmcli/metavuln-calculator@7.1.1: - resolution: { integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: cacache: 18.0.3 json-parse-even-better-errors: 3.0.2 @@ -2968,32 +5367,32 @@ packages: dev: true /@npmcli/move-file@1.1.2: - resolution: { integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 /@npmcli/name-from-folder@2.0.0: - resolution: { integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /@npmcli/node-gyp@3.0.0: - resolution: { integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /@npmcli/package-json@5.2.0: - resolution: { integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/git': 5.0.6 glob: 10.3.10 - hosted-git-info: 7.0.1 - json-parse-even-better-errors: 3.0.0 - normalize-package-data: 6.0.0 + hosted-git-info: 7.0.2 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 6.0.2 proc-log: 4.2.0 semver: 7.5.4 transitivePeerDependencies: @@ -3001,27 +5400,27 @@ packages: dev: true /@npmcli/promise-spawn@7.0.1: - resolution: { integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: which: 4.0.0 dev: true /@npmcli/query@3.1.0: - resolution: { integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: postcss-selector-parser: 6.1.0 dev: true /@npmcli/redact@2.0.1: - resolution: { integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} dev: true /@npmcli/run-script@8.1.0: - resolution: { integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/node-gyp': 3.0.0 '@npmcli/package-json': 5.2.0 @@ -3035,7 +5434,7 @@ packages: dev: true /@nrwl/devkit@18.3.3(nx@18.3.3): - resolution: { integrity: sha512-3zZLE1vfwsNie7qjVUt9lqaM1slU0RTr/dW+Yt/2lxe8Peu6f8bnCM1Pf3kSlzoxQroctfocRtVHFXJsAuAt4g== } + resolution: {integrity: sha512-3zZLE1vfwsNie7qjVUt9lqaM1slU0RTr/dW+Yt/2lxe8Peu6f8bnCM1Pf3kSlzoxQroctfocRtVHFXJsAuAt4g==} dependencies: '@nx/devkit': 18.3.3(nx@18.3.3) transitivePeerDependencies: @@ -3043,7 +5442,7 @@ packages: dev: true /@nrwl/tao@18.3.3: - resolution: { integrity: sha512-f/PUDLpSMEObiLQ5sIDySJM+5DxSCNunkxxbY1R9rmQ1cFcgrHaXIHQqbSj91mMa3mmtbKACk8u1LbI+oQV0Tg== } + resolution: {integrity: sha512-f/PUDLpSMEObiLQ5sIDySJM+5DxSCNunkxxbY1R9rmQ1cFcgrHaXIHQqbSj91mMa3mmtbKACk8u1LbI+oQV0Tg==} hasBin: true dependencies: nx: 18.3.3 @@ -3055,7 +5454,7 @@ packages: dev: true /@nx/devkit@18.3.3(nx@18.3.3): - resolution: { integrity: sha512-FtkZ6mA5//vEA5lcbT80m080ROVacHYV5F1peztTRA+IY2JZGJoqx425kn5ylDO8aCSAIAwcn2qIdhI8BnpG3Q== } + resolution: {integrity: sha512-FtkZ6mA5//vEA5lcbT80m080ROVacHYV5F1peztTRA+IY2JZGJoqx425kn5ylDO8aCSAIAwcn2qIdhI8BnpG3Q==} peerDependencies: nx: '>= 16 <= 19' dependencies: @@ -3071,8 +5470,8 @@ packages: dev: true /@nx/nx-darwin-arm64@18.3.3: - resolution: { integrity: sha512-NpA2/7o1uUuaocMYopX9muxKif9HlGfWaXo2UeiR918usF6xri4aUqweZbaXVc9iqCAEbVMWUsjaLYGKPXHAjw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-NpA2/7o1uUuaocMYopX9muxKif9HlGfWaXo2UeiR918usF6xri4aUqweZbaXVc9iqCAEbVMWUsjaLYGKPXHAjw==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] requiresBuild: true @@ -3080,8 +5479,8 @@ packages: optional: true /@nx/nx-darwin-x64@18.3.3: - resolution: { integrity: sha512-aydPLbc7DeceJ6szRf6DLT4ERoPvwfWyFiGXdAlEZYWhjEuNZLeG8K6jA3yHeWltKfX/qJqhnyKbnubBNzBKlQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-aydPLbc7DeceJ6szRf6DLT4ERoPvwfWyFiGXdAlEZYWhjEuNZLeG8K6jA3yHeWltKfX/qJqhnyKbnubBNzBKlQ==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] requiresBuild: true @@ -3089,8 +5488,8 @@ packages: optional: true /@nx/nx-freebsd-x64@18.3.3: - resolution: { integrity: sha512-sEYEWsK/fwC1l7wzls7RNOjhmrooH0lK0mpgj1vDXesLBSZ7k+pddAqaHFECN4QXBSbHZI2PWOEhbnIH+Errsg== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-sEYEWsK/fwC1l7wzls7RNOjhmrooH0lK0mpgj1vDXesLBSZ7k+pddAqaHFECN4QXBSbHZI2PWOEhbnIH+Errsg==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] requiresBuild: true @@ -3098,8 +5497,8 @@ packages: optional: true /@nx/nx-linux-arm-gnueabihf@18.3.3: - resolution: { integrity: sha512-B9GGMkrrzwiAfvew22x85ITO9TiNxbgRbKJQWQaoopNpXrnSWpY8WTNxpDT24fwV1qdQfsPKcY3F4O0NOUgPRA== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-B9GGMkrrzwiAfvew22x85ITO9TiNxbgRbKJQWQaoopNpXrnSWpY8WTNxpDT24fwV1qdQfsPKcY3F4O0NOUgPRA==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] requiresBuild: true @@ -3107,8 +5506,8 @@ packages: optional: true /@nx/nx-linux-arm64-gnu@18.3.3: - resolution: { integrity: sha512-1EucHf5/0JeqZmhritqkpEdOcdo9Dl32gpFvhNfS6kCAYmaDlEl4zqedz3VIoj4C7+C0pV3mcRO9qB9H7GM5bQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-1EucHf5/0JeqZmhritqkpEdOcdo9Dl32gpFvhNfS6kCAYmaDlEl4zqedz3VIoj4C7+C0pV3mcRO9qB9H7GM5bQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true @@ -3116,8 +5515,8 @@ packages: optional: true /@nx/nx-linux-arm64-musl@18.3.3: - resolution: { integrity: sha512-HPgOgnYYLPVCBEaAkSEGPGzZqTDCiyCAF/qtvx5z0f1U/hZYb1ubgxw70ogY82Cafr7X4gQBz5k4/ZCnoCXlOQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-HPgOgnYYLPVCBEaAkSEGPGzZqTDCiyCAF/qtvx5z0f1U/hZYb1ubgxw70ogY82Cafr7X4gQBz5k4/ZCnoCXlOQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true @@ -3125,8 +5524,8 @@ packages: optional: true /@nx/nx-linux-x64-gnu@18.3.3: - resolution: { integrity: sha512-FgYTQ3VEE6EUOGtJT9riRK8IBwPGFjKS+N2mudQJn2bB/9IumUvVRYQUIX08gqGLlqZPO6uUUhUjwZY8SnjRLQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-FgYTQ3VEE6EUOGtJT9riRK8IBwPGFjKS+N2mudQJn2bB/9IumUvVRYQUIX08gqGLlqZPO6uUUhUjwZY8SnjRLQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true @@ -3134,8 +5533,8 @@ packages: optional: true /@nx/nx-linux-x64-musl@18.3.3: - resolution: { integrity: sha512-QnWjGViR1Wj9gJXa1RJ9mXyy2/JzQ7NF2C4ulTYSH5St1HoxhkfnLsV0+uNLFEV9PSZq+2BfxmQuT8Appefv1A== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-QnWjGViR1Wj9gJXa1RJ9mXyy2/JzQ7NF2C4ulTYSH5St1HoxhkfnLsV0+uNLFEV9PSZq+2BfxmQuT8Appefv1A==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true @@ -3143,8 +5542,8 @@ packages: optional: true /@nx/nx-win32-arm64-msvc@18.3.3: - resolution: { integrity: sha512-Xn3LUaPsF8QkEYUVV3lc693NTCMWrfZBFXTy1cQpvLzQ+idsXQ/EGWoq93cIM3Nc2YWyblT2hHHelb8dHCZAlw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-Xn3LUaPsF8QkEYUVV3lc693NTCMWrfZBFXTy1cQpvLzQ+idsXQ/EGWoq93cIM3Nc2YWyblT2hHHelb8dHCZAlw==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] requiresBuild: true @@ -3152,8 +5551,8 @@ packages: optional: true /@nx/nx-win32-x64-msvc@18.3.3: - resolution: { integrity: sha512-t8HvOnQEiaaoTFOOIrql30NPhIwDFO7jg0Jtz3Tbneulh7ceswJp71yFHsRGGrYZ23Tgg+Sna6M9qLRGzlRGkg== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-t8HvOnQEiaaoTFOOIrql30NPhIwDFO7jg0Jtz3Tbneulh7ceswJp71yFHsRGGrYZ23Tgg+Sna6M9qLRGzlRGkg==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] requiresBuild: true @@ -3161,13 +5560,13 @@ packages: optional: true /@octokit/auth-token@3.0.4: - resolution: { integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} dev: true /@octokit/core@4.2.4: - resolution: { integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} dependencies: '@octokit/auth-token': 3.0.4 '@octokit/graphql': 5.0.6 @@ -3181,8 +5580,8 @@ packages: dev: true /@octokit/endpoint@7.0.6: - resolution: { integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} dependencies: '@octokit/types': 9.3.2 is-plain-object: 5.0.0 @@ -3190,8 +5589,8 @@ packages: dev: true /@octokit/graphql@5.0.6: - resolution: { integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} dependencies: '@octokit/request': 6.2.8 '@octokit/types': 9.3.2 @@ -3201,16 +5600,16 @@ packages: dev: true /@octokit/openapi-types@18.1.1: - resolution: { integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== } + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} dev: true /@octokit/plugin-enterprise-rest@6.0.1: - resolution: { integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== } + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} dev: true /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): - resolution: { integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=4' dependencies: @@ -3220,7 +5619,7 @@ packages: dev: true /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): - resolution: { integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== } + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' dependencies: @@ -3228,8 +5627,8 @@ packages: dev: true /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): - resolution: { integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} peerDependencies: '@octokit/core': '>=3' dependencies: @@ -3238,8 +5637,8 @@ packages: dev: true /@octokit/request-error@3.0.3: - resolution: { integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} dependencies: '@octokit/types': 9.3.2 deprecation: 2.3.1 @@ -3247,8 +5646,8 @@ packages: dev: true /@octokit/request@6.2.8: - resolution: { integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} dependencies: '@octokit/endpoint': 7.0.6 '@octokit/request-error': 3.0.3 @@ -3261,8 +5660,8 @@ packages: dev: true /@octokit/rest@19.0.11: - resolution: { integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==} + engines: {node: '>= 14'} dependencies: '@octokit/core': 4.2.4 '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) @@ -3273,30 +5672,30 @@ packages: dev: true /@octokit/tsconfig@1.0.2: - resolution: { integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== } + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} dev: true /@octokit/types@10.0.0: - resolution: { integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== } + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} dependencies: '@octokit/openapi-types': 18.1.1 dev: true /@octokit/types@9.3.2: - resolution: { integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== } + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} dependencies: '@octokit/openapi-types': 18.1.1 dev: true /@peculiar/asn1-schema@2.3.6: - resolution: { integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== } + resolution: {integrity: sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA==} dependencies: asn1js: 3.0.5 pvtsutils: 1.3.5 tslib: 2.6.2 /@peculiar/asn1-schema@2.3.8: - resolution: { integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== } + resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} dependencies: asn1js: 3.0.5 pvtsutils: 1.3.5 @@ -3304,14 +5703,14 @@ packages: dev: true /@peculiar/json-schema@1.1.12: - resolution: { integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} dependencies: tslib: 2.6.2 /@peculiar/webcrypto@1.4.3: - resolution: { integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A==} + engines: {node: '>=10.12.0'} dependencies: '@peculiar/asn1-schema': 2.3.6 '@peculiar/json-schema': 1.1.12 @@ -3320,8 +5719,8 @@ packages: webcrypto-core: 1.7.7 /@peculiar/webcrypto@1.4.6: - resolution: { integrity: sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg== } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-YBcMfqNSwn3SujUJvAaySy5tlYbYm6tVt9SKoXu8BaTdKGROiJDgPR3TXpZdAKUfklzm3lRapJEAltiMQtBgZg==} + engines: {node: '>=10.12.0'} dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 @@ -3331,14 +5730,14 @@ packages: dev: true /@pkgjs/parseargs@0.11.0: - resolution: { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} requiresBuild: true dev: true optional: true /@react-native-community/cli-clean@10.1.1: - resolution: { integrity: sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg== } + resolution: {integrity: sha512-iNsrjzjIRv9yb5y309SWJ8NDHdwYtnCpmxZouQDyOljUdC9MwdZ4ChbtA4rwQyAwgOVfS9F/j56ML3Cslmvrxg==} dependencies: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 @@ -3348,7 +5747,7 @@ packages: - encoding /@react-native-community/cli-config@10.1.1: - resolution: { integrity: sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog== } + resolution: {integrity: sha512-p4mHrjC+s/ayiNVG6T35GdEGdP6TuyBUg5plVGRJfTl8WT6LBfLYLk+fz/iETrEZ/YkhQIsQcEUQC47MqLNHog==} dependencies: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 @@ -3360,14 +5759,14 @@ packages: - encoding /@react-native-community/cli-debugger-ui@10.0.0: - resolution: { integrity: sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA== } + resolution: {integrity: sha512-8UKLcvpSNxnUTRy8CkCl27GGLqZunQ9ncGYhSrWyKrU9SWBJJGeZwi2k2KaoJi5FvF2+cD0t8z8cU6lsq2ZZmA==} dependencies: serve-static: 1.15.0 transitivePeerDependencies: - supports-color /@react-native-community/cli-doctor@10.2.5: - resolution: { integrity: sha512-1YbzXvsldBmSw1MmBsXB74bKiHXKNCjlb2ByLgkfTiarpSvETYam3g5vex0N+qc0Cdkzkq+8NznE744LFhnUpw== } + resolution: {integrity: sha512-1YbzXvsldBmSw1MmBsXB74bKiHXKNCjlb2ByLgkfTiarpSvETYam3g5vex0N+qc0Cdkzkq+8NznE744LFhnUpw==} dependencies: '@react-native-community/cli-config': 10.1.1 '@react-native-community/cli-platform-ios': 10.2.5 @@ -3389,7 +5788,7 @@ packages: - encoding /@react-native-community/cli-hermes@10.2.0: - resolution: { integrity: sha512-urfmvNeR8IiO/Sd92UU3xPO+/qI2lwCWQnxOkWaU/i2EITFekE47MD6MZrfVulRVYRi5cuaFqKZO/ccOdOB/vQ== } + resolution: {integrity: sha512-urfmvNeR8IiO/Sd92UU3xPO+/qI2lwCWQnxOkWaU/i2EITFekE47MD6MZrfVulRVYRi5cuaFqKZO/ccOdOB/vQ==} dependencies: '@react-native-community/cli-platform-android': 10.2.0 '@react-native-community/cli-tools': 10.1.1 @@ -3400,7 +5799,7 @@ packages: - encoding /@react-native-community/cli-platform-android@10.2.0: - resolution: { integrity: sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw== } + resolution: {integrity: sha512-CBenYwGxwFdObZTn1lgxWtMGA5ms2G/ALQhkS+XTAD7KHDrCxFF9yT/fnAjFZKM6vX/1TqGI1RflruXih3kAhw==} dependencies: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 @@ -3411,7 +5810,7 @@ packages: - encoding /@react-native-community/cli-platform-ios@10.2.4: - resolution: { integrity: sha512-/6K+jeRhcGojFIJMWMXV2eY5n/In+YUzBr/DKWQOeHBOHkESRNheG310xSAIjgB46YniSSUKhSyeuhalTbm9OQ== } + resolution: {integrity: sha512-/6K+jeRhcGojFIJMWMXV2eY5n/In+YUzBr/DKWQOeHBOHkESRNheG310xSAIjgB46YniSSUKhSyeuhalTbm9OQ==} dependencies: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 @@ -3423,7 +5822,7 @@ packages: - encoding /@react-native-community/cli-platform-ios@10.2.5: - resolution: { integrity: sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg== } + resolution: {integrity: sha512-hq+FZZuSBK9z82GLQfzdNDl8vbFx5UlwCLFCuTtNCROgBoapFtVZQKRP2QBftYNrQZ0dLAb01gkwxagHsQCFyg==} dependencies: '@react-native-community/cli-tools': 10.1.1 chalk: 4.1.2 @@ -3435,7 +5834,7 @@ packages: - encoding /@react-native-community/cli-plugin-metro@10.2.3(@babel/core@7.23.0): - resolution: { integrity: sha512-jHi2oDuTePmW4NEyVT8JEGNlIYcnFXCSV2ZMp4rnDrUk4TzzyvS3IMvDlESEmG8Kry8rvP0KSUx/hTpy37Sbkw== } + resolution: {integrity: sha512-jHi2oDuTePmW4NEyVT8JEGNlIYcnFXCSV2ZMp4rnDrUk4TzzyvS3IMvDlESEmG8Kry8rvP0KSUx/hTpy37Sbkw==} dependencies: '@react-native-community/cli-server-api': 10.1.1 '@react-native-community/cli-tools': 10.1.1 @@ -3456,7 +5855,7 @@ packages: - utf-8-validate /@react-native-community/cli-server-api@10.1.1: - resolution: { integrity: sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g== } + resolution: {integrity: sha512-NZDo/wh4zlm8as31UEBno2bui8+ufzsZV+KN7QjEJWEM0levzBtxaD+4je0OpfhRIIkhaRm2gl/vVf7OYAzg4g==} dependencies: '@react-native-community/cli-debugger-ui': 10.0.0 '@react-native-community/cli-tools': 10.1.1 @@ -3474,7 +5873,7 @@ packages: - utf-8-validate /@react-native-community/cli-tools@10.1.1: - resolution: { integrity: sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g== } + resolution: {integrity: sha512-+FlwOnZBV+ailEzXjcD8afY2ogFEBeHOw/8+XXzMgPaquU2Zly9B+8W089tnnohO3yfiQiZqkQlElP423MY74g==} dependencies: appdirsjs: 1.2.7 chalk: 4.1.2 @@ -3489,13 +5888,13 @@ packages: - encoding /@react-native-community/cli-types@10.0.0: - resolution: { integrity: sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw== } + resolution: {integrity: sha512-31oUM6/rFBZQfSmDQsT1DX/5fjqfxg7sf2u8kTPJK7rXVya5SRpAMaCXsPAG0omsmJxXt+J9HxUi3Ic+5Ux5Iw==} dependencies: joi: 17.10.2 /@react-native-community/cli@10.2.4(@babel/core@7.23.0): - resolution: { integrity: sha512-E9BUDHfLEsnjkjeJqECuCjl4E/1Ox9Nl6hkQBhEqjZm4AaQxgU7M6AyFfOgaXn5v3am16/R4ZOUTrJnGJWS3GA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-E9BUDHfLEsnjkjeJqECuCjl4E/1Ox9Nl6hkQBhEqjZm4AaQxgU7M6AyFfOgaXn5v3am16/R4ZOUTrJnGJWS3GA==} + engines: {node: '>=14'} hasBin: true dependencies: '@react-native-community/cli-clean': 10.1.1 @@ -3523,72 +5922,93 @@ packages: - utf-8-validate /@react-native/assets@1.0.0: - resolution: { integrity: sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ== } + resolution: {integrity: sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==} /@react-native/normalize-color@2.1.0: - resolution: { integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA== } + resolution: {integrity: sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==} /@react-native/polyfills@2.0.0: - resolution: { integrity: sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== } + resolution: {integrity: sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ==} + + /@scure/base@1.1.7: + resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} + dev: true /@sd-jwt/decode@0.6.1: - resolution: { integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ==} + engines: {node: '>=16'} + dependencies: + '@sd-jwt/types': 0.6.1 + '@sd-jwt/utils': 0.6.1 + dev: false + + /@sd-jwt/present@0.6.1: + resolution: {integrity: sha512-QRD3TUDLj4PqQNZ70bBxh8FLLrOE9mY8V9qiZrJSsaDOLFs2p1CtZG+v9ig62fxFYJZMf4bWKwYjz+qqGAtxCg==} + engines: {node: '>=16'} dependencies: + '@sd-jwt/decode': 0.6.1 '@sd-jwt/types': 0.6.1 '@sd-jwt/utils': 0.6.1 dev: false /@sd-jwt/types@0.6.1: - resolution: { integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg== } - engines: { node: '>=16' } + resolution: {integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg==} + engines: {node: '>=16'} dev: false /@sd-jwt/utils@0.6.1: - resolution: { integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ==} + engines: {node: '>=16'} dependencies: '@sd-jwt/types': 0.6.1 js-base64: 3.7.7 dev: false + /@segment/ajv-human-errors@2.13.0(ajv@8.12.0): + resolution: {integrity: sha512-rubuhyhxCHmVdTmA5G3aMiWoN8Yutp+LG/AGUSiIKJVs1r7EEE/yjqSzSqyANGj5ZkqGUP802Ur9s19MuWelZQ==} + peerDependencies: + ajv: ^8.0.0 + dependencies: + ajv: 8.12.0 + dev: true + /@segment/loosely-validate-event@2.0.0: - resolution: { integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw== } + resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} dependencies: component-type: 1.2.1 join-component: 1.1.0 /@sideway/address@4.1.4: - resolution: { integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== } + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} dependencies: '@hapi/hoek': 9.3.0 /@sideway/formula@3.0.1: - resolution: { integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== } + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} /@sideway/pinpoint@2.0.0: - resolution: { integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== } + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} /@sigstore/bundle@2.3.1: - resolution: { integrity: sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-eqV17lO3EIFqCWK3969Rz+J8MYrRZKw9IBHpSo6DEcEX2c+uzDFOgHE9f2MnyDpfs48LFO4hXmk9KhQ74JzU1g==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@sigstore/protobuf-specs': 0.3.1 dev: true /@sigstore/core@1.1.0: - resolution: { integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} dev: true /@sigstore/protobuf-specs@0.3.1: - resolution: { integrity: sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-aIL8Z9NsMr3C64jyQzE0XlkEyBLpgEJJFDHLVVStkFV5Q3Il/r/YtY6NJWKQ4cy4AE7spP1IX5Jq7VCAxHHMfQ==} + engines: {node: ^16.14.0 || >=18.0.0} dev: true /@sigstore/sign@2.3.0: - resolution: { integrity: sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-tsAyV6FC3R3pHmKS880IXcDJuiFJiKITO1jxR1qbplcsBkZLBmjrEw5GbC7ikD6f5RU1hr7WnmxB/2kKc1qUWQ==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@sigstore/bundle': 2.3.1 '@sigstore/core': 1.1.0 @@ -3599,8 +6019,8 @@ packages: dev: true /@sigstore/tuf@2.3.2: - resolution: { integrity: sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@sigstore/protobuf-specs': 0.3.1 tuf-js: 2.2.0 @@ -3609,8 +6029,8 @@ packages: dev: true /@sigstore/verify@1.2.0: - resolution: { integrity: sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-hQF60nc9yab+Csi4AyoAmilGNfpXT+EXdBgFkP9OgPwIBPwyqVf7JAWPtmqrrrneTmAT6ojv7OlH1f6Ix5BG4Q==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@sigstore/bundle': 2.3.1 '@sigstore/core': 1.1.0 @@ -3618,20 +6038,29 @@ packages: dev: true /@sinclair/typebox@0.27.8: - resolution: { integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== } + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} /@sinonjs/commons@3.0.0: - resolution: { integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== } + resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: type-detect: 4.0.8 /@sinonjs/fake-timers@10.3.0: - resolution: { integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== } + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.0 + /@sphereon/did-uni-client@0.6.3: + resolution: {integrity: sha512-g7LD7ofbE36slHN7Bhr5dwUrj6t0BuZeXBYJMaVY/pOeL1vJxW1cZHbZqu0NSfOmzyBg4nsYVlgTjyi/Aua2ew==} + dependencies: + cross-fetch: 3.1.8 + did-resolver: 4.1.0 + transitivePeerDependencies: + - encoding + dev: false + /@sphereon/isomorphic-webcrypto@2.4.1-unstable.0(msrcrypto@1.5.8): - resolution: { integrity: sha512-08rCBqZIL9XdUXnVbdpxCzqE0JVFYqYAtGCHEOes4q+fHX1ut9+MIXoGswPXmzwyJsfDGvr2ACuu8mfUzfjUFw== } + resolution: {integrity: sha512-08rCBqZIL9XdUXnVbdpxCzqE0JVFYqYAtGCHEOes4q+fHX1ut9+MIXoGswPXmzwyJsfDGvr2ACuu8mfUzfjUFw==} peerDependencies: expo: '*' expo-crypto: '*' @@ -3664,8 +6093,31 @@ packages: webcrypto-shim: 0.1.7 dev: true + /@sphereon/pex-models@2.2.4: + resolution: {integrity: sha512-pGlp+wplneE1+Lk3U48/2htYKTbONMeG5/x7vhO6AnPUOsnOXeJdftPrBYWVSzz/JH5GJptAc6+pAyYE1zMu4Q==} + dev: false + + /@sphereon/pex@3.3.3: + resolution: {integrity: sha512-CXwdEcMTUh2z/5AriBn3OuShEG06l2tgiIr7qDJthnkez8DQ3sZo2vr4NEQWKKAL+DeAWAI4FryQGO4KuK7yfg==} + engines: {node: '>=18'} + requiresBuild: true + dependencies: + '@astronautlabs/jsonpath': 1.1.2 + '@sd-jwt/decode': 0.6.1 + '@sd-jwt/present': 0.6.1 + '@sd-jwt/types': 0.6.1 + '@sphereon/pex-models': 2.2.4 + '@sphereon/ssi-types': 0.22.0 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + jwt-decode: 3.1.2 + nanoid: 3.3.7 + string.prototype.matchall: 4.0.11 + uint8arrays: 3.1.1 + dev: false + /@sphereon/ssi-express-support@0.26.1-next.6: - resolution: { integrity: sha512-Wo5Qa/ILGHCzef67JuwkOAHHTlC8R7YRkVitW/g+HCzHzaEEwoMh44cgYf65fufem00dYvPN15/gNWNQPaJZOw== } + resolution: {integrity: sha512-Wo5Qa/ILGHCzef67JuwkOAHHTlC8R7YRkVitW/g+HCzHzaEEwoMh44cgYf65fufem00dYvPN15/gNWNQPaJZOw==} peerDependencies: '@noble/hashes': 1.2.0 passport-azure-ad: ^4.3.5 @@ -3696,7 +6148,7 @@ packages: dev: false /@sphereon/ssi-sdk-ext.key-utils@0.22.0(msrcrypto@1.5.8): - resolution: { integrity: sha512-g2H/X12JcD1Sqi0/L8JxeFRrr+dYMs2C2X0TGiAUtN2k3JyZptlBSZgiDF8UZgRn+dAyiIOmcnEQEkVi2rS7sQ== } + resolution: {integrity: sha512-g2H/X12JcD1Sqi0/L8JxeFRrr+dYMs2C2X0TGiAUtN2k3JyZptlBSZgiDF8UZgRn+dAyiIOmcnEQEkVi2rS7sQ==} dependencies: '@ethersproject/random': 5.7.0 '@sphereon/isomorphic-webcrypto': 2.4.1-unstable.0(msrcrypto@1.5.8) @@ -3722,8 +6174,15 @@ packages: - supports-color dev: true + /@sphereon/ssi-types@0.22.0: + resolution: {integrity: sha512-YPJAZlKmzNALXK8ohP3ETxj1oVzL4+M9ljj3fD5xrbacvYax1JPCVKc8BWSubGcQckKHPbgbpcS7LYEeghyT9Q==} + dependencies: + '@sd-jwt/decode': 0.6.1 + jwt-decode: 3.1.2 + dev: false + /@sphereon/ssi-types@0.26.1-next.132: - resolution: { integrity: sha512-coqhozmVf2phy40l1htj/zbLJLJhyD69ZukBVR4gKn35t8q2B2EZhJbCIPWKk2HWT6+gV+JUBQ9n4v3cSHNCJg== } + resolution: {integrity: sha512-coqhozmVf2phy40l1htj/zbLJLJhyD69ZukBVR4gKn35t8q2B2EZhJbCIPWKk2HWT6+gV+JUBQ9n4v3cSHNCJg==} dependencies: '@sd-jwt/decode': 0.6.1 debug: 4.3.5 @@ -3734,7 +6193,7 @@ packages: dev: false /@sphereon/ssi-types@0.26.1-next.6: - resolution: { integrity: sha512-YloKFKuUfx7JOyxJPig6YLPJ04owQpbaF0WWOfu5MB+EFJIgSrl3GLO391/FZh8MYxTHh9+QpkpAxfVLXFpJ2A== } + resolution: {integrity: sha512-YloKFKuUfx7JOyxJPig6YLPJ04owQpbaF0WWOfu5MB+EFJIgSrl3GLO391/FZh8MYxTHh9+QpkpAxfVLXFpJ2A==} dependencies: '@sd-jwt/decode': 0.6.1 debug: 4.3.5 @@ -3744,21 +6203,59 @@ packages: - supports-color dev: false + /@sphereon/ssi-types@0.9.0: + resolution: {integrity: sha512-umCr/syNcmvMMbQ+i/r/mwjI1Qw2aFPp9AwBTvTo1ailAVaaJjJGPkkVz1K9/2NZATNdDiQ3A8yGzdVJoKh9pA==} + dependencies: + jwt-decode: 3.1.2 + dev: false + + /@sphereon/wellknown-dids-client@0.1.3: + resolution: {integrity: sha512-TAT24L3RoXD8ocrkTcsz7HuJmgjNjdoV6IXP1p3DdaI/GqkynytXE3J1+F7vUFMRYwY5nW2RaXSgDQhrFJemaA==} + dependencies: + '@sphereon/ssi-types': 0.9.0 + cross-fetch: 3.1.8 + jwt-decode: 3.1.2 + transitivePeerDependencies: + - encoding + dev: false + /@stablelib/aead@1.0.1: - resolution: { integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg== } + resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + dev: true + + /@stablelib/aes-kw@1.0.1: + resolution: {integrity: sha512-KrOkiRex1tQTbWk+hFB5fFw4vqKhNnTUtlCRf1bhUEOFp7hadWe49/sLa/P4X4FBQVoh3Z9Lj0zS1OWu/AHA1w==} + dependencies: + '@stablelib/aes': 1.0.1 + '@stablelib/binary': 1.0.1 + '@stablelib/blockcipher': 1.0.1 + '@stablelib/constant-time': 1.0.1 + '@stablelib/wipe': 1.0.1 + dev: true + + /@stablelib/aes@1.0.1: + resolution: {integrity: sha512-bMiezJDeFONDHbMEa+Kic26962+bwkZfsHPAmcqTjLaHCAhEQuK3i1H0POPOkcHCdj75oVRIqFCraCA0cyHPvw==} + dependencies: + '@stablelib/binary': 1.0.1 + '@stablelib/blockcipher': 1.0.1 + '@stablelib/wipe': 1.0.1 dev: true /@stablelib/binary@1.0.1: - resolution: { integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q== } + resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} dependencies: '@stablelib/int': 1.0.1 + /@stablelib/blockcipher@1.0.1: + resolution: {integrity: sha512-4bkpV8HUAv0CgI1fUqkPUEEvv3RXQ3qBkuZaSWhshXGAz1JCpriesgiO9Qs4f0KzBJkCtvcho5n7d/RKvnHbew==} + dev: true + /@stablelib/bytes@1.0.1: - resolution: { integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ== } + resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} dev: true /@stablelib/chacha20poly1305@1.0.1: - resolution: { integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA== } + resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} dependencies: '@stablelib/aead': 1.0.1 '@stablelib/binary': 1.0.1 @@ -3769,57 +6266,57 @@ packages: dev: true /@stablelib/chacha@1.0.1: - resolution: { integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg== } + resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/wipe': 1.0.1 dev: true /@stablelib/constant-time@1.0.1: - resolution: { integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg== } + resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} dev: true /@stablelib/ed25519@1.0.3: - resolution: { integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg== } + resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} dependencies: '@stablelib/random': 1.0.2 '@stablelib/sha512': 1.0.1 '@stablelib/wipe': 1.0.1 /@stablelib/hash@1.0.1: - resolution: { integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg== } + resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} /@stablelib/int@1.0.1: - resolution: { integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w== } + resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} /@stablelib/keyagreement@1.0.1: - resolution: { integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg== } + resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} dependencies: '@stablelib/bytes': 1.0.1 dev: true /@stablelib/poly1305@1.0.1: - resolution: { integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA== } + resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} dependencies: '@stablelib/constant-time': 1.0.1 '@stablelib/wipe': 1.0.1 dev: true /@stablelib/random@1.0.0: - resolution: { integrity: sha512-G9vwwKrNCGMI/uHL6XeWe2Nk4BuxkYyWZagGaDU9wrsuV+9hUwNI1lok2WVo8uJDa2zx7ahNwN7Ij983hOUFEw== } + resolution: {integrity: sha512-G9vwwKrNCGMI/uHL6XeWe2Nk4BuxkYyWZagGaDU9wrsuV+9hUwNI1lok2WVo8uJDa2zx7ahNwN7Ij983hOUFEw==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/wipe': 1.0.1 dev: true /@stablelib/random@1.0.2: - resolution: { integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w== } + resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/wipe': 1.0.1 /@stablelib/sha256@1.0.1: - resolution: { integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ== } + resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/hash': 1.0.1 @@ -3827,17 +6324,17 @@ packages: dev: true /@stablelib/sha512@1.0.1: - resolution: { integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw== } + resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/hash': 1.0.1 '@stablelib/wipe': 1.0.1 /@stablelib/wipe@1.0.1: - resolution: { integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg== } + resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} /@stablelib/x25519@1.0.3: - resolution: { integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw== } + resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} dependencies: '@stablelib/keyagreement': 1.0.1 '@stablelib/random': 1.0.2 @@ -3845,7 +6342,7 @@ packages: dev: true /@stablelib/xchacha20@1.0.1: - resolution: { integrity: sha512-1YkiZnFF4veUwBVhDnDYwo6EHeKzQK4FnLiO7ezCl/zu64uG0bCCAUROJaBkaLH+5BEsO3W7BTXTguMbSLlWSw== } + resolution: {integrity: sha512-1YkiZnFF4veUwBVhDnDYwo6EHeKzQK4FnLiO7ezCl/zu64uG0bCCAUROJaBkaLH+5BEsO3W7BTXTguMbSLlWSw==} dependencies: '@stablelib/binary': 1.0.1 '@stablelib/chacha': 1.0.1 @@ -3853,7 +6350,7 @@ packages: dev: true /@stablelib/xchacha20poly1305@1.0.1: - resolution: { integrity: sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg== } + resolution: {integrity: sha512-B1Abj0sMJ8h3HNmGnJ7vHBrAvxuNka6cJJoZ1ILN7iuacXp7sUYcgOVEOTLWj+rtQMpspY9tXSCRLPmN1mQNWg==} dependencies: '@stablelib/aead': 1.0.1 '@stablelib/chacha20poly1305': 1.0.1 @@ -3863,17 +6360,17 @@ packages: dev: true /@tokenizer/token@0.3.0: - resolution: { integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== } + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} dev: true /@tootallnate/once@1.1.2: - resolution: { integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} dev: true /@transmute/bls12381-key-pair@0.7.0-unstable.81: - resolution: { integrity: sha512-r0MIYw6MNr42AeYHSdbR5bJty9dpyTfuP8r7f45zZd5mvJkp/ryzDGu7JOQpeY+7VnzW/d9CVWTUmdrgq9oDqQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-r0MIYw6MNr42AeYHSdbR5bJty9dpyTfuP8r7f45zZd5mvJkp/ryzDGu7JOQpeY+7VnzW/d9CVWTUmdrgq9oDqQ==} + engines: {node: '>=16'} dependencies: '@mattrglobal/bls12381-key-pair': 1.2.1 '@transmute/ld-key-pair': 0.7.0-unstable.81 @@ -3882,13 +6379,17 @@ packages: - supports-color dev: true + /@transmute/credentials-context@0.7.0-unstable.82: + resolution: {integrity: sha512-2cB6UcMKeEK6kqvl5Uhpoe5iUUAcVURlRHl9nVa/Xx2JymNHyBvyXi+CGjIwf/eEk7hsgMIwDfGqq5Mcnbk5cw==} + dev: true + /@transmute/did-context@0.6.1-unstable.37: - resolution: { integrity: sha512-p/QnG3QKS4218hjIDgdvJOFATCXsAnZKgy4egqRrJLlo3Y6OaDBg7cA73dixOwUPoEKob0K6rLIGcsCI/L1acw== } + resolution: {integrity: sha512-p/QnG3QKS4218hjIDgdvJOFATCXsAnZKgy4egqRrJLlo3Y6OaDBg7cA73dixOwUPoEKob0K6rLIGcsCI/L1acw==} dev: true /@transmute/did-key-bls12381@0.3.0-unstable.10: - resolution: { integrity: sha512-ExSADdvDxrYeCx8RsKXZGMjJmHrOJ9vyYtziZUaJ97K/sn1uVlvIOTp9V4xHa6j9cT1wTzSqJ325euwGFeK+WQ== } - engines: { node: '>=14' } + resolution: {integrity: sha512-ExSADdvDxrYeCx8RsKXZGMjJmHrOJ9vyYtziZUaJ97K/sn1uVlvIOTp9V4xHa6j9cT1wTzSqJ325euwGFeK+WQ==} + engines: {node: '>=14'} dependencies: '@transmute/bls12381-key-pair': 0.7.0-unstable.81 '@transmute/did-key-common': 0.3.0-unstable.10 @@ -3899,8 +6400,8 @@ packages: dev: true /@transmute/did-key-common@0.3.0-unstable.10: - resolution: { integrity: sha512-Iryh/HcGIvmTtWFTRaG/JEgbUsqI5OqKqkR2676yQWK4ajLMsyNattz5n0ZfFQk/4U7Ee6pJvvKRduFDAqqV0Q== } - engines: { node: '>=14' } + resolution: {integrity: sha512-Iryh/HcGIvmTtWFTRaG/JEgbUsqI5OqKqkR2676yQWK4ajLMsyNattz5n0ZfFQk/4U7Ee6pJvvKRduFDAqqV0Q==} + engines: {node: '>=14'} dependencies: '@did-core/data-model': 0.1.1-unstable.15 '@did-core/did-ld-json': 0.1.1-unstable.15 @@ -3913,8 +6414,8 @@ packages: dev: true /@transmute/did-key-ed25519@0.3.0-unstable.10: - resolution: { integrity: sha512-9QdXl58DjwqBuOJBx6DtvaNW2bZLmVBxMSq2En4RAQcGIz1GGulyEQ1NB7PLIAgnam3LIFxiK6RiQGQTfJmmJg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-9QdXl58DjwqBuOJBx6DtvaNW2bZLmVBxMSq2En4RAQcGIz1GGulyEQ1NB7PLIAgnam3LIFxiK6RiQGQTfJmmJg==} + engines: {node: '>=14'} dependencies: '@transmute/did-key-common': 0.3.0-unstable.10 '@transmute/ed25519-key-pair': 0.6.1-unstable.37 @@ -3924,8 +6425,8 @@ packages: dev: true /@transmute/did-key-secp256k1@0.3.0-unstable.10: - resolution: { integrity: sha512-C/Gyu2U3NQZ9Gxu4WVwUk8h0ERbY9Z4Kjk0P49p3IQFrWK19XmVXjA+b1RiqffhYzWJ6fH5TPYIt2LW5MRQmUA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-C/Gyu2U3NQZ9Gxu4WVwUk8h0ERbY9Z4Kjk0P49p3IQFrWK19XmVXjA+b1RiqffhYzWJ6fH5TPYIt2LW5MRQmUA==} + engines: {node: '>=14'} dependencies: '@transmute/did-key-common': 0.3.0-unstable.10 '@transmute/secp256k1-key-pair': 0.7.0-unstable.81 @@ -3935,13 +6436,13 @@ packages: dev: true /@transmute/did-key-test-vectors@0.3.0-unstable.10: - resolution: { integrity: sha512-YVkhIJbis6j/zwIYVSKzBIPMhf0dLIcsM2CA2KcjbBOwPWOBMeRZES3uOQBIwn3tkTIRtlv+Mn+XsNHTl+J4Vg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVkhIJbis6j/zwIYVSKzBIPMhf0dLIcsM2CA2KcjbBOwPWOBMeRZES3uOQBIwn3tkTIRtlv+Mn+XsNHTl+J4Vg==} + engines: {node: '>=10'} dev: true /@transmute/did-key-web-crypto@0.3.0-unstable.10: - resolution: { integrity: sha512-eq0AEjQi2lFFC1K3Hl/3nTXoLKy07McEjkXGI2xz/GO9tJNvxEZPbmC/VuwLYf61Q/mgB09qNdY8ApEIpWk3mQ== } - engines: { node: '>=14' } + resolution: {integrity: sha512-eq0AEjQi2lFFC1K3Hl/3nTXoLKy07McEjkXGI2xz/GO9tJNvxEZPbmC/VuwLYf61Q/mgB09qNdY8ApEIpWk3mQ==} + engines: {node: '>=14'} dependencies: '@transmute/did-key-common': 0.3.0-unstable.10 '@transmute/web-crypto-key-pair': 0.7.0-unstable.81 @@ -3951,8 +6452,8 @@ packages: dev: true /@transmute/did-key-x25519@0.3.0-unstable.10: - resolution: { integrity: sha512-Jm5UxwI9EhlfVQ9D0Clj9RlMvhOi8nqAgQG30KMzjFMVGfWqIPwQNZFvmL+XsQ7g3dfTo5iQwXBY0de/f+RoMA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-Jm5UxwI9EhlfVQ9D0Clj9RlMvhOi8nqAgQG30KMzjFMVGfWqIPwQNZFvmL+XsQ7g3dfTo5iQwXBY0de/f+RoMA==} + engines: {node: '>=14'} dependencies: '@transmute/did-key-common': 0.3.0-unstable.10 '@transmute/x25519-key-pair': 0.7.0-unstable.81 @@ -3962,8 +6463,8 @@ packages: dev: true /@transmute/did-key.js@0.3.0-unstable.10: - resolution: { integrity: sha512-qvuZ7SdmEb0ZqRYs9R/NMUgTUwZDsUysW+EhtQ/P/dQw0CvRmvfWOmtz1UWGT6yZKl/IDba0KtKn/Yz0GaClsQ== } - engines: { node: '>=14' } + resolution: {integrity: sha512-qvuZ7SdmEb0ZqRYs9R/NMUgTUwZDsUysW+EhtQ/P/dQw0CvRmvfWOmtz1UWGT6yZKl/IDba0KtKn/Yz0GaClsQ==} + engines: {node: '>=14'} dependencies: '@transmute/did-key-bls12381': 0.3.0-unstable.10 '@transmute/did-key-ed25519': 0.3.0-unstable.10 @@ -3979,63 +6480,206 @@ packages: dev: true /@transmute/ed25519-key-pair@0.6.1-unstable.37: - resolution: { integrity: sha512-l34yzE/QnQwmdk5xY9g2kD55e4XPp/jTZQzPu7I6J4Ar+bMaL/0RLL/pgvwyI7qUpsddxRf4WPZCCcZveqPcdA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-l34yzE/QnQwmdk5xY9g2kD55e4XPp/jTZQzPu7I6J4Ar+bMaL/0RLL/pgvwyI7qUpsddxRf4WPZCCcZveqPcdA==} + engines: {node: '>=10'} dependencies: '@stablelib/ed25519': 1.0.3 '@transmute/ld-key-pair': 0.6.1-unstable.37 '@transmute/x25519-key-pair': 0.6.1-unstable.37 dev: true + /@transmute/ed25519-key-pair@0.7.0-unstable.2: + resolution: {integrity: sha512-B0jg348Z8F0+lGWQic28xVxBZiXOJYbisWp6EfP4fQdMV3G4sES9YubpdiuoZHjesDZrf6xZ7cEB81mjGJMUkA==} + engines: {node: '>=10'} + dependencies: + '@stablelib/ed25519': 1.0.3 + '@transmute/ld-key-pair': 0.7.0-unstable.81 + '@transmute/x25519-key-pair': 0.7.0-unstable.81 + dev: true + + /@transmute/ed25519-key-pair@0.7.0-unstable.82: + resolution: {integrity: sha512-ZPMlPXAzQ59ImUP5j0EPp05ZA7H3voM23+zWINZawd4tehTaUpyCXVBPyAyHscJ4isS/l+XZnnOnYcvl9+YrXg==} + engines: {node: '>=16'} + dependencies: + '@stablelib/ed25519': 1.0.3 + '@transmute/ld-key-pair': 0.7.0-unstable.82 + '@transmute/x25519-key-pair': 0.7.0-unstable.82 + dev: true + + /@transmute/ed25519-signature-2018@0.7.0-unstable.82: + resolution: {integrity: sha512-WvD+x7EpeacXEtOTmOQltSNdevwHJZ3Y53Yj8SZJ0CGzVKyqj3/F7wGvagbEUWxALe2rXrby5F6FPVS7mJwgCg==} + engines: {node: '>=16'} + dependencies: + '@transmute/credentials-context': 0.7.0-unstable.82 + '@transmute/ed25519-key-pair': 0.7.0-unstable.2 + '@transmute/jose-ld': 0.7.0-unstable.82 + '@transmute/jsonld': 0.0.4 + '@transmute/security-context': 0.7.0-unstable.82 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + + /@transmute/jose-ld@0.7.0-unstable.82: + resolution: {integrity: sha512-FBDbb0bGs7Ssd1H6NXEXqzfF2cnIGRW2ggR13MaTeQR51CEX2lfWlf2fdioOZa0Bk1GZlmUtyEvhPTEjp302WQ==} + engines: {node: '>=16'} + dependencies: + '@peculiar/webcrypto': 1.4.6 + '@stablelib/aes-kw': 1.0.1 + '@stablelib/xchacha20poly1305': 1.0.1 + base64url: 3.0.1 + jose: 4.15.9 + web-streams-polyfill: 3.3.3 + dev: true + + /@transmute/json-web-signature@0.7.0-unstable.82: + resolution: {integrity: sha512-Snku9yg5sN10zkSy678n7VnHZgd7s0EQmjRylhW+mg4n9aL1SXPSbmRx6wUXfdXe1RGY1oNfDd7R5WegZVg9ew==} + engines: {node: '>=16'} + dependencies: + '@transmute/ed25519-key-pair': 0.7.0-unstable.82 + '@transmute/jose-ld': 0.7.0-unstable.82 + '@transmute/jsonld': 0.0.4 + '@transmute/secp256k1-key-pair': 0.7.0-unstable.82 + '@transmute/security-context': 0.7.0-unstable.82 + '@transmute/web-crypto-key-pair': 0.7.0-unstable.82 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + + /@transmute/jsonld-schema@0.7.0-unstable.82: + resolution: {integrity: sha512-WrPwYXLNvb5o8xg9yTb8PBiMvX5tyLOGPYDOuX7mlr/2HmAJyyplxprJEKCixmb817O06keU5jrkCwiYaAcyfg==} + engines: {node: '>=16'} + dependencies: + '@transmute/jsonld': 0.0.4 + ajv: 8.12.0 + genson-js: 0.0.5 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + + /@transmute/jsonld@0.0.4: + resolution: {integrity: sha512-6G++8imMYW9dtTvATPHNfrV3lLeX5E57DOmlgIDfO0A0yjkBCss1usB80NfONS26ynyveb8vTbp4nQDW9Ki4Rw==} + engines: {node: '>=16'} + dependencies: + json-pointer: 0.6.2 + jsonld: 5.2.0 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + /@transmute/ld-key-pair@0.6.1-unstable.37: - resolution: { integrity: sha512-DcTpEruAQBfOd2laZkg3uCQ+67Y7dw2hsvo42NAQ5tItCIx5AClP7zccri7T2JUcfDUFaE32z/BLTMEKYt3XZQ== } + resolution: {integrity: sha512-DcTpEruAQBfOd2laZkg3uCQ+67Y7dw2hsvo42NAQ5tItCIx5AClP7zccri7T2JUcfDUFaE32z/BLTMEKYt3XZQ==} dev: true /@transmute/ld-key-pair@0.7.0-unstable.81: - resolution: { integrity: sha512-GNfUEkWWCUUikxvLUgQssVSDRCw8x8ktYZD27ssoDtB9gp0oqQ5a9DxAWv8onH126F3Z4KGSSegmGWjkvgdL9g== } - engines: { node: '>=16' } + resolution: {integrity: sha512-GNfUEkWWCUUikxvLUgQssVSDRCw8x8ktYZD27ssoDtB9gp0oqQ5a9DxAWv8onH126F3Z4KGSSegmGWjkvgdL9g==} + engines: {node: '>=16'} + dev: true + + /@transmute/ld-key-pair@0.7.0-unstable.82: + resolution: {integrity: sha512-XWnVNCL1LeohldBLu7O12tc53rzdCYjZiaMrWvEH/sNpqnZBiNWAsdLWengXhF67LqAXWMwstfbCLNTPCD+EGg==} + engines: {node: '>=16'} + dev: true + + /@transmute/linked-data-proof@0.7.0-unstable.82: + resolution: {integrity: sha512-ZJHxRmPhTmWOg71wz6Thg6o338J7h8SNZ+5m0ja5f9O22603zBcLbq7WcpHcs4GzXazPBTlsow2hl7C8u2JmJg==} + engines: {node: '>=16'} + dependencies: + '@transmute/did-key-ed25519': 0.3.0-unstable.10 + serialize-error: 7.0.1 + transitivePeerDependencies: + - encoding + - web-streams-polyfill dev: true /@transmute/secp256k1-key-pair@0.7.0-unstable.81: - resolution: { integrity: sha512-kofomMOOLkdTOAV2bQAEZAC0REuiI/RDqxYJJg/qpXnguyGTtv5DVHD8UXmUDKJLJkAql1lbksfs/roYYVBN7g== } - engines: { node: '>=16' } + resolution: {integrity: sha512-kofomMOOLkdTOAV2bQAEZAC0REuiI/RDqxYJJg/qpXnguyGTtv5DVHD8UXmUDKJLJkAql1lbksfs/roYYVBN7g==} + engines: {node: '>=16'} dependencies: '@bitauth/libauth': 1.19.1 '@transmute/ld-key-pair': 0.7.0-unstable.81 secp256k1: 4.0.3 dev: true + /@transmute/secp256k1-key-pair@0.7.0-unstable.82: + resolution: {integrity: sha512-X+txATKPpwodcr0B5TPvcsi2UnSrS3UFkrALa2ui0B1zNLj56pUVMJ0FdX9eHUKdP7t5tB9iE73Y7/8NWL6exA==} + engines: {node: '>=16'} + dependencies: + '@bitauth/libauth': 1.19.1 + '@transmute/ld-key-pair': 0.7.0-unstable.82 + secp256k1: 4.0.3 + dev: true + /@transmute/security-context@0.6.1-unstable.37: - resolution: { integrity: sha512-GtLmG65qlORrz/2S4I74DT+vA4+qXsFxrMr0cNOXjUqZBd/AW1PTrFnryLF9907BfoiD58HC9qb1WVGWjSlBYw== } + resolution: {integrity: sha512-GtLmG65qlORrz/2S4I74DT+vA4+qXsFxrMr0cNOXjUqZBd/AW1PTrFnryLF9907BfoiD58HC9qb1WVGWjSlBYw==} + dev: true + + /@transmute/security-context@0.7.0-unstable.82: + resolution: {integrity: sha512-Hih4A3iatK8daSREtuF/y9hGnrLZGRTfBYBUlUeaGEoCrcnhNcZrn8EQmW2dqj/7VZ2W5ResxQLPljA9pVJt5w==} + dev: true + + /@transmute/vc.js@0.7.0-unstable.82: + resolution: {integrity: sha512-P/QGvnybAhtz4jQiX38bPXquTE+mjxbXsE60cDn41TdijiUNK8Ge3c1jmLKFMqrwDRaK1aVqJWBxtMYvQ+0QMw==} + engines: {node: '>=16'} + dependencies: + '@transmute/did-key-ed25519': 0.3.0-unstable.10 + '@transmute/json-web-signature': 0.7.0-unstable.82 + '@transmute/jsonld': 0.0.4 + '@transmute/jsonld-schema': 0.7.0-unstable.82 + '@transmute/linked-data-proof': 0.7.0-unstable.82 + moment: 2.30.1 + transitivePeerDependencies: + - encoding + - web-streams-polyfill dev: true /@transmute/web-crypto-key-pair@0.7.0-unstable.81: - resolution: { integrity: sha512-oTHub0iFdwJdugQxohcuG1CZaxfuSUPisDkPsxaEHGEOU9+hBBym2Ugr3ZX9H+nT29UNXPlTKNKsSxV4UCtc5w== } - engines: { node: '>=16' } + resolution: {integrity: sha512-oTHub0iFdwJdugQxohcuG1CZaxfuSUPisDkPsxaEHGEOU9+hBBym2Ugr3ZX9H+nT29UNXPlTKNKsSxV4UCtc5w==} + engines: {node: '>=16'} dependencies: '@peculiar/webcrypto': 1.4.3 '@transmute/ld-key-pair': 0.7.0-unstable.81 big-integer: 1.6.51 dev: true + /@transmute/web-crypto-key-pair@0.7.0-unstable.82: + resolution: {integrity: sha512-xhaFpW/jcYgmOZanBVkm034YX728ukVVPO0Bb53d5IcL5MiMSWjPDQfhOyX8+EZfa7rSNDOAi6zCsZMggtB9fg==} + engines: {node: '>=16'} + dependencies: + '@peculiar/webcrypto': 1.4.6 + '@transmute/ld-key-pair': 0.7.0-unstable.82 + big-integer: 1.6.51 + dev: true + /@transmute/x25519-key-pair@0.6.1-unstable.37: - resolution: { integrity: sha512-j6zR9IoJmgVhUCVH8YVGpsgQf99SxPKZ00LGnUheBAQzgj2lULGBQ44G+GqBCdzfT0qweptTfp1RjqqHEpizeA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-j6zR9IoJmgVhUCVH8YVGpsgQf99SxPKZ00LGnUheBAQzgj2lULGBQ44G+GqBCdzfT0qweptTfp1RjqqHEpizeA==} + engines: {node: '>=10'} dependencies: '@stablelib/x25519': 1.0.3 '@transmute/ld-key-pair': 0.6.1-unstable.37 dev: true /@transmute/x25519-key-pair@0.7.0-unstable.81: - resolution: { integrity: sha512-cr/yjSP4ErZMKwoU/scqkfKL63AJupE27xakCHZVEfGzQChQH2RDXsNDGCXxsf2+DGfayGBhxayCXRdOcvvzng== } - engines: { node: '>=16' } + resolution: {integrity: sha512-cr/yjSP4ErZMKwoU/scqkfKL63AJupE27xakCHZVEfGzQChQH2RDXsNDGCXxsf2+DGfayGBhxayCXRdOcvvzng==} + engines: {node: '>=16'} dependencies: '@stablelib/x25519': 1.0.3 '@transmute/ld-key-pair': 0.7.0-unstable.81 dev: true + /@transmute/x25519-key-pair@0.7.0-unstable.82: + resolution: {integrity: sha512-y4lPzk/SY/Cy1dUCa17ES3kqvShNQwevTO16dvbuevu6YcTYBAdSCYvW9JL+ppFqPYI5NSDPUwT6kkd4wNWmsA==} + engines: {node: '>=16'} + dependencies: + '@stablelib/x25519': 1.0.3 + '@transmute/ld-key-pair': 0.7.0-unstable.82 + dev: true + /@trust/keyto@2.0.0-alpha1: - resolution: { integrity: sha512-VmlOa+nOaDzhEUfprnVp7RxFQyuEwA4fJ5+smnsud5WM01gU16yQnO/ejZnDVMGXuq/sUwTa5pCej4JhkKA5Sg== } + resolution: {integrity: sha512-VmlOa+nOaDzhEUfprnVp7RxFQyuEwA4fJ5+smnsud5WM01gU16yQnO/ejZnDVMGXuq/sUwTa5pCej4JhkKA5Sg==} dependencies: asn1.js: 5.4.1 base64url: 3.0.1 @@ -4043,36 +6687,36 @@ packages: dev: true /@tsconfig/node10@1.0.9: - resolution: { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true /@tsconfig/node12@1.0.11: - resolution: { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true /@tsconfig/node14@1.0.3: - resolution: { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true /@tsconfig/node16@1.0.4: - resolution: { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true /@tufjs/canonical-json@2.0.0: - resolution: { integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} dev: true /@tufjs/models@2.0.0: - resolution: { integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.3 + minimatch: 9.0.5 dev: true /@types/babel__core@7.20.2: - resolution: { integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== } + resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 @@ -4082,70 +6726,82 @@ packages: dev: true /@types/babel__generator@7.6.5: - resolution: { integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== } + resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} dependencies: '@babel/types': 7.23.0 dev: true /@types/babel__template@7.4.2: - resolution: { integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== } + resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} dependencies: '@babel/parser': 7.23.0 '@babel/types': 7.23.0 dev: true /@types/babel__traverse@7.20.2: - resolution: { integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== } + resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} dependencies: '@babel/types': 7.23.0 dev: true + /@types/bn.js@5.1.5: + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + dependencies: + '@types/node': 18.19.39 + dev: true + /@types/body-parser@1.19.3: - resolution: { integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== } + resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} dependencies: '@types/connect': 3.4.36 '@types/node': 18.19.39 dev: true /@types/connect@3.4.36: - resolution: { integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== } + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} dependencies: '@types/node': 18.19.39 dev: true /@types/cookie-parser@1.4.4: - resolution: { integrity: sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA== } + resolution: {integrity: sha512-Var+aj5I6ZgIqsQ05N2V8q5OBrFfZXtIGWWDSrEYLIbMw758obagSwdGcLCjwh1Ga7M7+wj0SDIAaAC/WT7aaA==} dependencies: '@types/express': 4.17.18 dev: true /@types/cors@2.8.14: - resolution: { integrity: sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== } + resolution: {integrity: sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==} dependencies: '@types/node': 18.19.39 dev: true /@types/debug@4.1.12: - resolution: { integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== } + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: '@types/ms': 0.7.32 dev: true /@types/dotenv-flow@3.3.1: - resolution: { integrity: sha512-z4W5zC6mx9j1OGV+cUDoyLqYkh09BCUq64+TPwnmWpqXQs39DpegWtFQBzvNDdjeXhzW9Xvuy+z1Fn2RSkfTfA== } + resolution: {integrity: sha512-z4W5zC6mx9j1OGV+cUDoyLqYkh09BCUq64+TPwnmWpqXQs39DpegWtFQBzvNDdjeXhzW9Xvuy+z1Fn2RSkfTfA==} + dev: true + + /@types/elliptic@6.4.18: + resolution: {integrity: sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw==} + dependencies: + '@types/bn.js': 5.1.5 dev: true /@types/express-serve-static-core@4.17.37: - resolution: { integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== } + resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} dependencies: '@types/node': 18.19.39 - '@types/qs': 6.9.8 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.5 '@types/send': 0.17.2 dev: true /@types/express@4.17.18: - resolution: { integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== } + resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} dependencies: '@types/body-parser': 1.19.3 '@types/express-serve-static-core': 4.17.37 @@ -4154,110 +6810,129 @@ packages: dev: true /@types/graceful-fs@4.1.7: - resolution: { integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== } + resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} dependencies: '@types/node': 18.19.39 dev: true /@types/http-errors@2.0.2: - resolution: { integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== } + resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} dev: true /@types/http-terminator@2.0.3: - resolution: { integrity: sha512-j9vuGii6wAV+xOUa655J8vjMbugoPSgMGTtgSNy3a4d/YClbW5goY/H9v78t9D9nyK8IRa563T6eJ9a2DdmDjQ== } + resolution: {integrity: sha512-j9vuGii6wAV+xOUa655J8vjMbugoPSgMGTtgSNy3a4d/YClbW5goY/H9v78t9D9nyK8IRa563T6eJ9a2DdmDjQ==} dependencies: '@types/node': 18.19.39 dev: true /@types/istanbul-lib-coverage@2.0.4: - resolution: { integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== } + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} /@types/istanbul-lib-report@3.0.1: - resolution: { integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== } + resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} dependencies: '@types/istanbul-lib-coverage': 2.0.4 /@types/istanbul-reports@3.0.2: - resolution: { integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== } + resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} dependencies: '@types/istanbul-lib-report': 3.0.1 /@types/jest@29.5.12: - resolution: { integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== } + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 dev: true /@types/jest@29.5.5: - resolution: { integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== } + resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 dev: true /@types/json-schema@7.0.13: - resolution: { integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== } + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true /@types/json5@0.0.29: - resolution: { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/jwt-decode@3.1.0: + resolution: {integrity: sha512-tthwik7TKkou3mVnBnvVuHnHElbjtdbM63pdBCbZTirCt3WAdM73Y79mOri7+ljsS99ZVwUFZHLMxJuJnv/z1w==} + deprecated: This is a stub types definition. jwt-decode provides its own type definitions, so you do not need this installed. + dependencies: + jwt-decode: 4.0.0 + dev: true + + /@types/language-tags@1.0.4: + resolution: {integrity: sha512-20PQbifv3v/djCT+KlXybv0KqO5ofoR1qD1wkinN59kfggTPVTWGmPFgL/1yWuDyRcsQP/POvkqK+fnl5nOwTg==} dev: true /@types/mime@1.3.3: - resolution: { integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== } + resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} dev: true /@types/mime@3.0.2: - resolution: { integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== } + resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} dev: true /@types/minimatch@3.0.5: - resolution: { integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== } + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} dev: true /@types/minimist@1.2.3: - resolution: { integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== } + resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} dev: true /@types/ms@0.7.32: - resolution: { integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== } + resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} + dev: true + + /@types/node@18.15.13: + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} dev: true /@types/node@18.18.0: - resolution: { integrity: sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw== } + resolution: {integrity: sha512-3xA4X31gHT1F1l38ATDIL9GpRLdwVhnEFC8Uikv5ZLlXATwrCYyPq7ZWHxzxc3J/30SUiwiYT+bQe0/XvKlWbw==} dev: true /@types/node@18.19.39: - resolution: { integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ== } + resolution: {integrity: sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==} dependencies: undici-types: 5.26.5 /@types/normalize-package-data@2.4.2: - resolution: { integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== } + resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} + dev: true + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} dev: true /@types/qs@6.9.8: - resolution: { integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== } + resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} dev: true /@types/range-parser@1.2.5: - resolution: { integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== } + resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} dev: true /@types/semver@7.5.3: - resolution: { integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== } + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} dev: true /@types/send@0.17.2: - resolution: { integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== } + resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} dependencies: '@types/mime': 1.3.3 '@types/node': 18.19.39 dev: true /@types/serve-static@1.15.3: - resolution: { integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== } + resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} dependencies: '@types/http-errors': 2.0.2 '@types/mime': 3.0.2 @@ -4265,43 +6940,43 @@ packages: dev: true /@types/sha.js@2.4.4: - resolution: { integrity: sha512-Qukd+D6S2Hm0wLVt2Vh+/eWBIoUt+wF8jWjBsG4F8EFQRwKtYvtXCPcNl2OEUQ1R+eTr3xuSaBYUyM3WD1x/Qw== } + resolution: {integrity: sha512-Qukd+D6S2Hm0wLVt2Vh+/eWBIoUt+wF8jWjBsG4F8EFQRwKtYvtXCPcNl2OEUQ1R+eTr3xuSaBYUyM3WD1x/Qw==} dependencies: '@types/node': 18.19.39 dev: true /@types/stack-utils@2.0.1: - resolution: { integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== } + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} /@types/uuid@9.0.4: - resolution: { integrity: sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA== } + resolution: {integrity: sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA==} dev: true /@types/uuid@9.0.8: - resolution: { integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== } + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} dev: true /@types/yargs-parser@21.0.1: - resolution: { integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== } + resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} /@types/yargs@15.0.16: - resolution: { integrity: sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg== } + resolution: {integrity: sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==} dependencies: '@types/yargs-parser': 21.0.1 /@types/yargs@16.0.6: - resolution: { integrity: sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== } + resolution: {integrity: sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==} dependencies: '@types/yargs-parser': 21.0.1 /@types/yargs@17.0.25: - resolution: { integrity: sha512-gy7iPgwnzNvxgAEi2bXOHWCVOG6f7xsprVJH4MjlAWeBmJ7vh/Y1kwMtUrs64ztf24zVIRCpr3n/z6gm9QIkgg== } + resolution: {integrity: sha512-gy7iPgwnzNvxgAEi2bXOHWCVOG6f7xsprVJH4MjlAWeBmJ7vh/Y1kwMtUrs64ztf24zVIRCpr3n/z6gm9QIkgg==} dependencies: '@types/yargs-parser': 21.0.1 /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.3): - resolution: { integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4328,8 +7003,8 @@ packages: dev: true /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3): - resolution: { integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' @@ -4348,16 +7023,16 @@ packages: dev: true /@typescript-eslint/scope-manager@5.62.0: - resolution: { integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 dev: true /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.3): - resolution: { integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' typescript: '*' @@ -4376,13 +7051,13 @@ packages: dev: true /@typescript-eslint/types@5.62.0: - resolution: { integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3): - resolution: { integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4402,8 +7077,8 @@ packages: dev: true /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.3): - resolution: { integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -4422,38 +7097,36 @@ packages: dev: true /@typescript-eslint/visitor-keys@5.62.0: - resolution: { integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 dev: true /@ungap/structured-clone@1.2.0: - resolution: { integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== } + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true /@unimodules/core@7.1.2: - resolution: { integrity: sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg== } - deprecated: "replaced by the 'expo' package, learn more: https://blog.expo.dev/whats-new-in-expo-modules-infrastructure-7a7cdda81ebc" + resolution: {integrity: sha512-lY+e2TAFuebD3vshHMIRqru3X4+k7Xkba4Wa7QsDBd+ex4c4N2dHAO61E2SrGD9+TRBD8w/o7mzK6ljbqRnbyg==} + deprecated: 'replaced by the ''expo'' package, learn more: https://blog.expo.dev/whats-new-in-expo-modules-infrastructure-7a7cdda81ebc' requiresBuild: true dependencies: compare-versions: 3.6.0 - dev: false optional: true /@unimodules/react-native-adapter@6.3.9: - resolution: { integrity: sha512-i9/9Si4AQ8awls+YGAKkByFbeAsOPgUNeLoYeh2SQ3ddjxJ5ZJDtq/I74clDnpDcn8zS9pYlcDJ9fgVJa39Glw== } - deprecated: "replaced by the 'expo' package, learn more: https://blog.expo.dev/whats-new-in-expo-modules-infrastructure-7a7cdda81ebc" + resolution: {integrity: sha512-i9/9Si4AQ8awls+YGAKkByFbeAsOPgUNeLoYeh2SQ3ddjxJ5ZJDtq/I74clDnpDcn8zS9pYlcDJ9fgVJa39Glw==} + deprecated: 'replaced by the ''expo'' package, learn more: https://blog.expo.dev/whats-new-in-expo-modules-infrastructure-7a7cdda81ebc' requiresBuild: true dependencies: expo-modules-autolinking: 0.0.3 invariant: 2.2.4 - dev: false optional: true /@urql/core@2.3.6(graphql@15.8.0): - resolution: { integrity: sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw== } + resolution: {integrity: sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==} peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: @@ -4462,7 +7135,7 @@ packages: wonka: 4.0.15 /@urql/exchange-retry@0.3.0(graphql@15.8.0): - resolution: { integrity: sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg== } + resolution: {integrity: sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==} peerDependencies: graphql: ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 dependencies: @@ -4471,7 +7144,7 @@ packages: wonka: 4.0.15 /@veramo/core@4.2.0: - resolution: { integrity: sha512-HIqbXfCbwOAJelR5Ohsm22vr63cy6ND8Ua/+9wfMDAiymUUS7NryaJ/v6NRtnmIrNZqUMDdR9/TWdp4cCq5eBg== } + resolution: {integrity: sha512-HIqbXfCbwOAJelR5Ohsm22vr63cy6ND8Ua/+9wfMDAiymUUS7NryaJ/v6NRtnmIrNZqUMDdR9/TWdp4cCq5eBg==} dependencies: credential-status: 2.0.6 debug: 4.3.5 @@ -4484,40 +7157,40 @@ packages: dev: true /@xmldom/xmldom@0.7.13: - resolution: { integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} + engines: {node: '>=10.0.0'} /@xmldom/xmldom@0.8.10: - resolution: { integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + engines: {node: '>=10.0.0'} /@yarnpkg/lockfile@1.1.0: - resolution: { integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== } + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} dev: true /@yarnpkg/parsers@3.0.0-rc.46: - resolution: { integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== } - engines: { node: '>=14.15.0' } + resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} + engines: {node: '>=14.15.0'} dependencies: js-yaml: 3.14.1 tslib: 2.6.2 dev: true /@zkochan/js-yaml@0.0.6: - resolution: { integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== } + resolution: {integrity: sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==} hasBin: true dependencies: argparse: 2.0.1 dev: true /@zxing/text-encoding@0.9.0: - resolution: { integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== } + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} requiresBuild: true dev: true optional: true /JSONStream@1.3.5: - resolution: { integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== } + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true dependencies: jsonparse: 1.3.1 @@ -4525,31 +7198,31 @@ packages: dev: true /abbrev@1.1.1: - resolution: { integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== } + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} /abbrev@2.0.0: - resolution: { integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /abort-controller@3.0.0: - resolution: { integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== } - engines: { node: '>=6.5' } + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} dependencies: event-target-shim: 5.0.1 /absolute-path@0.0.0: - resolution: { integrity: sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== } + resolution: {integrity: sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA==} /accepts@1.3.8: - resolution: { integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} dependencies: mime-types: 2.1.35 negotiator: 0.6.3 /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: @@ -4557,30 +7230,38 @@ packages: dev: true /acorn-walk@8.2.0: - resolution: { integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} dev: true /acorn@8.10.0: - resolution: { integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} hasBin: true /add-stream@1.0.0: - resolution: { integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== } + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true + + /aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} dev: true /agent-base@6.0.2: - resolution: { integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== } - engines: { node: '>= 6.0.0' } + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} dependencies: debug: 4.3.5 transitivePeerDependencies: - supports-color /agent-base@7.1.1: - resolution: { integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} dependencies: debug: 4.3.5 transitivePeerDependencies: @@ -4588,21 +7269,21 @@ packages: dev: true /agentkeepalive@4.5.0: - resolution: { integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} dependencies: humanize-ms: 1.2.1 dev: true /aggregate-error@3.1.0: - resolution: { integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 /ajv-formats@2.1.1(ajv@8.12.0): - resolution: { integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== } + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -4610,10 +7291,9 @@ packages: optional: true dependencies: ajv: 8.12.0 - dev: false /ajv@6.12.6: - resolution: { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -4622,154 +7302,160 @@ packages: dev: true /ajv@8.12.0: - resolution: { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== } + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false /anser@1.4.10: - resolution: { integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== } + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} /ansi-colors@4.1.3: - resolution: { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} dev: true /ansi-escapes@4.3.2: - resolution: { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.21.3 /ansi-fragments@0.2.1: - resolution: { integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== } + resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} dependencies: colorette: 1.4.0 slice-ansi: 2.1.0 strip-ansi: 5.2.0 /ansi-regex@4.1.1: - resolution: { integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== } - engines: { node: '>=6' } + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} /ansi-regex@5.0.1: - resolution: { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} /ansi-regex@6.0.1: - resolution: { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} dev: true /ansi-styles@3.2.1: - resolution: { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 /ansi-styles@4.3.0: - resolution: { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 /ansi-styles@5.2.0: - resolution: { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} /ansi-styles@6.2.1: - resolution: { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } - engines: { node: '>=12' } + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} dev: true /any-promise@1.3.0: - resolution: { integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} /anymatch@3.1.3: - resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 /appdirsjs@1.2.7: - resolution: { integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== } + resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} /application-config-path@0.1.1: - resolution: { integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw== } + resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} /aproba@2.0.0: - resolution: { integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== } + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} /are-we-there-yet@2.0.0: - resolution: { integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} requiresBuild: true dependencies: delegates: 1.0.0 readable-stream: 3.6.2 /arg@4.1.0: - resolution: { integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== } + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} /arg@4.1.3: - resolution: { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true /argparse@1.0.10: - resolution: { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 /argparse@2.0.1: - resolution: { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} /argv@0.0.2: - resolution: { integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw== } - engines: { node: '>=0.6.10' } + resolution: {integrity: sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==} + engines: {node: '>=0.6.10'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: true /array-back@3.1.0: - resolution: { integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== } - engines: { node: '>=6' } + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} requiresBuild: true dev: true optional: true /array-back@4.0.2: - resolution: { integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} requiresBuild: true dev: true optional: true /array-buffer-byte-length@1.0.0: - resolution: { integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== } + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: false /array-differ@3.0.0: - resolution: { integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} dev: true /array-flatten@1.1.1: - resolution: { integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== } + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false /array-ify@1.0.0: - resolution: { integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true /array-includes@3.1.7: - resolution: { integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -4778,13 +7464,17 @@ packages: is-string: 1.0.7 dev: true + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: true + /array-union@2.1.0: - resolution: { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} /array.prototype.findlastindex@1.2.3: - resolution: { integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -4794,8 +7484,8 @@ packages: dev: true /array.prototype.flat@1.3.2: - resolution: { integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -4804,8 +7494,8 @@ packages: dev: true /array.prototype.flatmap@1.3.2: - resolution: { integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -4814,8 +7504,8 @@ packages: dev: true /arraybuffer.prototype.slice@1.0.2: - resolution: { integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -4824,31 +7514,43 @@ packages: get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: false /arrify@1.0.1: - resolution: { integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} dev: true /arrify@2.0.1: - resolution: { integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== } - engines: { node: '>=8' } + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} dev: true /asap@2.0.6: - resolution: { integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== } + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} /asmcrypto.js@0.22.0: - resolution: { integrity: sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA== } - dev: false + resolution: {integrity: sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==} /asmcrypto.js@2.3.2: - resolution: { integrity: sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA== } + resolution: {integrity: sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA==} dev: true /asn1.js@5.4.1: - resolution: { integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== } + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} dependencies: bn.js: 4.12.0 inherits: 2.0.4 @@ -4857,47 +7559,53 @@ packages: dev: true /asn1js@3.0.5: - resolution: { integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + engines: {node: '>=12.0.0'} dependencies: pvtsutils: 1.3.5 pvutils: 1.1.3 tslib: 2.6.2 /ast-types@0.15.2: - resolution: { integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} + engines: {node: '>=4'} dependencies: tslib: 2.6.2 /astral-regex@1.0.0: - resolution: { integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} + engines: {node: '>=4'} /async-limiter@1.0.1: - resolution: { integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== } + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} /async@3.2.4: - resolution: { integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== } + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} /asynckit@0.4.0: - resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} /at-least-node@1.0.0: - resolution: { integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} /available-typed-arrays@1.0.5: - resolution: { integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== } - engines: { node: '>= 0.4' } - dev: true + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: false /await-lock@2.2.2: - resolution: { integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw== } + resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} dev: false /awesome-qr@2.1.5-rc.0: - resolution: { integrity: sha512-nRxvKuJxoxdOIStb79bElh52YPI+Cbu/UewgLjVSpXJvxwIZQjcvZgrCjXPe3jSl2i6mz3foxA6xgzLf8NQy+Q== } + resolution: {integrity: sha512-nRxvKuJxoxdOIStb79bElh52YPI+Cbu/UewgLjVSpXJvxwIZQjcvZgrCjXPe3jSl2i6mz3foxA6xgzLf8NQy+Q==} dependencies: buffer: 6.0.3 canvas: 2.11.2 @@ -4908,7 +7616,7 @@ packages: dev: false /axios@1.6.8: - resolution: { integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== } + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} dependencies: follow-redirects: 1.15.6 form-data: 4.0.0 @@ -4918,33 +7626,33 @@ packages: dev: true /b64-lite@1.4.0: - resolution: { integrity: sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w== } + resolution: {integrity: sha512-aHe97M7DXt+dkpa8fHlCcm1CnskAHrJqEfMI0KN7dwqlzml/aUe1AGt6lk51HzrSfVD67xOso84sOpr+0wIe2w==} dependencies: base-64: 0.1.0 /b64u-lite@1.1.0: - resolution: { integrity: sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A== } + resolution: {integrity: sha512-929qWGDVCRph7gQVTC6koHqQIpF4vtVaSbwLltFQo44B1bYUquALswZdBKFfrJCPEnsCOvWkJsPdQYZ/Ukhw8A==} dependencies: b64-lite: 1.4.0 - /babel-core@7.0.0-bridge.0(@babel/core@7.23.0): - resolution: { integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== } + /babel-core@7.0.0-bridge.0(@babel/core@7.24.7): + resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 - /babel-jest@29.7.0(@babel/core@7.23.0): - resolution: { integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + /babel-jest@29.7.0(@babel/core@7.24.7): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.2 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.0) + babel-preset-jest: 29.6.3(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -4953,8 +7661,8 @@ packages: dev: true /babel-plugin-istanbul@6.1.1: - resolution: { integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -4966,8 +7674,8 @@ packages: dev: true /babel-plugin-jest-hoist@29.6.3: - resolution: { integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.0 @@ -4976,8 +7684,8 @@ packages: dev: true /babel-plugin-module-resolver@4.1.0: - resolution: { integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA== } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==} + engines: {node: '>= 8.0.0'} dependencies: find-babel-config: 1.2.0 glob: 7.2.3 @@ -4986,7 +7694,7 @@ packages: resolve: 1.22.6 /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.23.0): - resolution: { integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== } + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -4997,8 +7705,20 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.24.7): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.24.7) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.23.0): - resolution: { integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== } + resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -5008,8 +7728,19 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-corejs3@0.8.4(@babel/core@7.24.7): + resolution: {integrity: sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.24.7) + core-js-compat: 3.32.2 + transitivePeerDependencies: + - supports-color + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.23.0): - resolution: { integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== } + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: @@ -5018,34 +7749,44 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.24.7): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + /babel-plugin-react-native-web@0.18.12: - resolution: { integrity: sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw== } + resolution: {integrity: sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==} /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: - resolution: { integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== } + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): - resolution: { integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== } + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) dev: true /babel-preset-expo@9.3.2(@babel/core@7.23.0): - resolution: { integrity: sha512-BjyvjwjJG0MaaDBLP/esbXRrAItM76po9L9zfnLxeqgFsHCIPmD+6ir45coDLGAXwR8m9It3G1yqYM9JPyemsQ== } + resolution: {integrity: sha512-BjyvjwjJG0MaaDBLP/esbXRrAItM76po9L9zfnLxeqgFsHCIPmD+6ir45coDLGAXwR8m9It3G1yqYM9JPyemsQ==} dependencies: '@babel/plugin-proposal-decorators': 7.23.0(@babel/core@7.23.0) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.23.0) @@ -5059,7 +7800,7 @@ packages: - supports-color /babel-preset-fbjs@3.4.0(@babel/core@7.23.0): - resolution: { integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== } + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -5092,74 +7833,118 @@ packages: '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.23.0) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 - /babel-preset-jest@29.6.3(@babel/core@7.23.0): - resolution: { integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + /babel-preset-fbjs@3.4.0(@babel/core@7.24.7): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-for-of': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.24.7) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + + /babel-preset-jest@29.6.3(@babel/core@7.24.7): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) dev: true /balanced-match@1.0.2: - resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} /base-64@0.1.0: - resolution: { integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== } + resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} /base-x@3.0.9: - resolution: { integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== } + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} dependencies: safe-buffer: 5.2.1 dev: true /base-x@4.0.0: - resolution: { integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== } - dev: false + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} /base64-js@1.5.1: - resolution: { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} /base64url-universal@1.1.0: - resolution: { integrity: sha512-WyftvZqye29YQ10ZnuiBeEj0lk8SN8xHU9hOznkLc85wS1cLTp6RpzlMrHxMPD9nH7S55gsBqMqgGyz93rqmkA== } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-WyftvZqye29YQ10ZnuiBeEj0lk8SN8xHU9hOznkLc85wS1cLTp6RpzlMrHxMPD9nH7S55gsBqMqgGyz93rqmkA==} + engines: {node: '>=8.3.0'} dependencies: base64url: 3.0.1 + /base64url-universal@2.0.0: + resolution: {integrity: sha512-6Hpg7EBf3t148C3+fMzjf+CHnADVDafWzlJUXAqqqbm4MKNXbsoPdOkWeRTjNlkYG7TpyjIpRO1Gk0SnsFD1rw==} + engines: {node: '>=14'} + dependencies: + base64url: 3.0.1 + dev: true + /base64url@3.0.1: - resolution: { integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} + engines: {node: '>=6.0.0'} /basic-auth@2.0.1: - resolution: { integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} dependencies: safe-buffer: 5.1.2 dev: false + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true + /bech32@2.0.0: - resolution: { integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== } + resolution: {integrity: sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==} dev: true /before-after-hook@2.2.3: - resolution: { integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== } + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: true /better-opn@3.0.2: - resolution: { integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} + engines: {node: '>=12.0.0'} dependencies: open: 8.4.2 /big-integer@1.6.51: - resolution: { integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} /bin-links@4.0.4: - resolution: { integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: cmd-shim: 6.0.3 npm-normalize-package-bin: 3.0.1 @@ -5168,22 +7953,26 @@ packages: dev: true /bl@4.1.0: - resolution: { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 /blueimp-md5@2.19.0: - resolution: { integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w== } + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} /bn.js@4.12.0: - resolution: { integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== } + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} dev: true /body-parser@1.20.2: - resolution: { integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== } - engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -5201,57 +7990,57 @@ packages: - supports-color /boolean@3.2.0: - resolution: { integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== } + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: false /bplist-creator@0.1.0: - resolution: { integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== } + resolution: {integrity: sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==} dependencies: stream-buffers: 2.2.0 /bplist-parser@0.2.0: - resolution: { integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== } - engines: { node: '>= 5.10.0' } + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} dependencies: big-integer: 1.6.51 dev: true /bplist-parser@0.3.1: - resolution: { integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== } - engines: { node: '>= 5.10.0' } + resolution: {integrity: sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==} + engines: {node: '>= 5.10.0'} dependencies: big-integer: 1.6.51 /bplist-parser@0.3.2: - resolution: { integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== } - engines: { node: '>= 5.10.0' } + resolution: {integrity: sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==} + engines: {node: '>= 5.10.0'} dependencies: big-integer: 1.6.51 /brace-expansion@1.1.11: - resolution: { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 /brace-expansion@2.0.1: - resolution: { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 /braces@3.0.2: - resolution: { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 /brorand@1.1.0: - resolution: { integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== } + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} dev: true /browserslist@4.22.0: - resolution: { integrity: sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA== } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: caniuse-lite: 1.0.30001540 @@ -5259,78 +8048,101 @@ packages: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.0) + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001641 + electron-to-chromium: 1.4.825 + node-releases: 2.0.14 + update-browserslist-db: 1.1.0(browserslist@4.23.2) + /bs-logger@0.2.6: - resolution: { integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 dev: true /bs58@4.0.1: - resolution: { integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== } + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: base-x: 3.0.9 dev: true + /bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + dependencies: + base-x: 4.0.0 + dev: true + /bser@2.1.1: - resolution: { integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== } + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 /buffer-alloc-unsafe@1.1.0: - resolution: { integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== } + resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} /buffer-alloc@1.2.0: - resolution: { integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== } + resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} dependencies: buffer-alloc-unsafe: 1.1.0 buffer-fill: 1.0.0 /buffer-fill@1.0.0: - resolution: { integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== } + resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} /buffer-from@1.1.2: - resolution: { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} /buffer@5.7.1: - resolution: { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 /buffer@6.0.3: - resolution: { integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== } + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: false /builtins@1.0.3: - resolution: { integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ== } + resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} /bundle-name@3.0.0: - resolution: { integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} dependencies: run-applescript: 5.0.0 dev: true + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: true + /byte-size@8.1.1: - resolution: { integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== } - engines: { node: '>=12.17' } + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} dev: true /bytes@3.0.0: - resolution: { integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} /bytes@3.1.2: - resolution: { integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} /cacache@15.3.0: - resolution: { integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} dependencies: '@npmcli/fs': 1.1.1 '@npmcli/move-file': 1.1.2 @@ -5354,13 +8166,13 @@ packages: - bluebird /cacache@18.0.2: - resolution: { integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 glob: 10.3.10 - lru-cache: 10.0.1 + lru-cache: 10.3.1 minipass: 7.0.3 minipass-collect: 2.0.1 minipass-flush: 1.0.5 @@ -5372,8 +8184,8 @@ packages: dev: true /cacache@18.0.3: - resolution: { integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/fs': 3.1.1 fs-minipass: 3.0.3 @@ -5390,35 +8202,46 @@ packages: dev: true /call-bind@1.0.2: - resolution: { integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== } + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: false + /caller-callsite@2.0.0: - resolution: { integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} dependencies: callsites: 2.0.0 /caller-path@2.0.0: - resolution: { integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== } - engines: { node: '>=4' } + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} dependencies: caller-callsite: 2.0.0 /callsites@2.0.0: - resolution: { integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} /callsites@3.1.0: - resolution: { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} dev: true /camelcase-keys@6.2.2: - resolution: { integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} dependencies: camelcase: 5.3.1 map-obj: 4.3.0 @@ -5426,8 +8249,8 @@ packages: dev: true /camelcase-keys@8.0.2: - resolution: { integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==} + engines: {node: '>=14.16'} dependencies: camelcase: 7.0.1 map-obj: 4.3.0 @@ -5436,31 +8259,34 @@ packages: dev: true /camelcase@5.3.1: - resolution: { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} /camelcase@6.3.0: - resolution: { integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} /camelcase@7.0.1: - resolution: { integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} dev: true /caniuse-lite@1.0.30001540: - resolution: { integrity: sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw== } + resolution: {integrity: sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw==} + + /caniuse-lite@1.0.30001641: + resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==} /canonicalize@1.0.8: - resolution: { integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A== } + resolution: {integrity: sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==} /canonicalize@2.0.0: - resolution: { integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== } + resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==} dev: true /canvas@2.11.2: - resolution: { integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} + engines: {node: '>=6'} requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -5472,7 +8298,7 @@ packages: dev: false /casbin@5.27.1: - resolution: { integrity: sha512-nAbUyMfeVasZDZ39/OX+Y8AzpiAGvhYI58l/3BKuDZSnqC+Rpja/DmcHPt0wcUgJxfMkG/yo0dCmMhnSXZq49A== } + resolution: {integrity: sha512-nAbUyMfeVasZDZ39/OX+Y8AzpiAGvhYI58l/3BKuDZSnqC+Rpja/DmcHPt0wcUgJxfMkG/yo0dCmMhnSXZq49A==} dependencies: await-lock: 2.2.2 buffer: 6.0.3 @@ -5482,86 +8308,94 @@ packages: dev: false /chalk@2.4.2: - resolution: { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 /chalk@4.1.0: - resolution: { integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== } - engines: { node: '>=10' } + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 dev: true /chalk@4.1.2: - resolution: { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 /char-regex@1.0.2: - resolution: { integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} dev: true /chardet@0.7.0: - resolution: { integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== } + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true /charenc@0.0.2: - resolution: { integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== } + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} /chownr@2.0.0: - resolution: { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} /ci-info@2.0.0: - resolution: { integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== } + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} /ci-info@3.8.0: - resolution: { integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} /ci-info@4.0.0: - resolution: { integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} dev: true /cipher-base@1.0.4: - resolution: { integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== } + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 dev: true /cjs-module-lexer@1.2.3: - resolution: { integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== } + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} dev: true /clean-stack@2.2.0: - resolution: { integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== } - engines: { node: '>=6' } + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + /clear-module@4.1.2: + resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} + engines: {node: '>=8'} + dependencies: + parent-module: 2.0.0 + resolve-from: 5.0.0 + dev: true /cli-cursor@2.1.0: - resolution: { integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} dependencies: restore-cursor: 2.0.0 /cli-cursor@3.1.0: - resolution: { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 /cli-highlight@2.1.11: - resolution: { integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== } - engines: { node: '>=8.0.0', npm: '>=5.0.0' } + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true dependencies: chalk: 4.1.2 @@ -5573,28 +8407,28 @@ packages: dev: true /cli-spinners@2.6.1: - resolution: { integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== } - engines: { node: '>=6' } + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} dev: true /cli-spinners@2.9.1: - resolution: { integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} /cli-width@3.0.0: - resolution: { integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} dev: true /cliui@6.0.0: - resolution: { integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== } + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 /cliui@7.0.4: - resolution: { integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -5602,42 +8436,42 @@ packages: dev: true /cliui@8.0.1: - resolution: { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 /clone-deep@4.0.1: - resolution: { integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} dependencies: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 /clone@1.0.4: - resolution: { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} /clone@2.1.2: - resolution: { integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} /cmd-shim@6.0.3: - resolution: { integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /co@4.6.0: - resolution: { integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true /codecov@3.8.3: - resolution: { integrity: sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-Y8Hw+V3HgR7V71xWH2vQ9lyS358CbGCldWlJFR0JirqoGtOoas3R3/OclRTvgUYFK29mmJICDPauVKmpqbwhOA==} + engines: {node: '>=4.0'} deprecated: https://about.codecov.io/blog/codecov-uploader-deprecation-plan/ hasBin: true dependencies: @@ -5652,53 +8486,53 @@ packages: dev: true /collect-v8-coverage@1.0.2: - resolution: { integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== } + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} dev: true /color-convert@1.9.3: - resolution: { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 /color-convert@2.0.1: - resolution: { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 /color-name@1.1.3: - resolution: { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} /color-name@1.1.4: - resolution: { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} /color-support@1.1.3: - resolution: { integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== } + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true /colorette@1.4.0: - resolution: { integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== } + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} /columnify@1.6.0: - resolution: { integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} dependencies: strip-ansi: 6.0.1 wcwidth: 1.0.1 dev: true /combined-stream@1.0.8: - resolution: { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 /command-exists@1.2.9: - resolution: { integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== } + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} /command-line-args@5.2.1: - resolution: { integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} requiresBuild: true dependencies: array-back: 3.1.0 @@ -5709,8 +8543,8 @@ packages: optional: true /command-line-commands@3.0.2: - resolution: { integrity: sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw==} + engines: {node: '>=8'} requiresBuild: true dependencies: array-back: 4.0.2 @@ -5718,8 +8552,8 @@ packages: optional: true /command-line-usage@6.1.3: - resolution: { integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} requiresBuild: true dependencies: array-back: 4.0.2 @@ -5729,57 +8563,78 @@ packages: dev: true optional: true + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + /commander@2.13.0: - resolution: { integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== } + resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} /commander@2.20.3: - resolution: { integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} /commander@4.1.1: - resolution: { integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} /commander@7.2.0: - resolution: { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} /commander@9.5.0: - resolution: { integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== } - engines: { node: ^12.20.0 || >=14 } + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + /comment-json@4.2.4: + resolution: {integrity: sha512-E5AjpSW+O+N5T2GsOQMHLLsJvrYw6G/AFt9GvU6NguEAfzKShh7hRiLtVo6S9KbRpFMGqE5ojo0/hE+sdteWvQ==} + engines: {node: '>= 6'} + dependencies: + array-timsort: 1.0.3 + core-util-is: 1.0.3 + esprima: 4.0.1 + has-own-prop: 2.0.0 + repeat-string: 1.6.1 + dev: true /common-ancestor-path@1.0.1: - resolution: { integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== } + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} dev: true /commondir@1.0.1: - resolution: { integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} /compare-func@2.0.0: - resolution: { integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 dev: true /compare-versions@3.6.0: - resolution: { integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== } + resolution: {integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==} /component-emitter@1.3.0: - resolution: { integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== } + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: true /component-type@1.2.1: - resolution: { integrity: sha512-Kgy+2+Uwr75vAi6ChWXgHuLvd+QLD7ssgpaRq2zCvt80ptvAfMc/hijcJxXkBa2wMlEZcJvC2H8Ubo+A9ATHIg== } + resolution: {integrity: sha512-Kgy+2+Uwr75vAi6ChWXgHuLvd+QLD7ssgpaRq2zCvt80ptvAfMc/hijcJxXkBa2wMlEZcJvC2H8Ubo+A9ATHIg==} /compressible@2.0.18: - resolution: { integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 /compression@1.7.4: - resolution: { integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} dependencies: accepts: 1.3.8 bytes: 3.0.0 @@ -5792,11 +8647,11 @@ packages: - supports-color /concat-map@0.0.1: - resolution: { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /concat-stream@2.0.0: - resolution: { integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== } - engines: { '0': node >= 6.0 } + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} dependencies: buffer-from: 1.1.2 inherits: 2.0.4 @@ -5804,9 +8659,21 @@ packages: typedarray: 0.0.6 dev: true + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: true + /connect@3.7.0: - resolution: { integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} dependencies: debug: 2.6.9 finalhandler: 1.1.2 @@ -5816,29 +8683,29 @@ packages: - supports-color /console-control-strings@1.1.0: - resolution: { integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== } + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} /content-disposition@0.5.4: - resolution: { integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: false /content-type@1.0.5: - resolution: { integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} /conventional-changelog-angular@7.0.0: - resolution: { integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} dependencies: compare-func: 2.0.0 dev: true /conventional-changelog-core@5.0.1: - resolution: { integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== } - engines: { node: '>=14' } + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} dependencies: add-stream: 1.0.0 conventional-changelog-writer: 6.0.1 @@ -5854,13 +8721,13 @@ packages: dev: true /conventional-changelog-preset-loader@3.0.0: - resolution: { integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} dev: true /conventional-changelog-writer@6.0.1: - resolution: { integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== } - engines: { node: '>=14' } + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} hasBin: true dependencies: conventional-commits-filter: 3.0.0 @@ -5873,16 +8740,16 @@ packages: dev: true /conventional-commits-filter@3.0.0: - resolution: { integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== } - engines: { node: '>=14' } + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 dev: true /conventional-commits-parser@4.0.0: - resolution: { integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} hasBin: true dependencies: JSONStream: 1.3.5 @@ -5892,8 +8759,8 @@ packages: dev: true /conventional-recommended-bump@7.0.1: - resolution: { integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} hasBin: true dependencies: concat-stream: 2.0.0 @@ -5906,23 +8773,23 @@ packages: dev: true /convert-source-map@1.9.0: - resolution: { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== } + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true /convert-source-map@2.0.0: - resolution: { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} /cookie-parser@1.4.6: - resolution: { integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==} + engines: {node: '>= 0.8.0'} dependencies: cookie: 0.4.1 cookie-signature: 1.0.6 dev: false /cookie-session@2.0.0: - resolution: { integrity: sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg== } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==} + engines: {node: '>= 0.10'} dependencies: cookies: 0.8.0 debug: 3.2.7 @@ -5933,64 +8800,74 @@ packages: dev: false /cookie-signature@1.0.6: - resolution: { integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== } + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false /cookie@0.4.1: - resolution: { integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==} + engines: {node: '>= 0.6'} dev: false /cookie@0.4.2: - resolution: { integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} dev: false /cookie@0.6.0: - resolution: { integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} dev: false /cookiejar@2.1.4: - resolution: { integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== } + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} dev: true /cookies@0.8.0: - resolution: { integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 keygrip: 1.1.0 dev: false /core-js-compat@3.32.2: - resolution: { integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== } + resolution: {integrity: sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==} dependencies: browserslist: 4.22.0 /core-util-is@1.0.3: - resolution: { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} /cors@2.8.5: - resolution: { integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} dependencies: object-assign: 4.1.1 vary: 1.1.2 dev: false /cosmiconfig@5.2.1: - resolution: { integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} dependencies: import-fresh: 2.0.0 is-directory: 0.3.1 js-yaml: 3.14.1 parse-json: 4.0.0 + /cosmiconfig@8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + /cosmiconfig@8.3.6(typescript@5.5.3): - resolution: { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -6005,7 +8882,7 @@ packages: dev: true /create-hash@1.2.0: - resolution: { integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== } + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} dependencies: cipher-base: 1.0.4 inherits: 2.0.4 @@ -6015,8 +8892,8 @@ packages: dev: true /create-jest@29.7.0(@types/node@18.18.0): - resolution: { integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true dependencies: '@jest/types': 29.6.3 @@ -6034,8 +8911,8 @@ packages: dev: true /create-jest@29.7.0(@types/node@18.19.39)(ts-node@10.9.2): - resolution: { integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true dependencies: '@jest/types': 29.6.3 @@ -6053,30 +8930,37 @@ packages: dev: true /create-require@1.1.1: - resolution: { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true /credential-status@2.0.6: - resolution: { integrity: sha512-l5ZwSbX/UXFJ3DQ3dFt4rc2BtfUu/rhlkefR7BL9EZsKPyCe21okJA9mDy4h/nXvMEwpYjSQEa5vzR7KZqhI9g== } + resolution: {integrity: sha512-l5ZwSbX/UXFJ3DQ3dFt4rc2BtfUu/rhlkefR7BL9EZsKPyCe21okJA9mDy4h/nXvMEwpYjSQEa5vzR7KZqhI9g==} dependencies: did-jwt: 6.11.6 did-resolver: 4.1.0 dev: true /credentials-context@2.0.0: - resolution: { integrity: sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ== } - dev: false + resolution: {integrity: sha512-/mFKax6FK26KjgV2KW2D4YqKgoJ5DVJpNt87X2Jc9IxT2HBMy7nEIlc+n7pEi+YFFe721XqrvZPd+jbyyBjsvQ==} /cross-fetch@3.1.8: - resolution: { integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== } + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} dependencies: node-fetch: 2.6.12 transitivePeerDependencies: - encoding + dev: false /cross-spawn@6.0.5: - resolution: { integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== } - engines: { node: '>=4.8' } + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} dependencies: nice-try: 1.0.5 path-key: 2.0.1 @@ -6085,67 +8969,205 @@ packages: which: 1.3.1 /cross-spawn@7.0.3: - resolution: { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 /crypt@0.0.2: - resolution: { integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== } + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} /crypto-ld@6.0.0: - resolution: { integrity: sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA== } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-XWL1LslqggNoaCI/m3I7HcvaSt9b2tYzdrXO+jHLUj9G1BvRfvV7ZTFDVY5nifYuIGAPdAGu7unPxLRustw3VA==} + engines: {node: '>=8.3.0'} /crypto-ld@7.0.0: - resolution: { integrity: sha512-RrXy6aB0TOhSiqsgavTQt1G8mKomKIaNLb2JZxj7A/Vi0EwmXguuBQoeiAvePfK6bDR3uQbqYnaLLs4irTWwgw== } - engines: { node: '>=14' } + resolution: {integrity: sha512-RrXy6aB0TOhSiqsgavTQt1G8mKomKIaNLb2JZxj7A/Vi0EwmXguuBQoeiAvePfK6bDR3uQbqYnaLLs4irTWwgw==} + engines: {node: '>=14'} dev: false /crypto-random-string@1.0.0: - resolution: { integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} /crypto-random-string@2.0.0: - resolution: { integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} /crypto-random-string@4.0.0: - resolution: { integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} dependencies: type-fest: 1.4.0 dev: true + /cspell-dictionary@6.31.3: + resolution: {integrity: sha512-3w5P3Md/tbHLVGPKVL0ePl1ObmNwhdDiEuZ2TXfm2oAIwg4aqeIrw42A2qmhaKLcuAIywpqGZsrGg8TviNNhig==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + cspell-trie-lib: 6.31.3 + fast-equals: 4.0.3 + gensequence: 5.0.2 + dev: true + + /cspell-gitignore@6.31.3: + resolution: {integrity: sha512-vCfVG4ZrdwJnsZHl/cdp8AY+YNPL3Ga+0KR9XJsaz69EkQpgI6porEqehuwle7hiXw5e3L7xFwNEbpCBlxgLRA==} + engines: {node: '>=14'} + hasBin: true + dependencies: + cspell-glob: 6.31.3 + find-up: 5.0.0 + dev: true + + /cspell-glob@6.31.3: + resolution: {integrity: sha512-+koUJPSCOittQwhR0T1mj4xXT3N+ZnY2qQ53W6Gz9HY3hVfEEy0NpbwE/Uy7sIvFMbc426fK0tGXjXyIj72uhQ==} + engines: {node: '>=14'} + dependencies: + micromatch: 4.0.5 + dev: true + + /cspell-grammar@6.31.3: + resolution: {integrity: sha512-TZYaOLIGAumyHlm4w7HYKKKcR1ZgEMKt7WNjCFqq7yGVW7U+qyjQqR8jqnLiUTZl7c2Tque4mca7n0CFsjVv5A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + dev: true + + /cspell-io@6.31.3: + resolution: {integrity: sha512-yCnnQ5bTbngUuIAaT5yNSdI1P0Kc38uvC8aynNi7tfrCYOQbDu1F9/DcTpbdhrsCv+xUn2TB1YjuCmm0STfJlA==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-service-bus': 6.31.3 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: true + + /cspell-lib@6.31.3: + resolution: {integrity: sha512-Dv55aecaMvT/5VbNryKo0Zos8dtHon7e1K0z8DR4/kGZdQVT0bOFWeotSLhuaIqoNFdEt8ypfKbrIHIdbgt1Hg==} + engines: {node: '>=14.6'} + dependencies: + '@cspell/cspell-bundled-dicts': 6.31.3 + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + '@cspell/strong-weak-map': 6.31.3 + clear-module: 4.1.2 + comment-json: 4.2.4 + configstore: 5.0.1 + cosmiconfig: 8.0.0 + cspell-dictionary: 6.31.3 + cspell-glob: 6.31.3 + cspell-grammar: 6.31.3 + cspell-io: 6.31.3 + cspell-trie-lib: 6.31.3 + fast-equals: 4.0.3 + find-up: 5.0.0 + gensequence: 5.0.2 + import-fresh: 3.3.0 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - encoding + dev: true + + /cspell-trie-lib@6.31.3: + resolution: {integrity: sha512-HNUcLWOZAvtM3E34U+7/mSSpO0F6nLd/kFlRIcvSvPb9taqKe8bnSa0Yyb3dsdMq9rMxUmuDQtF+J6arZK343g==} + engines: {node: '>=14'} + dependencies: + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + gensequence: 5.0.2 + dev: true + + /cspell@6.31.3: + resolution: {integrity: sha512-VeeShDLWVM6YPiU/imeGy0lmg6ki63tbLEa6hz20BExhzzpmINOP5nSTYtpY0H9zX9TrF/dLbI38TuuYnyG3Uw==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@cspell/cspell-json-reporter': 6.31.3 + '@cspell/cspell-pipe': 6.31.3 + '@cspell/cspell-types': 6.31.3 + '@cspell/dynamic-import': 6.31.3 + chalk: 4.1.2 + commander: 10.0.1 + cspell-gitignore: 6.31.3 + cspell-glob: 6.31.3 + cspell-io: 6.31.3 + cspell-lib: 6.31.3 + fast-glob: 3.3.1 + fast-json-stable-stringify: 2.1.0 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + imurmurhash: 0.1.4 + semver: 7.5.4 + strip-ansi: 6.0.1 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - encoding + dev: true + /cssesc@3.0.0: - resolution: { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true dev: true /csv-parse@5.5.0: - resolution: { integrity: sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw== } + resolution: {integrity: sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw==} dev: false /dag-map@1.0.2: - resolution: { integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw== } + resolution: {integrity: sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==} /dargs@7.0.0: - resolution: { integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} dev: true + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: false + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: false + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: false + /dateformat@3.0.3: - resolution: { integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== } + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true /dayjs@1.11.10: - resolution: { integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== } + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} /debug@2.6.9: - resolution: { integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6155,7 +9177,7 @@ packages: ms: 2.0.0 /debug@3.2.7: - resolution: { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6165,8 +9187,8 @@ packages: ms: 2.1.3 /debug@4.3.5: - resolution: { integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6176,31 +9198,31 @@ packages: ms: 2.1.2 /decamelize-keys@1.1.1: - resolution: { integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} dependencies: decamelize: 1.2.0 map-obj: 1.0.1 dev: true /decamelize@1.2.0: - resolution: { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} /decamelize@6.0.0: - resolution: { integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /decompress-response@4.2.1: - resolution: { integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} + engines: {node: '>=8'} dependencies: mimic-response: 2.1.0 dev: false /dedent@1.5.1: - resolution: { integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== } + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -6209,7 +9231,7 @@ packages: dev: true /dedent@1.5.3: - resolution: { integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== } + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -6218,33 +9240,37 @@ packages: dev: true /deep-extend@0.6.0: - resolution: { integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} /deep-is@0.1.4: - resolution: { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } - dev: true + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} /deepmerge@3.3.0: - resolution: { integrity: sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==} + engines: {node: '>=0.10.0'} /deepmerge@4.3.1: - resolution: { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} dev: true /default-browser-id@3.0.0: - resolution: { integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 dev: true + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: true + /default-browser@4.0.0: - resolution: { integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 @@ -6252,46 +9278,63 @@ packages: titleize: 3.0.0 dev: true + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: true + /default-gateway@4.2.0: - resolution: { integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==} + engines: {node: '>=6'} dependencies: execa: 1.0.0 ip-regex: 2.1.0 /defaults@1.0.4: - resolution: { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 /define-data-property@1.1.0: - resolution: { integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 gopd: 1.0.1 has-property-descriptors: 1.0.0 + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: false + /define-lazy-prop@2.0.0: - resolution: { integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} /define-lazy-prop@3.0.0: - resolution: { integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} dev: true /define-properties@1.2.1: - resolution: { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.0 has-property-descriptors: 1.0.0 object-keys: 1.1.1 /del@6.1.1: - resolution: { integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} + engines: {node: '>=10'} dependencies: globby: 11.1.0 graceful-fs: 4.2.11 @@ -6303,75 +9346,75 @@ packages: slash: 3.0.0 /delay@5.0.0: - resolution: { integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} dev: false /delayed-stream@1.0.0: - resolution: { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} /delegates@1.0.0: - resolution: { integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== } + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} /denodeify@1.2.1: - resolution: { integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== } + resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} /depd@2.0.0: - resolution: { integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} /deprecated-react-native-prop-types@3.0.1: - resolution: { integrity: sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ== } + resolution: {integrity: sha512-J0jCJcsk4hMlIb7xwOZKLfMpuJn6l8UtrPEzzQV5ewz5gvKNYakhBuq9h2rWX7YwHHJZFhU5W8ye7dB9oN8VcQ==} dependencies: '@react-native/normalize-color': 2.1.0 invariant: 2.2.4 prop-types: 15.8.1 /deprecation@2.3.1: - resolution: { integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== } + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: true /destroy@1.2.0: - resolution: { integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== } - engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} /detect-indent@5.0.0: - resolution: { integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== } - engines: { node: '>=4' } + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} dev: true /detect-libc@2.0.2: - resolution: { integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} requiresBuild: true /detect-newline@3.1.0: - resolution: { integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} dev: true /dezalgo@1.0.4: - resolution: { integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== } + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} dependencies: asap: 2.0.6 wrappy: 1.0.2 dev: true /did-context@3.1.1: - resolution: { integrity: sha512-iFpszgSxc7d1kNBJWC+PAzNTpe5LPalzsIunTMIpbG3O37Q7Zi7u4iIaedaM7UhziBhT+Agr9DyvAiXSUyfepQ== } + resolution: {integrity: sha512-iFpszgSxc7d1kNBJWC+PAzNTpe5LPalzsIunTMIpbG3O37Q7Zi7u4iIaedaM7UhziBhT+Agr9DyvAiXSUyfepQ==} dev: false /did-jwt-vc@3.1.3: - resolution: { integrity: sha512-qB1FiQ0sT/FUR5+mQ//P5lS0Gllrtes2OxC3WVMOt8ND0LolF92ohozv50ukyOvB2zBzgfm5durcIPqQcoI+LA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-qB1FiQ0sT/FUR5+mQ//P5lS0Gllrtes2OxC3WVMOt8ND0LolF92ohozv50ukyOvB2zBzgfm5durcIPqQcoI+LA==} + engines: {node: '>=14'} dependencies: did-jwt: 6.11.6 did-resolver: 4.1.0 dev: true /did-jwt@6.11.6: - resolution: { integrity: sha512-OfbWknRxJuUqH6Lk0x+H1FsuelGugLbBDEwsoJnicFOntIG/A4y19fn0a8RLxaQbWQ5gXg0yDq5E2huSBiiXzw== } + resolution: {integrity: sha512-OfbWknRxJuUqH6Lk0x+H1FsuelGugLbBDEwsoJnicFOntIG/A4y19fn0a8RLxaQbWQ5gXg0yDq5E2huSBiiXzw==} dependencies: '@stablelib/ed25519': 1.0.3 '@stablelib/random': 1.0.2 @@ -6387,111 +9430,146 @@ packages: uint8arrays: 3.1.1 dev: true - /did-resolver@4.1.0: - resolution: { integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA== } + /did-jwt@8.0.4: + resolution: {integrity: sha512-KPtG7H+8GgKGMiDqFvOdNy5BBN3hpA+8xV7VygEnpst5oPIqjvcH3rTtnPF55a8bOxIzE2PudKGIXIQhekv7WA==} + dependencies: + '@noble/ciphers': 0.5.3 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 + canonicalize: 2.0.0 + did-resolver: 4.1.0 + multibase: 4.0.6 + multiformats: 9.9.0 + uint8arrays: 3.1.1 dev: true + /did-resolver@4.1.0: + resolution: {integrity: sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==} + /diff-sequences@29.6.3: - resolution: { integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /diff@4.0.2: - resolution: { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dev: true /dir-glob@3.0.1: - resolution: { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 /doctrine@2.1.0: - resolution: { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: true /doctrine@3.0.0: - resolution: { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true /dot-prop@5.3.0: - resolution: { integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dependencies: is-obj: 2.0.0 dev: true /dotenv-expand@10.0.0: - resolution: { integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== } - engines: { node: '>=12' } + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} dev: true /dotenv-flow@3.3.0: - resolution: { integrity: sha512-GLSvRqDZ1TGhloS6ZCZ5chdqqv/3XMqZxAnX9rliJiHn6uyJLguKeu+3M2kcagBkoVCnLWYfbR4rfFe1xSU39A== } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-GLSvRqDZ1TGhloS6ZCZ5chdqqv/3XMqZxAnX9rliJiHn6uyJLguKeu+3M2kcagBkoVCnLWYfbR4rfFe1xSU39A==} + engines: {node: '>= 8.0.0'} dependencies: dotenv: 8.6.0 dev: false /dotenv@16.3.1: - resolution: { integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} dev: true /dotenv@16.4.5: - resolution: { integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} dev: true /dotenv@8.6.0: - resolution: { integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} dev: false /duplexer@0.1.2: - resolution: { integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== } + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true /eastasianwidth@0.2.0: - resolution: { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /eciesjs@0.4.7: + resolution: {integrity: sha512-4JQahOkBdDy27jjW4q3FJQigHlcwZXx28sCtBQkBamF2XUdcNXrInpgrr8h205MtVIS0CMHufyIKGVjtjxQ2ZA==} + engines: {node: '>=16.0.0'} + dependencies: + '@noble/ciphers': 0.5.3 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 dev: true /ed25519-signature-2018-context@1.1.0: - resolution: { integrity: sha512-ppDWYMNwwp9bploq0fS4l048vHIq41nWsAbPq6H4mNVx9G/GxW3fwg4Ln0mqctP13MoEpREK7Biz8TbVVdYXqA== } - dev: false + resolution: {integrity: sha512-ppDWYMNwwp9bploq0fS4l048vHIq41nWsAbPq6H4mNVx9G/GxW3fwg4Ln0mqctP13MoEpREK7Biz8TbVVdYXqA==} /ed25519-signature-2020-context@1.1.0: - resolution: { integrity: sha512-dBGSmoUIK6h2vadDctrDnhhTO01PR2hJk0mRNEfrRDPCjaIwrfy4J+eziEQ9Q1m8By4f/CSRgKM1h53ydKfdNg== } - dev: false + resolution: {integrity: sha512-dBGSmoUIK6h2vadDctrDnhhTO01PR2hJk0mRNEfrRDPCjaIwrfy4J+eziEQ9Q1m8By4f/CSRgKM1h53ydKfdNg==} /ed2curve@0.3.0: - resolution: { integrity: sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ== } + resolution: {integrity: sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==} dependencies: tweetnacl: 1.0.3 /ee-first@1.1.1: - resolution: { integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} /ejs@3.1.9: - resolution: { integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} hasBin: true dependencies: jake: 10.8.7 dev: true - /electron-to-chromium@1.4.532: - resolution: { integrity: sha512-piIR0QFdIGKmOJTSNg5AwxZRNWQSXlRYycqDB9Srstx4lip8KpcmRxVP6zuFWExWziHYZpJ0acX7TxqX95KBpg== } - - /elliptic@6.5.4: - resolution: { integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== } + /electron-to-chromium@1.4.532: + resolution: {integrity: sha512-piIR0QFdIGKmOJTSNg5AwxZRNWQSXlRYycqDB9Srstx4lip8KpcmRxVP6zuFWExWziHYZpJ0acX7TxqX95KBpg==} + + /electron-to-chromium@1.4.825: + resolution: {integrity: sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==} + + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -6503,23 +9581,23 @@ packages: dev: true /emittery@0.13.1: - resolution: { integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} dev: true /emoji-regex@8.0.0: - resolution: { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} /emoji-regex@9.2.2: - resolution: { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true /encodeurl@1.0.2: - resolution: { integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} /encoding@0.1.13: - resolution: { integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== } + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} requiresBuild: true dependencies: iconv-lite: 0.6.3 @@ -6527,64 +9605,72 @@ packages: optional: true /end-of-stream@1.4.4: - resolution: { integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== } + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /enquirer@2.3.6: - resolution: { integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} dependencies: ansi-colors: 4.1.3 dev: true /env-editor@0.4.2: - resolution: { integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==} + engines: {node: '>=8'} /env-paths@2.2.1: - resolution: { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } - engines: { node: '>=6' } + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} dev: true /envinfo@7.10.0: - resolution: { integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} + engines: {node: '>=4'} hasBin: true /envinfo@7.13.0: - resolution: { integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== } - engines: { node: '>=4' } + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} hasBin: true dev: true /eol@0.9.1: - resolution: { integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== } + resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} /err-code@2.0.3: - resolution: { integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== } + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} dev: true /error-ex@1.3.2: - resolution: { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 /error-stack-parser@2.1.4: - resolution: { integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== } + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} dependencies: stackframe: 1.3.4 /errorhandler@1.5.1: - resolution: { integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} + engines: {node: '>= 0.8'} dependencies: accepts: 1.3.8 escape-html: 1.0.3 /es-abstract@1.22.2: - resolution: { integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -6625,54 +9711,157 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: false + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: false + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: false /es-set-tostringtag@2.0.1: - resolution: { integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: false /es-shim-unscopables@1.0.0: - resolution: { integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== } + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: true /es-to-primitive@1.2.1: - resolution: { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /escalade@3.1.1: - resolution: { integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} /escape-html@1.0.3: - resolution: { integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} /escape-string-regexp@1.0.5: - resolution: { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} /escape-string-regexp@2.0.0: - resolution: { integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} /escape-string-regexp@4.0.0: - resolution: { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: false + + /eslint-config-prettier@8.10.0(eslint@8.57.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 dev: true /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: { integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== } + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -6681,7 +9870,7 @@ packages: dev: true /eslint-import-resolver-node@0.3.9: - resolution: { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.14.0 @@ -6691,8 +9880,8 @@ packages: dev: true /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): - resolution: { integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -6720,8 +9909,8 @@ packages: dev: true /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): - resolution: { integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== } - engines: { node: '>=6.5.0' } + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: @@ -6731,8 +9920,8 @@ packages: dev: true /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint@8.57.0): - resolution: { integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 @@ -6766,29 +9955,29 @@ packages: dev: true /eslint-scope@5.1.1: - resolution: { integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 dev: true /eslint-scope@7.2.2: - resolution: { integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 dev: true /eslint-visitor-keys@3.4.3: - resolution: { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /eslint@8.57.0: - resolution: { integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -6834,13 +10023,13 @@ packages: dev: true /esm@3.2.25: - resolution: { integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} dev: true /espree@9.6.1: - resolution: { integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) @@ -6848,60 +10037,113 @@ packages: dev: true /esprima@4.0.1: - resolution: { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } - engines: { node: '>=4' } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true /esquery@1.5.0: - resolution: { integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true /esrecurse@4.3.0: - resolution: { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true /estraverse@4.3.0: - resolution: { integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== } - engines: { node: '>=4.0' } - dev: true + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} /estraverse@5.3.0: - resolution: { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} dev: true /esutils@2.0.3: - resolution: { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} /etag@1.8.1: - resolution: { integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /ethers@6.13.1: + resolution: {integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true /event-target-shim@5.0.1: - resolution: { integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} /eventemitter3@4.0.7: - resolution: { integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== } + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} dev: true /events@3.3.0: - resolution: { integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== } - engines: { node: '>=0.8.x' } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} /exec-async@2.2.0: - resolution: { integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw== } + resolution: {integrity: sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==} /execa@1.0.0: - resolution: { integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} dependencies: cross-spawn: 6.0.5 get-stream: 4.1.0 @@ -6912,8 +10154,8 @@ packages: strip-eof: 1.0.0 /execa@5.0.0: - resolution: { integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -6927,8 +10169,8 @@ packages: dev: true /execa@5.1.1: - resolution: { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -6942,8 +10184,8 @@ packages: dev: true /execa@7.2.0: - resolution: { integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== } - engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -6957,13 +10199,13 @@ packages: dev: true /exit@0.1.2: - resolution: { integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} dev: true /expect@29.7.0: - resolution: { integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 @@ -6973,14 +10215,14 @@ packages: dev: true /expo-application@5.1.1(expo@48.0.20): - resolution: { integrity: sha512-aDatTcTTCdTbHw8h4/Tq2ilc6InM5ntF9xWCJdOcnUEcglxxGphVI/lzJKBaBF6mJECA8mEOjpVg2EGxOctTwg== } + resolution: {integrity: sha512-aDatTcTTCdTbHw8h4/Tq2ilc6InM5ntF9xWCJdOcnUEcglxxGphVI/lzJKBaBF6mJECA8mEOjpVg2EGxOctTwg==} peerDependencies: expo: '*' dependencies: expo: 48.0.20(@babel/core@7.23.0) /expo-asset@8.9.2(expo@48.0.20): - resolution: { integrity: sha512-aHMaZkIG5/UoguINEHm2ln/KviU2m/yuryslnhCKR3KXRxiLnMhxmrONLGbknuNE0O1iCaprrl1w3y71u01Rpw== } + resolution: {integrity: sha512-aHMaZkIG5/UoguINEHm2ln/KviU2m/yuryslnhCKR3KXRxiLnMhxmrONLGbknuNE0O1iCaprrl1w3y71u01Rpw==} dependencies: blueimp-md5: 2.19.0 expo-constants: 14.3.0(expo@48.0.20) @@ -6994,7 +10236,7 @@ packages: - supports-color /expo-constants@14.2.1(expo@48.0.20): - resolution: { integrity: sha512-DD5u4QmBds2U7uYo409apV7nX+XjudARcgqe7S9aRFJ/6kyftmuxvk1DpaU4X42Av8z/tfKwEpuxl+vl7HHx/Q== } + resolution: {integrity: sha512-DD5u4QmBds2U7uYo409apV7nX+XjudARcgqe7S9aRFJ/6kyftmuxvk1DpaU4X42Av8z/tfKwEpuxl+vl7HHx/Q==} peerDependencies: expo: '*' dependencies: @@ -7005,7 +10247,7 @@ packages: - supports-color /expo-constants@14.3.0(expo@48.0.20): - resolution: { integrity: sha512-O8b+mZlPXZGH4wLLd+jMihGD0ZSMJRSmSsmcG7T60jHU3Dw4yDIuzHM/wMoBoL1pxLIbEwvcwDj0w8c+Sn+1sQ== } + resolution: {integrity: sha512-O8b+mZlPXZGH4wLLd+jMihGD0ZSMJRSmSsmcG7T60jHU3Dw4yDIuzHM/wMoBoL1pxLIbEwvcwDj0w8c+Sn+1sQ==} peerDependencies: expo: '*' dependencies: @@ -7016,7 +10258,7 @@ packages: - supports-color /expo-file-system@15.2.2(expo@48.0.20): - resolution: { integrity: sha512-LFkOLcWwlmnjkURxZ3/0ukS35OswX8iuQknLHRHeyk8mUA8fpRPPelD/a1lS+yclqfqavMJmTXVKM1Nsq5XVMA== } + resolution: {integrity: sha512-LFkOLcWwlmnjkURxZ3/0ukS35OswX8iuQknLHRHeyk8mUA8fpRPPelD/a1lS+yclqfqavMJmTXVKM1Nsq5XVMA==} peerDependencies: expo: '*' dependencies: @@ -7024,7 +10266,7 @@ packages: uuid: 3.4.0 /expo-file-system@15.3.0(expo@48.0.20): - resolution: { integrity: sha512-YUvNZzZJlF5TZM+FoRW9biJPB7qEgZbGYm8xJpqnxpj70FkFhwwoKiXVduZk+KVNiIs7d0q7e+Jdvmcr+Id3FQ== } + resolution: {integrity: sha512-YUvNZzZJlF5TZM+FoRW9biJPB7qEgZbGYm8xJpqnxpj70FkFhwwoKiXVduZk+KVNiIs7d0q7e+Jdvmcr+Id3FQ==} peerDependencies: expo: '*' dependencies: @@ -7032,7 +10274,7 @@ packages: uuid: 3.4.0 /expo-font@11.1.1(expo@48.0.20): - resolution: { integrity: sha512-X+aICqYY69hiiDDtcNrjq8KutHrH2TrHuMqk0Rfq0P7hF6hMd+YefwLBNkvIrqrgmTAuqiLjMUwj2rHLqmgluw== } + resolution: {integrity: sha512-X+aICqYY69hiiDDtcNrjq8KutHrH2TrHuMqk0Rfq0P7hF6hMd+YefwLBNkvIrqrgmTAuqiLjMUwj2rHLqmgluw==} peerDependencies: expo: '*' dependencies: @@ -7040,14 +10282,14 @@ packages: fontfaceobserver: 2.3.0 /expo-keep-awake@12.0.1(expo@48.0.20): - resolution: { integrity: sha512-hqeCnb4033TyuZaXs93zTK7rjVJ3bywXATyMmKmKkLEsH2PKBAl/VmjlCOPQL/2Ncqz6aj7Wo//tjeJTARBD4g== } + resolution: {integrity: sha512-hqeCnb4033TyuZaXs93zTK7rjVJ3bywXATyMmKmKkLEsH2PKBAl/VmjlCOPQL/2Ncqz6aj7Wo//tjeJTARBD4g==} peerDependencies: expo: '*' dependencies: expo: 48.0.20(@babel/core@7.23.0) /expo-modules-autolinking@0.0.3: - resolution: { integrity: sha512-azkCRYj/DxbK4udDuDxA9beYzQTwpJ5a9QA0bBgha2jHtWdFGF4ZZWSY+zNA5mtU3KqzYt8jWHfoqgSvKyu1Aw== } + resolution: {integrity: sha512-azkCRYj/DxbK4udDuDxA9beYzQTwpJ5a9QA0bBgha2jHtWdFGF4ZZWSY+zNA5mtU3KqzYt8jWHfoqgSvKyu1Aw==} hasBin: true requiresBuild: true dependencies: @@ -7056,11 +10298,10 @@ packages: fast-glob: 3.3.1 find-up: 5.0.0 fs-extra: 9.1.0 - dev: false optional: true /expo-modules-autolinking@1.2.0: - resolution: { integrity: sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA== } + resolution: {integrity: sha512-QOPh/iXykNDCAzUual1imSrn2aDakzCGUp2QmxVREr0llajXygroUWlT9sQXh1zKzbNp+a+i/xK375ZeBFiNJA==} hasBin: true dependencies: chalk: 4.1.2 @@ -7070,24 +10311,23 @@ packages: fs-extra: 9.1.0 /expo-modules-core@1.2.7: - resolution: { integrity: sha512-sulqn2M8+tIdxi6QFkKppDEzbePAscgE2LEHocYoQOgHxJpeT7axE0Hkzc+81EeviQilZzGeFZMtNMGh3c9yJg== } + resolution: {integrity: sha512-sulqn2M8+tIdxi6QFkKppDEzbePAscgE2LEHocYoQOgHxJpeT7axE0Hkzc+81EeviQilZzGeFZMtNMGh3c9yJg==} dependencies: compare-versions: 3.6.0 invariant: 2.2.4 /expo-random@13.4.0(expo@48.0.20): - resolution: { integrity: sha512-Z/Bbd+1MbkK8/4ukspgA3oMlcu0q3YTCu//7q2xHwy35huN6WCv4/Uw2OGyCiOQjAbU02zwq6swA+VgVmJRCEw== } + resolution: {integrity: sha512-Z/Bbd+1MbkK8/4ukspgA3oMlcu0q3YTCu//7q2xHwy35huN6WCv4/Uw2OGyCiOQjAbU02zwq6swA+VgVmJRCEw==} requiresBuild: true peerDependencies: expo: '*' dependencies: base64-js: 1.5.1 expo: 48.0.20(@babel/core@7.23.0) - dev: false optional: true /expo@48.0.20(@babel/core@7.23.0): - resolution: { integrity: sha512-SDRlLRINWWqf/OIPaUr/BsFZLhR5oEj1u9Cn06h1mPeo8pqv6ei/QTSZql4e0ixHIu3PWMPrUx9k/47nnTyTpg== } + resolution: {integrity: sha512-SDRlLRINWWqf/OIPaUr/BsFZLhR5oEj1u9Cn06h1mPeo8pqv6ei/QTSZql4e0ixHIu3PWMPrUx9k/47nnTyTpg==} hasBin: true dependencies: '@babel/runtime': 7.23.1 @@ -7121,12 +10361,12 @@ packages: - utf-8-validate /exponential-backoff@3.1.1: - resolution: { integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== } + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} dev: true /express-session@1.17.3: - resolution: { integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==} + engines: {node: '>= 0.8.0'} dependencies: cookie: 0.4.2 cookie-signature: 1.0.6 @@ -7141,8 +10381,8 @@ packages: dev: false /express@4.19.2: - resolution: { integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -7180,15 +10420,15 @@ packages: dev: false /expression-eval@5.0.1: - resolution: { integrity: sha512-7SL4miKp19lI834/F6y156xlNg+i9Q41tteuGNCq9C06S78f1bm3BXuvf0+QpQxv369Pv/P2R7Hb17hzxLpbDA== } + resolution: {integrity: sha512-7SL4miKp19lI834/F6y156xlNg+i9Q41tteuGNCq9C06S78f1bm3BXuvf0+QpQxv369Pv/P2R7Hb17hzxLpbDA==} deprecated: The expression-eval npm package is no longer maintained. The package was originally published as part of a now-completed personal project, and I do not have incentives to continue maintenance. dependencies: jsep: 0.3.5 dev: false /external-editor@3.1.0: - resolution: { integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== } - engines: { node: '>=4' } + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 @@ -7196,19 +10436,23 @@ packages: dev: true /factory.ts@0.5.2: - resolution: { integrity: sha512-I4YDKuyMW+s2PocnWh/Ekv9wSStt/MNN1ZRb1qhy0Kv056ndlzbLHDsW9KEmTAqMpLI3BtjSqEdZ7ZfdnaXn9w== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-I4YDKuyMW+s2PocnWh/Ekv9wSStt/MNN1ZRb1qhy0Kv056ndlzbLHDsW9KEmTAqMpLI3BtjSqEdZ7ZfdnaXn9w==} + engines: {node: '>= 14'} dependencies: clone-deep: 4.0.1 source-map-support: 0.5.21 dev: true /fast-deep-equal@3.1.3: - resolution: { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-equals@4.0.3: + resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + dev: true /fast-glob@3.3.1: - resolution: { integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -7217,11 +10461,11 @@ packages: micromatch: 4.0.5 /fast-json-stable-stringify@2.1.0: - resolution: { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true /fast-json-stringify@5.8.0: - resolution: { integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ== } + resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==} dependencies: '@fastify/deepmerge': 1.3.0 ajv: 8.12.0 @@ -7232,62 +10476,60 @@ packages: dev: false /fast-levenshtein@2.0.6: - resolution: { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } - dev: true + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} /fast-printf@1.6.9: - resolution: { integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg== } - engines: { node: '>=10.0' } + resolution: {integrity: sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==} + engines: {node: '>=10.0'} dependencies: boolean: 3.2.0 dev: false /fast-safe-stringify@2.1.1: - resolution: { integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== } + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true /fast-text-encoding@1.0.6: - resolution: { integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== } - dev: false + resolution: {integrity: sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==} /fast-uri@2.2.0: - resolution: { integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg== } + resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} dev: false /fast-url-parser@1.1.3: - resolution: { integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== } + resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} dependencies: punycode: 1.4.1 dev: true /fast-xml-parser@4.3.1: - resolution: { integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA== } + resolution: {integrity: sha512-viVv3xb8D+SiS1W4cv4tva3bni08kAkx0gQnWrykMM8nXPc1FxqZPU00dCEVjkiCg4HoXd2jC4x29Nzg/l2DAA==} hasBin: true dependencies: strnum: 1.0.5 /fastq@1.15.0: - resolution: { integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== } + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 /fb-watchman@2.0.2: - resolution: { integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== } + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 /fbemitter@3.0.0: - resolution: { integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== } + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} dependencies: fbjs: 3.0.5 transitivePeerDependencies: - encoding /fbjs-css-vars@1.0.2: - resolution: { integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== } + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} /fbjs@3.0.5: - resolution: { integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== } + resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} dependencies: cross-fetch: 3.1.8 fbjs-css-vars: 1.0.2 @@ -7300,25 +10542,34 @@ packages: - encoding /fetch-retry@4.1.1: - resolution: { integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA== } + resolution: {integrity: sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==} /figures@3.2.0: - resolution: { integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 dev: true /file-entry-cache@6.0.1: - resolution: { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== } - engines: { node: ^10.12.0 || >=12.0.0 } + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 dev: true /file-type@18.5.0: - resolution: { integrity: sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==} + engines: {node: '>=14.16'} + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + dev: true + + /file-type@18.7.0: + resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} + engines: {node: '>=14.16'} dependencies: readable-web-to-node-stream: 3.0.2 strtok3: 7.0.0 @@ -7326,20 +10577,20 @@ packages: dev: true /filelist@1.0.4: - resolution: { integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== } + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: minimatch: 5.1.6 dev: true /fill-range@7.0.1: - resolution: { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 /finalhandler@1.1.2: - resolution: { integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -7352,8 +10603,8 @@ packages: - supports-color /finalhandler@1.2.0: - resolution: { integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} dependencies: debug: 2.6.9 encodeurl: 1.0.2 @@ -7367,23 +10618,23 @@ packages: dev: false /find-babel-config@1.2.0: - resolution: { integrity: sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==} + engines: {node: '>=4.0.0'} dependencies: json5: 0.5.1 path-exists: 3.0.0 /find-cache-dir@2.1.0: - resolution: { integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} dependencies: commondir: 1.0.1 make-dir: 2.1.0 pkg-dir: 3.0.0 /find-replace@3.0.0: - resolution: { integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} requiresBuild: true dependencies: array-back: 3.1.0 @@ -7391,48 +10642,58 @@ packages: optional: true /find-up@2.1.0: - resolution: { integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} dependencies: locate-path: 2.0.0 dev: true /find-up@3.0.0: - resolution: { integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} dependencies: locate-path: 3.0.0 /find-up@4.1.0: - resolution: { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 /find-up@5.0.0: - resolution: { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 /find-up@6.3.0: - resolution: { integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: locate-path: 7.2.0 path-exists: 5.0.0 dev: true /find-yarn-workspace-root@2.0.0: - resolution: { integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== } + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} dependencies: micromatch: 4.0.5 + /fix-esm@1.0.1: + resolution: {integrity: sha512-EZtb7wPXZS54GaGxaWxMlhd1DUDCnAg5srlYdu/1ZVeW+7wwR3Tp59nu52dXByFs3MBRq+SByx1wDOJpRvLEXw==} + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + dev: true + /flat-cache@3.1.0: - resolution: { integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} dependencies: flatted: 3.2.9 keyv: 4.5.3 @@ -7440,21 +10701,21 @@ packages: dev: true /flat@5.0.2: - resolution: { integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== } + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true /flatted@3.2.9: - resolution: { integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== } + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true /flow-parser@0.185.2: - resolution: { integrity: sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-2hJ5ACYeJCzNtiVULov6pljKOLygy0zddoqSI1fFetM+XRPpRshFdGEijtqlamA1XwyZ+7rhryI6FQFzvtLWUQ==} + engines: {node: '>=0.4.0'} /follow-redirects@1.15.6: - resolution: { integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: @@ -7463,33 +10724,36 @@ packages: dev: true /fontfaceobserver@2.3.0: - resolution: { integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg== } + resolution: {integrity: sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==} /for-each@0.3.3: - resolution: { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + + /foreach@2.0.6: + resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} dev: true /foreground-child@3.1.1: - resolution: { integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== } - engines: { node: '>=14' } + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 dev: true /form-data@3.0.1: - resolution: { integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 /form-data@4.0.0: - resolution: { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -7497,7 +10761,7 @@ packages: dev: true /formidable@2.1.2: - resolution: { integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== } + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 @@ -7506,25 +10770,25 @@ packages: dev: true /forwarded@0.2.0: - resolution: { integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} dev: false /freeport-async@2.0.0: - resolution: { integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==} + engines: {node: '>=8'} /fresh@0.5.2: - resolution: { integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} /fs-constants@1.0.0: - resolution: { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: true /fs-extra@11.2.0: - resolution: { integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -7532,16 +10796,16 @@ packages: dev: true /fs-extra@8.1.0: - resolution: { integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== } - engines: { node: '>=6 <7 || >=8' } + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 /fs-extra@9.0.0: - resolution: { integrity: sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==} + engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 @@ -7549,8 +10813,8 @@ packages: universalify: 1.0.0 /fs-extra@9.1.0: - resolution: { integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 @@ -7558,52 +10822,49 @@ packages: universalify: 2.0.0 /fs-minipass@2.1.0: - resolution: { integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 /fs-minipass@3.0.3: - resolution: { integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minipass: 7.0.3 dev: true /fs.realpath@1.0.0: - resolution: { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents@2.3.3: - resolution: { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true /function-bind@1.1.1: - resolution: { integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== } + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} /function-bind@1.1.2: - resolution: { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } - dev: true + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} /function.prototype.name@1.1.6: - resolution: { integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 functions-have-names: 1.2.3 - dev: true /functions-have-names@1.2.3: - resolution: { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } - dev: true + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} /gauge@3.0.2: - resolution: { integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} requiresBuild: true dependencies: aproba: 2.0.0 @@ -7616,30 +10877,50 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 + /gensequence@5.0.2: + resolution: {integrity: sha512-JlKEZnFc6neaeSVlkzBGGgkIoIaSxMgvdamRoPN8r3ozm2r9dusqxeKqYQ7lhzmj2UhFQP8nkyfCaiLQxiLrDA==} + engines: {node: '>=14'} + dev: true + + /genson-js@0.0.5: + resolution: {integrity: sha512-1i1y9MIGzTRkn4TusWQwLWLu8IJGHgSE+fbQRt1fy68ZKEq2GjDZI/7NUSZFOfTbHz8bgjP4iCIOcdYrgEsMBA==} + dev: true + /gensync@1.0.0-beta.2: - resolution: { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} /get-caller-file@2.0.5: - resolution: { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} /get-intrinsic@1.2.1: - resolution: { integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== } + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: false + /get-package-type@0.1.0: - resolution: { integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} dev: true /get-pkg-repo@4.2.1: - resolution: { integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} hasBin: true dependencies: '@hutson/parse-repository-url': 3.0.2 @@ -7649,49 +10930,62 @@ packages: dev: true /get-port@3.2.0: - resolution: { integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} /get-port@5.1.1: - resolution: { integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + dev: true + + /get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} dev: true /get-stdin@9.0.0: - resolution: { integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} dev: true /get-stream@4.1.0: - resolution: { integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== } - engines: { node: '>=6' } + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} dependencies: pump: 3.0.0 /get-stream@6.0.0: - resolution: { integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} dev: true /get-stream@6.0.1: - resolution: { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} dev: true /get-symbol-description@1.0.0: - resolution: { integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: false /getenv@1.0.0: - resolution: { integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} + engines: {node: '>=6'} /git-config@0.0.7: - resolution: { integrity: sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA== } + resolution: {integrity: sha512-LidZlYZXWzVjS+M3TEwhtYBaYwLeOZrXci1tBgqp/vDdZTBMl02atvwb6G35L64ibscYoPnxfbwwUS+VZAISLA==} requiresBuild: true dependencies: iniparser: 1.0.5 @@ -7699,8 +10993,8 @@ packages: optional: true /git-raw-commits@3.0.0: - resolution: { integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== } - engines: { node: '>=14' } + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} hasBin: true dependencies: dargs: 7.0.0 @@ -7709,16 +11003,16 @@ packages: dev: true /git-remote-origin-url@2.0.0: - resolution: { integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 dev: true /git-semver-tags@5.0.1: - resolution: { integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} hasBin: true dependencies: meow: 8.1.2 @@ -7726,40 +11020,40 @@ packages: dev: true /git-up@7.0.0: - resolution: { integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== } + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} dependencies: is-ssh: 1.4.0 parse-url: 8.1.0 dev: true /git-url-parse@14.0.0: - resolution: { integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== } + resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} dependencies: git-up: 7.0.0 dev: true /gitconfiglocal@1.0.0: - resolution: { integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== } + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} dependencies: ini: 1.3.8 dev: true /glob-parent@5.1.2: - resolution: { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 /glob-parent@6.0.2: - resolution: { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true /glob@10.3.10: - resolution: { integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 @@ -7770,7 +11064,7 @@ packages: dev: true /glob@6.0.4: - resolution: { integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== } + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} deprecated: Glob versions prior to v9 are no longer supported requiresBuild: true dependencies: @@ -7782,7 +11076,7 @@ packages: optional: true /glob@7.1.6: - resolution: { integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== } + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 @@ -7793,7 +11087,7 @@ packages: path-is-absolute: 1.0.1 /glob@7.2.3: - resolution: { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7802,9 +11096,21 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + /glob@9.3.5: - resolution: { integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: fs.realpath: 1.0.0 minimatch: 8.0.4 @@ -7812,26 +11118,33 @@ packages: path-scurry: 1.10.1 dev: true + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + /globals@11.12.0: - resolution: { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} /globals@13.22.0: - resolution: { integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true /globalthis@1.0.3: - resolution: { integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 /globby@11.1.0: - resolution: { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -7841,20 +11154,20 @@ packages: slash: 3.0.0 /gopd@1.0.1: - resolution: { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.1 /graceful-fs@4.2.11: - resolution: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} /graphemer@1.4.0: - resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true /graphql-tag@2.12.6(graphql@15.8.0): - resolution: { integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: @@ -7862,12 +11175,12 @@ packages: tslib: 2.6.2 /graphql@15.8.0: - resolution: { integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==} + engines: {node: '>= 10.x'} /handlebars@4.7.8: - resolution: { integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== } - engines: { node: '>=0.4.7' } + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true dependencies: minimist: 1.2.8 @@ -7879,54 +11192,75 @@ packages: dev: true /hard-rejection@2.1.0: - resolution: { integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} dev: true /has-bigints@1.0.2: - resolution: { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } - dev: true + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} /has-flag@3.0.0: - resolution: { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} /has-flag@4.0.0: - resolution: { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: true /has-property-descriptors@1.0.0: - resolution: { integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== } + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.1 + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: false + /has-proto@1.0.1: - resolution: { integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: false /has-symbols@1.0.3: - resolution: { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} /has-tostringtag@1.0.0: - resolution: { integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false /has-unicode@2.0.1: - resolution: { integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== } + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} /has@1.0.3: - resolution: { integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 /hash-base@3.1.0: - resolution: { integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} dependencies: inherits: 2.0.4 readable-stream: 3.6.2 @@ -7934,44 +11268,43 @@ packages: dev: true /hash.js@1.1.7: - resolution: { integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== } + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 dev: true /hasown@2.0.2: - resolution: { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - dev: true /hermes-estree@0.8.0: - resolution: { integrity: sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q== } + resolution: {integrity: sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q==} /hermes-parser@0.8.0: - resolution: { integrity: sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA== } + resolution: {integrity: sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA==} dependencies: hermes-estree: 0.8.0 /hermes-profile-transformer@0.0.6: - resolution: { integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} + engines: {node: '>=8'} dependencies: source-map: 0.7.4 /hexoid@1.0.0: - resolution: { integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} dev: true /highlight.js@10.7.3: - resolution: { integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== } + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: true /hmac-drbg@1.0.1: - resolution: { integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== } + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 @@ -7979,58 +11312,51 @@ packages: dev: true /hosted-git-info@2.8.9: - resolution: { integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== } + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: true /hosted-git-info@3.0.8: - resolution: { integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==} + engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 /hosted-git-info@4.1.0: - resolution: { integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 dev: true /hosted-git-info@5.2.1: - resolution: { integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: lru-cache: 7.18.3 dev: true - /hosted-git-info@7.0.1: - resolution: { integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== } - engines: { node: ^16.14.0 || >=18.0.0 } - dependencies: - lru-cache: 10.0.1 - dev: true - /hosted-git-info@7.0.2: - resolution: { integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: lru-cache: 10.3.1 dev: true /html-entities@2.4.0: - resolution: { integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== } + resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} dev: false /html-escaper@2.0.2: - resolution: { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true /http-cache-semantics@4.1.1: - resolution: { integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== } + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: true /http-errors@2.0.0: - resolution: { integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -8039,8 +11365,8 @@ packages: toidentifier: 1.0.1 /http-proxy-agent@4.0.1: - resolution: { integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 @@ -8050,8 +11376,8 @@ packages: dev: true /http-proxy-agent@7.0.2: - resolution: { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 debug: 4.3.5 @@ -8060,8 +11386,8 @@ packages: dev: true /http-terminator@3.2.0: - resolution: { integrity: sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g== } - engines: { node: '>=14' } + resolution: {integrity: sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g==} + engines: {node: '>=14'} dependencies: delay: 5.0.0 p-wait-for: 3.2.0 @@ -8070,8 +11396,8 @@ packages: dev: false /https-proxy-agent@5.0.1: - resolution: { integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 debug: 4.3.5 @@ -8079,8 +11405,8 @@ packages: - supports-color /https-proxy-agent@7.0.4: - resolution: { integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 debug: 4.3.5 @@ -8089,30 +11415,30 @@ packages: dev: true /human-signals@2.1.0: - resolution: { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } - engines: { node: '>=10.17.0' } + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} dev: true /human-signals@4.3.1: - resolution: { integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== } - engines: { node: '>=14.18.0' } + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} dev: true /humanize-ms@1.2.1: - resolution: { integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== } + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 dev: true /iconv-lite@0.4.24: - resolution: { integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 /iconv-lite@0.6.3: - resolution: { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} requiresBuild: true dependencies: safer-buffer: 2.1.2 @@ -8120,91 +11446,95 @@ packages: optional: true /ieee754@1.2.1: - resolution: { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} /ignore-walk@3.0.4: - resolution: { integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== } + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} dependencies: minimatch: 3.1.2 dev: true /ignore-walk@6.0.4: - resolution: { integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 9.0.3 + minimatch: 9.0.5 dev: true /ignore@5.2.4: - resolution: { integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} /image-size@0.6.3: - resolution: { integrity: sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==} + engines: {node: '>=4.0'} hasBin: true /import-fresh@2.0.0: - resolution: { integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} dependencies: caller-path: 2.0.0 resolve-from: 3.0.0 /import-fresh@3.3.0: - resolution: { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 dev: true /import-local@3.1.0: - resolution: { integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} hasBin: true dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 dev: true + /import-meta-resolve@2.2.2: + resolution: {integrity: sha512-f8KcQ1D80V7RnqVm+/lirO9zkOxjGxhaTC1IPrBGd3MEfNgmNG67tSUO9gTi2F3Blr2Az6g1vocaxzkVnWl9MA==} + dev: true + /imurmurhash@0.1.4: - resolution: { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} /indent-string@4.0.0: - resolution: { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} /indent-string@5.0.0: - resolution: { integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} dev: true /infer-owner@1.0.4: - resolution: { integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== } + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} /inflight@1.0.6: - resolution: { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 /inherits@2.0.4: - resolution: { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} /ini@1.3.8: - resolution: { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} /iniparser@1.0.5: - resolution: { integrity: sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw== } + resolution: {integrity: sha512-i40MWqgTU6h/70NtMsDVVDLjDYWwcIR1yIEVDPfxZIJno9z9L4s83p/V7vAu2i48Vj0gpByrkGFub7ko9XvPrw==} requiresBuild: true dev: true optional: true /init-package-json@6.0.3: - resolution: { integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/package-json': 5.2.0 npm-package-arg: 11.0.2 @@ -8218,8 +11548,8 @@ packages: dev: true /inquirer@7.3.3: - resolution: { integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} requiresBuild: true dependencies: ansi-escapes: 4.3.2 @@ -8239,8 +11569,8 @@ packages: optional: true /inquirer@8.2.6: - resolution: { integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -8260,347 +11590,386 @@ packages: dev: true /internal-ip@4.3.0: - resolution: { integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==} + engines: {node: '>=6'} dependencies: default-gateway: 4.2.0 ipaddr.js: 1.9.1 /internal-slot@1.0.5: - resolution: { integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 - dev: true + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: false /invariant@2.2.4: - resolution: { integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== } + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} dependencies: loose-envify: 1.4.0 /ip-regex@2.1.0: - resolution: { integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} + engines: {node: '>=4'} /ip@1.1.8: - resolution: { integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== } + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} /ip@2.0.0: - resolution: { integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== } + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} dev: true /ipaddr.js@1.9.1: - resolution: { integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} /is-arguments@1.1.1: - resolution: { integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: true /is-array-buffer@3.0.2: - resolution: { integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== } + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: false /is-arrayish@0.2.1: - resolution: { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} /is-bigint@1.0.4: - resolution: { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-boolean-object@1.1.2: - resolution: { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-buffer@1.1.6: - resolution: { integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== } + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} /is-callable@1.2.7: - resolution: { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } - engines: { node: '>= 0.4' } - dev: true + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} /is-ci@3.0.1: - resolution: { integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== } + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.8.0 dev: true /is-core-module@2.13.0: - resolution: { integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== } + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 + dev: true /is-core-module@2.14.0: - resolution: { integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 - dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: false /is-date-object@1.0.5: - resolution: { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-directory@0.3.1: - resolution: { integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} /is-docker@2.2.1: - resolution: { integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true /is-docker@3.0.0: - resolution: { integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true dev: true /is-extglob@1.0.0: - resolution: { integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} /is-extglob@2.1.1: - resolution: { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} /is-fullwidth-code-point@2.0.0: - resolution: { integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== } - engines: { node: '>=4' } + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} /is-fullwidth-code-point@3.0.0: - resolution: { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} /is-generator-fn@2.1.0: - resolution: { integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} dev: true /is-generator-function@1.0.10: - resolution: { integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true /is-glob@2.0.1: - resolution: { integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 1.0.0 /is-glob@4.0.3: - resolution: { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 /is-inside-container@1.0.0: - resolution: { integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} hasBin: true dependencies: is-docker: 3.0.0 dev: true /is-interactive@1.0.0: - resolution: { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} /is-invalid-path@0.1.0: - resolution: { integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} + engines: {node: '>=0.10.0'} dependencies: is-glob: 2.0.1 /is-lambda@1.0.1: - resolution: { integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== } + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} dev: true /is-negative-zero@2.0.2: - resolution: { integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== } - engines: { node: '>= 0.4' } - dev: true + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: false /is-number-object@1.0.7: - resolution: { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-number@7.0.0: - resolution: { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} /is-obj@2.0.0: - resolution: { integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} dev: true /is-path-cwd@2.2.0: - resolution: { integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} /is-path-inside@3.0.3: - resolution: { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} /is-plain-obj@1.1.0: - resolution: { integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} dev: true /is-plain-object@2.0.4: - resolution: { integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 /is-plain-object@5.0.0: - resolution: { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} dev: true /is-regex@1.1.4: - resolution: { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-root@2.1.0: - resolution: { integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} + engines: {node: '>=6'} /is-shared-array-buffer@1.0.2: - resolution: { integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== } + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 - dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: false /is-ssh@1.4.0: - resolution: { integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== } + resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} dependencies: protocols: 2.0.1 dev: true /is-stream@1.1.0: - resolution: { integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} /is-stream@2.0.0: - resolution: { integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} dev: true /is-stream@2.0.1: - resolution: { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} /is-stream@3.0.0: - resolution: { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-string@1.0.7: - resolution: { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-symbol@1.0.4: - resolution: { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /is-text-path@1.0.1: - resolution: { integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 dev: true /is-typed-array@1.1.12: - resolution: { integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.11 + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} dev: true /is-unicode-supported@0.1.0: - resolution: { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} /is-valid-path@0.1.1: - resolution: { integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==} + engines: {node: '>=0.10.0'} dependencies: is-invalid-path: 0.1.0 /is-weakref@1.0.2: - resolution: { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 - dev: true /is-wsl@1.1.0: - resolution: { integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} + engines: {node: '>=4'} /is-wsl@2.2.0: - resolution: { integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== } - engines: { node: '>=8' } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: is-docker: 2.2.1 + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + /isarray@1.0.0: - resolution: { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} /isarray@2.0.5: - resolution: { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } - dev: true + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} /isexe@2.0.0: - resolution: { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} /isexe@3.1.1: - resolution: { integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== } - engines: { node: '>=16' } + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} dev: true /isobject@3.0.1: - resolution: { integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} /isomorphic-webcrypto@2.3.8(expo@48.0.20)(react-native@0.71.13): - resolution: { integrity: sha512-XddQSI0WYlSCjxtm1AI8kWQOulf7hAN3k3DclF1sxDJZqOe0pcsOt675zvWW91cZH9hYs3nlA3Ev8QK5i80SxQ== } + resolution: {integrity: sha512-XddQSI0WYlSCjxtm1AI8kWQOulf7hAN3k3DclF1sxDJZqOe0pcsOt675zvWW91cZH9hYs3nlA3Ev8QK5i80SxQ==} dependencies: '@peculiar/webcrypto': 1.4.3 asmcrypto.js: 0.22.0 @@ -8617,18 +11986,17 @@ packages: transitivePeerDependencies: - expo - react-native - dev: false /istanbul-lib-coverage@3.2.0: - resolution: { integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} dev: true /istanbul-lib-instrument@5.2.1: - resolution: { integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -8638,10 +12006,10 @@ packages: dev: true /istanbul-lib-instrument@6.0.0: - resolution: { integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} + engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/parser': 7.23.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -8651,8 +12019,8 @@ packages: dev: true /istanbul-lib-report@3.0.1: - resolution: { integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 @@ -8660,8 +12028,8 @@ packages: dev: true /istanbul-lib-source-maps@4.0.1: - resolution: { integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} dependencies: debug: 4.3.5 istanbul-lib-coverage: 3.2.0 @@ -8671,16 +12039,16 @@ packages: dev: true /istanbul-reports@3.1.6: - resolution: { integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 dev: true /jackspeak@2.3.6: - resolution: { integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== } - engines: { node: '>=14' } + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -8688,8 +12056,8 @@ packages: dev: true /jake@10.8.7: - resolution: { integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} + engines: {node: '>=10'} hasBin: true dependencies: async: 3.2.4 @@ -8699,8 +12067,8 @@ packages: dev: true /jest-changed-files@29.7.0: - resolution: { integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 jest-util: 29.7.0 @@ -8708,8 +12076,8 @@ packages: dev: true /jest-circus@29.7.0: - resolution: { integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -8737,8 +12105,8 @@ packages: dev: true /jest-cli@29.7.0(@types/node@18.18.0): - resolution: { integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8765,8 +12133,8 @@ packages: dev: true /jest-cli@29.7.0(@types/node@18.19.39): - resolution: { integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8793,8 +12161,8 @@ packages: dev: true /jest-cli@29.7.0(@types/node@18.19.39)(ts-node@10.9.2): - resolution: { integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8821,8 +12189,8 @@ packages: dev: true /jest-config@29.7.0(@types/node@18.18.0): - resolution: { integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -8832,11 +12200,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.18.0 - babel-jest: 29.7.0(@babel/core@7.23.0) + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -8861,8 +12229,8 @@ packages: dev: true /jest-config@29.7.0(@types/node@18.19.39)(ts-node@10.9.2): - resolution: { integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -8872,11 +12240,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.19.39 - babel-jest: 29.7.0(@babel/core@7.23.0) + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 @@ -8902,8 +12270,8 @@ packages: dev: true /jest-diff@29.7.0: - resolution: { integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 @@ -8912,15 +12280,15 @@ packages: dev: true /jest-docblock@29.7.0: - resolution: { integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 dev: true /jest-each@29.7.0: - resolution: { integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -8930,8 +12298,8 @@ packages: dev: true /jest-environment-node@29.7.0: - resolution: { integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8941,17 +12309,17 @@ packages: jest-util: 29.7.0 /jest-get-type@26.3.0: - resolution: { integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== } - engines: { node: '>= 10.14.2' } + resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} + engines: {node: '>= 10.14.2'} /jest-get-type@29.6.3: - resolution: { integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /jest-haste-map@29.7.0: - resolution: { integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.7 @@ -8969,8 +12337,8 @@ packages: dev: true /jest-junit@16.0.0: - resolution: { integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ== } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} + engines: {node: '>=10.12.0'} dependencies: mkdirp: 1.0.4 strip-ansi: 6.0.1 @@ -8979,16 +12347,16 @@ packages: dev: true /jest-leak-detector@29.7.0: - resolution: { integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 dev: true /jest-matcher-utils@29.7.0: - resolution: { integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 jest-diff: 29.7.0 @@ -8997,8 +12365,8 @@ packages: dev: true /jest-message-util@29.7.0: - resolution: { integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.22.13 '@jest/types': 29.6.3 @@ -9011,16 +12379,16 @@ packages: stack-utils: 2.0.6 /jest-mock@29.7.0: - resolution: { integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 18.19.39 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: { integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== } - engines: { node: '>=6' } + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} peerDependencies: jest-resolve: '*' peerDependenciesMeta: @@ -9031,17 +12399,17 @@ packages: dev: true /jest-regex-util@27.5.1: - resolution: { integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} /jest-regex-util@29.6.3: - resolution: { integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true /jest-resolve-dependencies@29.7.0: - resolution: { integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 @@ -9050,8 +12418,8 @@ packages: dev: true /jest-resolve@29.7.0: - resolution: { integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -9064,9 +12432,15 @@ packages: slash: 3.0.0 dev: true + /jest-resolver-enhanced@1.1.0: + resolution: {integrity: sha512-UZhPMZ1iHXPnK5veN/Ywd25oaGesFi0FLbRxGlNv0EsEchmK0WH+q0S9n/7QFbomnxT4wOxzICEKgchRBACzVQ==} + dependencies: + enhanced-resolve: 5.17.0 + dev: true + /jest-runner@29.7.0: - resolution: { integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -9094,8 +12468,8 @@ packages: dev: true /jest-runtime@29.7.0: - resolution: { integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -9124,25 +12498,25 @@ packages: dev: true /jest-serializer@27.5.1: - resolution: { integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/node': 18.19.39 graceful-fs: 4.2.11 /jest-snapshot@29.7.0: - resolution: { integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.24.7) '@babel/types': 7.23.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -9159,8 +12533,8 @@ packages: dev: true /jest-util@27.5.1: - resolution: { integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== } - engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 '@types/node': 18.19.39 @@ -9170,8 +12544,8 @@ packages: picomatch: 2.3.1 /jest-util@29.7.0: - resolution: { integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 18.19.39 @@ -9181,8 +12555,8 @@ packages: picomatch: 2.3.1 /jest-validate@26.6.2: - resolution: { integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== } - engines: { node: '>= 10.14.2' } + resolution: {integrity: sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==} + engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 camelcase: 6.3.0 @@ -9192,8 +12566,8 @@ packages: pretty-format: 26.6.2 /jest-validate@29.7.0: - resolution: { integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -9204,8 +12578,8 @@ packages: dev: true /jest-watcher@29.7.0: - resolution: { integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -9218,16 +12592,16 @@ packages: dev: true /jest-worker@27.5.1: - resolution: { integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== } - engines: { node: '>= 10.13.0' } + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} dependencies: '@types/node': 18.19.39 merge-stream: 2.0.0 supports-color: 8.1.1 /jest-worker@29.7.0: - resolution: { integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 18.19.39 jest-util: 29.7.0 @@ -9236,8 +12610,8 @@ packages: dev: true /jest@29.7.0(@types/node@18.18.0): - resolution: { integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -9257,8 +12631,8 @@ packages: dev: true /jest@29.7.0(@types/node@18.19.39): - resolution: { integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -9278,8 +12652,8 @@ packages: dev: true /jest@29.7.0(@types/node@18.19.39)(ts-node@10.9.2): - resolution: { integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -9299,10 +12673,10 @@ packages: dev: true /jimp-compact@0.16.1: - resolution: { integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww== } + resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} /joi@17.10.2: - resolution: { integrity: sha512-hcVhjBxRNW/is3nNLdGLIjkgXetkeGc2wyhydhz8KumG23Aerk4HPjU5zaPAMRqXQFc0xNqXTC7+zQjxr0GlKA== } + resolution: {integrity: sha512-hcVhjBxRNW/is3nNLdGLIjkgXetkeGc2wyhydhz8KumG23Aerk4HPjU5zaPAMRqXQFc0xNqXTC7+zQjxr0GlKA==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -9311,65 +12685,65 @@ packages: '@sideway/pinpoint': 2.0.0 /join-component@1.1.0: - resolution: { integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ== } + resolution: {integrity: sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==} /jose@4.14.6: - resolution: { integrity: sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ== } + resolution: {integrity: sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ==} /jose@4.15.9: - resolution: { integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== } + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} /js-base64@3.7.7: - resolution: { integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw== } + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} dev: false /js-binary-schema-parser@2.0.3: - resolution: { integrity: sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg== } + resolution: {integrity: sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg==} dev: false /js-sha3@0.8.0: - resolution: { integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== } + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: true /js-tokens@4.0.0: - resolution: { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} /js-yaml@3.14.1: - resolution: { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 /js-yaml@4.1.0: - resolution: { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 /jsc-android@250231.0.0: - resolution: { integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== } + resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} /jsc-safe-url@0.2.4: - resolution: { integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== } + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} /jscodeshift@0.14.0(@babel/preset-env@7.22.20): - resolution: { integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== } + resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/parser': 7.23.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.0) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.23.0) - '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.23.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) '@babel/preset-env': 7.22.20(@babel/core@7.23.0) - '@babel/preset-flow': 7.22.15(@babel/core@7.23.0) - '@babel/preset-typescript': 7.23.0(@babel/core@7.23.0) - '@babel/register': 7.22.15(@babel/core@7.23.0) - babel-core: 7.0.0-bridge.0(@babel/core@7.23.0) + '@babel/preset-flow': 7.22.15(@babel/core@7.24.7) + '@babel/preset-typescript': 7.23.0(@babel/core@7.24.7) + '@babel/register': 7.22.15(@babel/core@7.24.7) + babel-core: 7.0.0-bridge.0(@babel/core@7.24.7) chalk: 4.1.2 flow-parser: 0.185.2 graceful-fs: 4.2.11 @@ -9383,43 +12757,44 @@ packages: - supports-color /jsep@0.3.5: - resolution: { integrity: sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA== } - engines: { node: '>= 6.0.0' } + resolution: {integrity: sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==} + engines: {node: '>= 6.0.0'} dev: false /jsesc@0.5.0: - resolution: { integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== } + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true /jsesc@2.5.2: - resolution: { integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} hasBin: true /json-buffer@3.0.1: - resolution: { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: true /json-parse-better-errors@1.0.2: - resolution: { integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== } + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} /json-parse-even-better-errors@2.3.1: - resolution: { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true - /json-parse-even-better-errors@3.0.0: - resolution: { integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + /json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /json-parse-even-better-errors@3.0.2: - resolution: { integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + /json-pointer@0.6.2: + resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==} + dependencies: + foreach: 2.0.6 dev: true /json-schema-deref-sync@0.13.0: - resolution: { integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==} + engines: {node: '>=6.0.0'} dependencies: clone: 2.1.2 dag-map: 1.0.2 @@ -9431,60 +12806,59 @@ packages: valid-url: 1.0.9 /json-schema-traverse@0.4.1: - resolution: { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true /json-schema-traverse@1.0.0: - resolution: { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } - dev: false + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} /json-stable-stringify-without-jsonify@1.0.1: - resolution: { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true /json-stringify-nice@1.1.4: - resolution: { integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== } + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} dev: true /json-stringify-safe@5.0.1: - resolution: { integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== } + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true /json5@0.5.1: - resolution: { integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== } + resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} hasBin: true /json5@1.0.2: - resolution: { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 dev: true /json5@2.2.3: - resolution: { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true /jsonc-parser@3.2.0: - resolution: { integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== } + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true /jsonfile@4.0.0: - resolution: { integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== } + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 /jsonfile@6.1.0: - resolution: { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 /jsonld-checker@0.1.8: - resolution: { integrity: sha512-jclmnPRrm5SEpaIV6IiSTJxplRAqIWHduQLsUfrYpZM41Ng48m1RN2/aUyHze/ynfO0D2UhlJBt8SdObsH5GBw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-jclmnPRrm5SEpaIV6IiSTJxplRAqIWHduQLsUfrYpZM41Ng48m1RN2/aUyHze/ynfO0D2UhlJBt8SdObsH5GBw==} + engines: {node: '>=10'} dependencies: jsonld: 5.2.0 node-fetch: 2.6.12 @@ -9494,13 +12868,25 @@ packages: dev: true /jsonld-document-loader@1.2.1: - resolution: { integrity: sha512-CtFyIBZApeVvs6QgyS7Gcp8h1dUs+1XNHcV4Sr6O9ItPaL0hVgqe47Tgs3RNH0A5Bc4p3UFPKAJVHKSOQq4mhQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-CtFyIBZApeVvs6QgyS7Gcp8h1dUs+1XNHcV4Sr6O9ItPaL0hVgqe47Tgs3RNH0A5Bc4p3UFPKAJVHKSOQq4mhQ==} + engines: {node: '>=12'} dev: false + /jsonld-signatures@11.2.1: + resolution: {integrity: sha512-RNaHTEeRrX0jWeidPCwxMq/E/Ze94zFyEZz/v267ObbCHQlXhPO7GtkY6N5PSHQfQhZPXa8NlMBg5LiDF4dNbA==} + engines: {node: '>=14'} + dependencies: + '@digitalbazaar/security-context': 1.0.1 + jsonld: 8.3.2 + serialize-error: 8.1.0 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + /jsonld@5.2.0: - resolution: { integrity: sha512-JymgT6Xzk5CHEmHuEyvoTNviEPxv6ihLWSPu1gFdtjSAyM6cFqNrv02yS/SIur3BBIkCf0HjizRc24d8/FfQKw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-JymgT6Xzk5CHEmHuEyvoTNviEPxv6ihLWSPu1gFdtjSAyM6cFqNrv02yS/SIur3BBIkCf0HjizRc24d8/FfQKw==} + engines: {node: '>=12'} dependencies: '@digitalbazaar/http-client': 1.2.0 canonicalize: 1.0.8 @@ -9511,52 +12897,90 @@ packages: - web-streams-polyfill dev: true + /jsonld@8.3.2: + resolution: {integrity: sha512-MwBbq95szLwt8eVQ1Bcfwmgju/Y5P2GdtlHE2ncyfuYjIdEhluUVyj1eudacf1mOkWIoS9GpDBTECqhmq7EOaA==} + engines: {node: '>=14'} + dependencies: + '@digitalbazaar/http-client': 3.4.1 + canonicalize: 1.0.8 + lru-cache: 6.0.0 + rdf-canonize: 3.4.0 + transitivePeerDependencies: + - encoding + - web-streams-polyfill + dev: true + /jsonparse@1.3.1: - resolution: { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== } - engines: { '0': node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} dev: true /just-diff-apply@5.5.0: - resolution: { integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== } + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} dev: true /just-diff@6.0.2: - resolution: { integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== } + resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} dev: true /jwt-decode@3.1.2: - resolution: { integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== } + resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: false /jwt-decode@4.0.0: - resolution: { integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA== } - engines: { node: '>=18' } - dev: false + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + /key-encoder@2.0.3: + resolution: {integrity: sha512-fgBtpAGIr/Fy5/+ZLQZIPPhsZEcbSlYu/Wu96tNDFNSjSACw5lEIOFeaVdQ/iwrb8oxjlWi6wmWdH76hV6GZjg==} + dependencies: + '@types/elliptic': 6.4.18 + asn1.js: 5.4.1 + bn.js: 4.12.0 + elliptic: 6.5.4 + dev: true /keygrip@1.1.0: - resolution: { integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} dependencies: tsscmp: 1.0.6 dev: false /keyv@4.5.3: - resolution: { integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== } + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 dev: true /kind-of@6.0.3: - resolution: { integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} /kleur@3.0.3: - resolution: { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } - engines: { node: '>=6' } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + /ky-universal@0.11.0(ky@0.33.3): + resolution: {integrity: sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==} + engines: {node: '>=14.16'} + peerDependencies: + ky: '>=0.31.4' + web-streams-polyfill: '>=3.2.1' + peerDependenciesMeta: + web-streams-polyfill: + optional: true + dependencies: + abort-controller: 3.0.0 + ky: 0.33.3 + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: true /ky-universal@0.8.2(ky@0.25.1): - resolution: { integrity: sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ== } - engines: { node: '>=10.17' } + resolution: {integrity: sha512-xe0JaOH9QeYxdyGLnzUOVGK4Z6FGvDVzcXFTdrYA1f33MZdEa45sUDaMBy98xQMcsd2XIBrTXRrRYnegcSdgVQ==} + engines: {node: '>=10.17'} peerDependencies: ky: '>=0.17.0' web-streams-polyfill: '>=2.0.0' @@ -9571,12 +12995,28 @@ packages: - encoding /ky@0.25.1: - resolution: { integrity: sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-PjpCEWlIU7VpiMVrTwssahkYXX1by6NCT0fhTUX34F3DTinARlgMpriuroolugFPcMgpPWrOW4mTb984Qm1RXA==} + engines: {node: '>=10'} + + /ky@0.33.3: + resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==} + engines: {node: '>=14.16'} + dev: true + + /language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + dev: false + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.23 + dev: false /lerna-changelog@2.2.0: - resolution: { integrity: sha512-yjYNAHrbnw8xYFKmYWJEP52Tk4xSdlNmzpYr26+3glbSGDmpe8UMo8f9DlEntjGufL+opup421oVTXcLshwAaQ== } - engines: { node: 12.* || 14.* || >= 16 } + resolution: {integrity: sha512-yjYNAHrbnw8xYFKmYWJEP52Tk4xSdlNmzpYr26+3glbSGDmpe8UMo8f9DlEntjGufL+opup421oVTXcLshwAaQ==} + engines: {node: 12.* || 14.* || >= 16} hasBin: true dependencies: chalk: 4.1.2 @@ -9593,8 +13033,8 @@ packages: dev: true /lerna@8.1.6: - resolution: { integrity: sha512-O3zSX/dmchMVy9m37DD1BCx7X68nS5lZFECjqG7Siiv3+KgqKXHnF4JQPJUDD/vG2qBQv5StpXCyqGxR0XJVAQ== } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-O3zSX/dmchMVy9m37DD1BCx7X68nS5lZFECjqG7Siiv3+KgqKXHnF4JQPJUDD/vG2qBQv5StpXCyqGxR0XJVAQ==} + engines: {node: '>=18.0.0'} hasBin: true dependencies: '@lerna/create': 8.1.6(typescript@5.5.3) @@ -9688,20 +13128,28 @@ packages: dev: true /leven@3.1.0: - resolution: { integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== } - engines: { node: '>=6' } + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: false /levn@0.4.1: - resolution: { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 dev: true /libnpmaccess@8.0.6: - resolution: { integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: npm-package-arg: 11.0.2 npm-registry-fetch: 17.1.0 @@ -9710,8 +13158,8 @@ packages: dev: true /libnpmpublish@9.0.9: - resolution: { integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: ci-info: 4.0.0 normalize-package-data: 6.0.2 @@ -9726,16 +13174,16 @@ packages: dev: true /lines-and-columns@1.2.4: - resolution: { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} /lines-and-columns@2.0.3: - resolution: { integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /load-json-file@4.0.0: - resolution: { integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 @@ -9744,8 +13192,8 @@ packages: dev: true /load-json-file@6.2.0: - resolution: { integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} dependencies: graceful-fs: 4.2.11 parse-json: 5.2.0 @@ -9754,93 +13202,97 @@ packages: dev: true /locate-path@2.0.0: - resolution: { integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} dependencies: p-locate: 2.0.0 path-exists: 3.0.0 dev: true /locate-path@3.0.0: - resolution: { integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== } - engines: { node: '>=6' } + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 /locate-path@5.0.0: - resolution: { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} dependencies: p-locate: 4.1.0 /locate-path@6.0.0: - resolution: { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 /locate-path@7.2.0: - resolution: { integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 dev: true /lodash.camelcase@4.3.0: - resolution: { integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== } + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} requiresBuild: true dev: true optional: true + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: true + /lodash.debounce@4.0.8: - resolution: { integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== } + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} /lodash.get@4.4.2: - resolution: { integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== } + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true /lodash.isequal@4.5.0: - resolution: { integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== } + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} dev: true /lodash.ismatch@4.4.0: - resolution: { integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== } + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true /lodash.isplainobject@4.0.6: - resolution: { integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== } + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} dev: true /lodash.memoize@4.1.2: - resolution: { integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== } + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true /lodash.merge@4.6.2: - resolution: { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true /lodash.throttle@4.1.1: - resolution: { integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== } + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} /lodash@4.17.21: - resolution: { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} /log-symbols@2.2.0: - resolution: { integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} + engines: {node: '>=4'} dependencies: chalk: 2.4.2 /log-symbols@4.1.0: - resolution: { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 /logkitty@0.7.1: - resolution: { integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== } + resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} hasBin: true dependencies: ansi-fragments: 0.2.1 @@ -9848,65 +13300,65 @@ packages: yargs: 15.4.1 /loose-envify@1.4.0: - resolution: { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 /lru-cache@10.0.1: - resolution: { integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== } - engines: { node: 14 || >=16.14 } + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} dev: true /lru-cache@10.3.1: - resolution: { integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g== } - engines: { node: '>=18' } + resolution: {integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==} + engines: {node: '>=18'} dev: true /lru-cache@5.1.1: - resolution: { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 /lru-cache@6.0.0: - resolution: { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 /lru-cache@7.18.3: - resolution: { integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} dev: true /make-dir@2.1.0: - resolution: { integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} dependencies: pify: 4.0.1 semver: 5.7.2 /make-dir@3.1.0: - resolution: { integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} requiresBuild: true dependencies: semver: 6.3.1 /make-dir@4.0.0: - resolution: { integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: semver: 7.5.4 dev: true /make-error@1.3.6: - resolution: { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true /make-fetch-happen@13.0.0: - resolution: { integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/agent': 2.2.2 cacache: 18.0.2 @@ -9924,8 +13376,8 @@ packages: dev: true /make-fetch-happen@9.1.0: - resolution: { integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} dependencies: agentkeepalive: 4.5.0 cacache: 15.3.0 @@ -9949,35 +13401,35 @@ packages: dev: true /make-promises-safe@5.1.0: - resolution: { integrity: sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g== } + resolution: {integrity: sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g==} requiresBuild: true dev: true optional: true /makeerror@1.0.12: - resolution: { integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== } + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 /map-obj@1.0.1: - resolution: { integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} dev: true /map-obj@4.3.0: - resolution: { integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} dev: true /md5-file@3.2.3: - resolution: { integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw== } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==} + engines: {node: '>=0.10'} hasBin: true dependencies: buffer-alloc: 1.2.0 /md5.js@1.3.5: - resolution: { integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== } + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 @@ -9985,40 +13437,47 @@ packages: dev: true /md5@2.2.1: - resolution: { integrity: sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ== } + resolution: {integrity: sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==} dependencies: charenc: 0.0.2 crypt: 0.0.2 is-buffer: 1.1.6 /md5@2.3.0: - resolution: { integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== } + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} dependencies: charenc: 0.0.2 crypt: 0.0.2 is-buffer: 1.1.6 /md5hex@1.0.0: - resolution: { integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ== } + resolution: {integrity: sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==} /media-typer@0.3.0: - resolution: { integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} /memoize-one@5.2.1: - resolution: { integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== } + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + + /memoize@10.0.0: + resolution: {integrity: sha512-H6cBLgsi6vMWOcCpvVCdFFnl3kerEXbrYh9q+lY6VXvQSmM6CkmV08VOwT+WE2tzIEqRPFfAq3fm4v/UIW6mSA==} + engines: {node: '>=18'} + dependencies: + mimic-function: 5.0.1 + dev: true /memory-cache@0.2.0: - resolution: { integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA== } + resolution: {integrity: sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==} /memorystream@0.3.1: - resolution: { integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} dev: true /meow@11.0.0: - resolution: { integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} + engines: {node: '>=14.16'} dependencies: '@types/minimist': 1.2.3 camelcase-keys: 8.0.2 @@ -10034,9 +13493,14 @@ packages: yargs-parser: 21.1.1 dev: true + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true + /meow@8.1.2: - resolution: { integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} dependencies: '@types/minimist': 1.2.3 camelcase-keys: 6.2.2 @@ -10052,24 +13516,24 @@ packages: dev: true /merge-descriptors@1.0.1: - resolution: { integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== } + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false /merge-stream@2.0.0: - resolution: { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} /merge2@1.4.1: - resolution: { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} /methods@1.1.2: - resolution: { integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} /metro-babel-transformer@0.73.10: - resolution: { integrity: sha512-Yv2myTSnpzt/lTyurLvqYbBkytvUJcLHN8XD3t7W6rGiLTQPzmf1zypHQLphvcAXtCWBOXFtH7KLOSi2/qMg+A== } + resolution: {integrity: sha512-Yv2myTSnpzt/lTyurLvqYbBkytvUJcLHN8XD3t7W6rGiLTQPzmf1zypHQLphvcAXtCWBOXFtH7KLOSi2/qMg+A==} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 hermes-parser: 0.8.0 metro-source-map: 0.73.10 nullthrows: 1.1.1 @@ -10077,16 +13541,16 @@ packages: - supports-color /metro-cache-key@0.73.10: - resolution: { integrity: sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw== } + resolution: {integrity: sha512-JMVDl/EREDiUW//cIcUzRjKSwE2AFxVWk47cFBer+KA4ohXIG2CQPEquT56hOw1Y1s6gKNxxs1OlAOEsubrFjw==} /metro-cache@0.73.10: - resolution: { integrity: sha512-wPGlQZpdVlM404m7MxJqJ+hTReDr5epvfPbt2LerUAHY9RN99w61FeeAe25BMZBwgUgDtAsfGlJ51MBHg8MAqw== } + resolution: {integrity: sha512-wPGlQZpdVlM404m7MxJqJ+hTReDr5epvfPbt2LerUAHY9RN99w61FeeAe25BMZBwgUgDtAsfGlJ51MBHg8MAqw==} dependencies: metro-core: 0.73.10 rimraf: 3.0.2 /metro-config@0.73.10: - resolution: { integrity: sha512-wIlybd1Z9I8K2KcStTiJxTB7OK529dxFgogNpKCTU/3DxkgAASqSkgXnZP6kVyqjh5EOWAKFe5U6IPic7kXDdQ== } + resolution: {integrity: sha512-wIlybd1Z9I8K2KcStTiJxTB7OK529dxFgogNpKCTU/3DxkgAASqSkgXnZP6kVyqjh5EOWAKFe5U6IPic7kXDdQ==} dependencies: cosmiconfig: 5.2.1 jest-validate: 26.6.2 @@ -10101,13 +13565,13 @@ packages: - utf-8-validate /metro-core@0.73.10: - resolution: { integrity: sha512-5uYkajIxKyL6W45iz/ftNnYPe1l92CvF2QJeon1CHsMXkEiOJxEjo41l+iSnO/YodBGrmMCyupSO4wOQGUc0lw== } + resolution: {integrity: sha512-5uYkajIxKyL6W45iz/ftNnYPe1l92CvF2QJeon1CHsMXkEiOJxEjo41l+iSnO/YodBGrmMCyupSO4wOQGUc0lw==} dependencies: lodash.throttle: 4.1.1 metro-resolver: 0.73.10 /metro-file-map@0.73.10: - resolution: { integrity: sha512-XOMWAybeaXyD6zmVZPnoCCL2oO3rp4ta76oUlqWP0skBzhFxVtkE/UtDwApEMUY361JeBBago647gnKiARs+1g== } + resolution: {integrity: sha512-XOMWAybeaXyD6zmVZPnoCCL2oO3rp4ta76oUlqWP0skBzhFxVtkE/UtDwApEMUY361JeBBago647gnKiARs+1g==} dependencies: abort-controller: 3.0.0 anymatch: 3.1.3 @@ -10128,10 +13592,10 @@ packages: - supports-color /metro-hermes-compiler@0.73.10: - resolution: { integrity: sha512-rTRWEzkVrwtQLiYkOXhSdsKkIObnL+Jqo+IXHI7VEK2aSLWRAbtGNqECBs44kbOUypDYTFFE+WLtoqvUWqYkWg== } + resolution: {integrity: sha512-rTRWEzkVrwtQLiYkOXhSdsKkIObnL+Jqo+IXHI7VEK2aSLWRAbtGNqECBs44kbOUypDYTFFE+WLtoqvUWqYkWg==} /metro-inspector-proxy@0.73.10: - resolution: { integrity: sha512-CEEvocYc5xCCZBtGSIggMCiRiXTrnBbh8pmjKQqm9TtJZALeOGyt5pXUaEkKGnhrXETrexsg6yIbsQHhEvVfvQ== } + resolution: {integrity: sha512-CEEvocYc5xCCZBtGSIggMCiRiXTrnBbh8pmjKQqm9TtJZALeOGyt5pXUaEkKGnhrXETrexsg6yIbsQHhEvVfvQ==} hasBin: true dependencies: connect: 3.7.0 @@ -10144,17 +13608,17 @@ packages: - utf-8-validate /metro-minify-terser@0.73.10: - resolution: { integrity: sha512-uG7TSKQ/i0p9kM1qXrwbmY3v+6BrMItsOcEXcSP8Z+68bb+t9HeVK0T/hIfUu1v1PEnonhkhfzVsaP8QyTd5lQ== } + resolution: {integrity: sha512-uG7TSKQ/i0p9kM1qXrwbmY3v+6BrMItsOcEXcSP8Z+68bb+t9HeVK0T/hIfUu1v1PEnonhkhfzVsaP8QyTd5lQ==} dependencies: terser: 5.20.0 /metro-minify-uglify@0.73.10: - resolution: { integrity: sha512-eocnSeJKnLz/UoYntVFhCJffED7SLSgbCHgNvI6ju6hFb6EFHGJT9OLbkJWeXaWBWD3Zw5mYLS8GGqGn/CHZPA== } + resolution: {integrity: sha512-eocnSeJKnLz/UoYntVFhCJffED7SLSgbCHgNvI6ju6hFb6EFHGJT9OLbkJWeXaWBWD3Zw5mYLS8GGqGn/CHZPA==} dependencies: uglify-es: 3.3.9 /metro-react-native-babel-preset@0.73.10(@babel/core@7.23.0): - resolution: { integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ== } + resolution: {integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==} peerDependencies: '@babel/core': '*' dependencies: @@ -10199,8 +13663,54 @@ packages: transitivePeerDependencies: - supports-color + /metro-react-native-babel-preset@0.73.10(@babel/core@7.24.7): + resolution: {integrity: sha512-1/dnH4EHwFb2RKEKx34vVDpUS3urt2WEeR8FYim+ogqALg4sTpG7yeQPxWpbgKATezt4rNfqAANpIyH19MS4BQ==} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.7) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-export-default-from': 7.22.17(@babel/core@7.24.7) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.7) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.7) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.7) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-block-scoping': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-classes': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-destructuring': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.23.0(@babel/core@7.24.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-parameters': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-runtime': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.22.15(@babel/core@7.24.7) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.24.7) + '@babel/template': 7.22.15 + react-refresh: 0.4.3 + transitivePeerDependencies: + - supports-color + /metro-react-native-babel-preset@0.73.9(@babel/core@7.23.0): - resolution: { integrity: sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw== } + resolution: {integrity: sha512-AoD7v132iYDV4K78yN2OLgTPwtAKn0XlD2pOhzyBxiI8PeXzozhbKyPV7zUOJUPETj+pcEVfuYj5ZN/8+bhbCw==} peerDependencies: '@babel/core': '*' dependencies: @@ -10246,7 +13756,7 @@ packages: - supports-color /metro-react-native-babel-transformer@0.73.10(@babel/core@7.23.0): - resolution: { integrity: sha512-4G/upwqKdmKEjmsNa92/NEgsOxUWOygBVs+FXWfXWKgybrmcjh3NoqdRYrROo9ZRA/sB9Y/ZXKVkWOGKHtGzgg== } + resolution: {integrity: sha512-4G/upwqKdmKEjmsNa92/NEgsOxUWOygBVs+FXWfXWKgybrmcjh3NoqdRYrROo9ZRA/sB9Y/ZXKVkWOGKHtGzgg==} peerDependencies: '@babel/core': '*' dependencies: @@ -10261,18 +13771,18 @@ packages: - supports-color /metro-resolver@0.73.10: - resolution: { integrity: sha512-HeXbs+0wjakaaVQ5BI7eT7uqxlZTc9rnyw6cdBWWMgUWB++KpoI0Ge7Hi6eQAOoVAzXC3m26mPFYLejpzTWjng== } + resolution: {integrity: sha512-HeXbs+0wjakaaVQ5BI7eT7uqxlZTc9rnyw6cdBWWMgUWB++KpoI0Ge7Hi6eQAOoVAzXC3m26mPFYLejpzTWjng==} dependencies: absolute-path: 0.0.0 /metro-runtime@0.73.10: - resolution: { integrity: sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow== } + resolution: {integrity: sha512-EpVKm4eN0Fgx2PEWpJ5NiMArV8zVoOin866jIIvzFLpmkZz1UEqgjf2JAfUJnjgv3fjSV3JqeGG2vZCaGQBTow==} dependencies: '@babel/runtime': 7.23.1 react-refresh: 0.4.3 /metro-source-map@0.73.10: - resolution: { integrity: sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw== } + resolution: {integrity: sha512-NAGv14701p/YaFZ76KzyPkacBw/QlEJF1f8elfs23N1tC33YyKLDKvPAzFJiYqjdcFvuuuDCA8JCXd2TgLxNPw==} dependencies: '@babel/traverse': 7.23.0 '@babel/types': 7.23.0 @@ -10286,8 +13796,8 @@ packages: - supports-color /metro-symbolicate@0.73.10: - resolution: { integrity: sha512-PmCe3TOe1c/NVwMlB+B17me951kfkB3Wve5RqJn+ErPAj93od1nxicp6OJe7JT4QBRnpUP8p9tw2sHKqceIzkA== } - engines: { node: '>=8.3' } + resolution: {integrity: sha512-PmCe3TOe1c/NVwMlB+B17me951kfkB3Wve5RqJn+ErPAj93od1nxicp6OJe7JT4QBRnpUP8p9tw2sHKqceIzkA==} + engines: {node: '>=8.3'} hasBin: true dependencies: invariant: 2.2.4 @@ -10300,9 +13810,9 @@ packages: - supports-color /metro-transform-plugins@0.73.10: - resolution: { integrity: sha512-D4AgD3Vsrac+4YksaPmxs/0ocT67bvwTkFSIgWWeDvWwIG0U1iHzTS9f8Bvb4PITnXryDoFtjI6OWF7uOpGxpA== } + resolution: {integrity: sha512-D4AgD3Vsrac+4YksaPmxs/0ocT67bvwTkFSIgWWeDvWwIG0U1iHzTS9f8Bvb4PITnXryDoFtjI6OWF7uOpGxpA==} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/generator': 7.23.0 '@babel/template': 7.22.15 '@babel/traverse': 7.23.0 @@ -10311,13 +13821,13 @@ packages: - supports-color /metro-transform-worker@0.73.10: - resolution: { integrity: sha512-IySvVubudFxahxOljWtP0QIMMpgUrCP0bW16cz2Enof0PdumwmR7uU3dTbNq6S+XTzuMHR+076aIe4VhPAWsIQ== } + resolution: {integrity: sha512-IySvVubudFxahxOljWtP0QIMMpgUrCP0bW16cz2Enof0PdumwmR7uU3dTbNq6S+XTzuMHR+076aIe4VhPAWsIQ==} dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/generator': 7.23.0 '@babel/parser': 7.23.0 '@babel/types': 7.23.0 - babel-preset-fbjs: 3.4.0(@babel/core@7.23.0) + babel-preset-fbjs: 3.4.0(@babel/core@7.24.7) metro: 0.73.10 metro-babel-transformer: 0.73.10 metro-cache: 0.73.10 @@ -10333,11 +13843,11 @@ packages: - utf-8-validate /metro@0.73.10: - resolution: { integrity: sha512-J2gBhNHFtc/Z48ysF0B/bfTwUwaRDLjNv7egfhQCc+934dpXcjJG2KZFeuybF+CvA9vo4QUi56G2U+RSAJ5tsA== } + resolution: {integrity: sha512-J2gBhNHFtc/Z48ysF0B/bfTwUwaRDLjNv7egfhQCc+934dpXcjJG2KZFeuybF+CvA9vo4QUi56G2U+RSAJ5tsA==} hasBin: true dependencies: '@babel/code-frame': 7.22.13 - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 '@babel/generator': 7.23.0 '@babel/parser': 7.23.0 '@babel/template': 7.22.15 @@ -10369,7 +13879,7 @@ packages: metro-inspector-proxy: 0.73.10 metro-minify-terser: 0.73.10 metro-minify-uglify: 0.73.10 - metro-react-native-babel-preset: 0.73.10(@babel/core@7.23.0) + metro-react-native-babel-preset: 0.73.10(@babel/core@7.24.7) metro-resolver: 0.73.10 metro-runtime: 0.73.10 metro-source-map: 0.73.10 @@ -10394,112 +13904,117 @@ packages: - utf-8-validate /micromatch@4.0.5: - resolution: { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 /mime-db@1.52.0: - resolution: { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} /mime-types@2.1.35: - resolution: { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 /mime@1.6.0: - resolution: { integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true /mime@2.6.0: - resolution: { integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} hasBin: true /mimic-fn@1.2.0: - resolution: { integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} /mimic-fn@2.1.0: - resolution: { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} /mimic-fn@4.0.0: - resolution: { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} dev: true /mimic-response@2.1.0: - resolution: { integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} + engines: {node: '>=8'} dev: false /min-indent@1.0.1: - resolution: { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} dev: true /minimalistic-assert@1.0.1: - resolution: { integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== } + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true /minimalistic-crypto-utils@1.0.1: - resolution: { integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== } + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} dev: true /minimatch@3.0.5: - resolution: { integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== } + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} dependencies: brace-expansion: 1.1.11 dev: true /minimatch@3.1.2: - resolution: { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 /minimatch@5.1.6: - resolution: { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true /minimatch@7.4.6: - resolution: { integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: false /minimatch@8.0.4: - resolution: { integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true /minimatch@9.0.3: - resolution: { integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true /minimatch@9.0.5: - resolution: { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true /minimist-options@4.1.0: - resolution: { integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 @@ -10507,24 +14022,24 @@ packages: dev: true /minimist@1.2.8: - resolution: { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} /minipass-collect@1.0.2: - resolution: { integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 /minipass-collect@2.0.1: - resolution: { integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: minipass: 7.0.3 dev: true /minipass-fetch@1.4.1: - resolution: { integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 @@ -10534,8 +14049,8 @@ packages: dev: true /minipass-fetch@3.0.4: - resolution: { integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minipass: 7.0.3 minipass-sized: 1.0.3 @@ -10545,76 +14060,86 @@ packages: dev: true /minipass-flush@1.0.5: - resolution: { integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 /minipass-pipeline@1.2.4: - resolution: { integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} dependencies: minipass: 3.3.6 /minipass-sized@1.0.3: - resolution: { integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} dependencies: minipass: 3.3.6 dev: true /minipass@3.1.6: - resolution: { integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==} + engines: {node: '>=8'} dependencies: yallist: 4.0.0 /minipass@3.3.6: - resolution: { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} dependencies: yallist: 4.0.0 /minipass@4.2.8: - resolution: { integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} dev: true /minipass@5.0.0: - resolution: { integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} /minipass@7.0.3: - resolution: { integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + engines: {node: '>=16 || 14 >=14.17'} dev: true /minizlib@2.1.2: - resolution: { integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 yallist: 4.0.0 /mkdirp@0.5.6: - resolution: { integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== } + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true dependencies: minimist: 1.2.8 /mkdirp@1.0.4: - resolution: { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} hasBin: true + dev: true /modify-values@1.0.1: - resolution: { integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} dev: true /morgan@1.10.0: - resolution: { integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} dependencies: basic-auth: 2.0.1 debug: 2.6.9 @@ -10626,23 +14151,35 @@ packages: dev: false /ms@2.0.0: - resolution: { integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} /ms@2.1.2: - resolution: { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: - resolution: { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} /msrcrypto@1.5.8: - resolution: { integrity: sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q== } + resolution: {integrity: sha512-ujZ0TRuozHKKm6eGbKHfXef7f+esIhEckmThVnz7RNyiOJd7a6MXj2JGBoL9cnPDW+JMG16MoTUh5X+XXjI66Q==} + + /multibase@4.0.6: + resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + '@multiformats/base-x': 4.0.1 + dev: true + + /multiformats@12.1.3: + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} /multiformats@9.9.0: - resolution: { integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== } + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} /multimatch@5.0.0: - resolution: { integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} dependencies: '@types/minimatch': 3.0.5 array-differ: 3.0.0 @@ -10652,17 +14189,17 @@ packages: dev: true /mute-stream@0.0.8: - resolution: { integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== } + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true /mute-stream@1.0.0: - resolution: { integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /mv@2.1.1: - resolution: { integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg== } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==} + engines: {node: '>=0.8.0'} requiresBuild: true dependencies: mkdirp: 0.5.6 @@ -10671,40 +14208,46 @@ packages: optional: true /mz@2.7.0: - resolution: { integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 /nan@2.18.0: - resolution: { integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== } + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true dev: false /natural-compare-lite@1.4.0: - resolution: { integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== } + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} dev: true /natural-compare@1.4.0: - resolution: { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true /ncp@2.0.0: - resolution: { integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA== } + resolution: {integrity: sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==} hasBin: true requiresBuild: true optional: true /negotiator@0.6.3: - resolution: { integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} /neo-async@2.6.2: - resolution: { integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== } + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} /neon-cli@0.10.1: - resolution: { integrity: sha512-kOd9ELaYETe1J1nBEOYD7koAZVj6xR9TGwOPccAsWmwL5amkaXXXwXHCUHkBAWujlgSZY5f2pT+pFGkzoHExYQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-kOd9ELaYETe1J1nBEOYD7koAZVj6xR9TGwOPccAsWmwL5amkaXXXwXHCUHkBAWujlgSZY5f2pT+pFGkzoHExYQ==} + engines: {node: '>=8'} hasBin: true requiresBuild: true dependencies: @@ -10726,18 +14269,18 @@ packages: optional: true /nested-error-stacks@2.0.1: - resolution: { integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A== } + resolution: {integrity: sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==} /nice-try@1.0.5: - resolution: { integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== } + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} /nocache@3.0.4: - resolution: { integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} + engines: {node: '>=12.0.0'} /nock@13.5.4: - resolution: { integrity: sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw== } - engines: { node: '>= 10.13' } + resolution: {integrity: sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==} + engines: {node: '>= 10.13'} dependencies: debug: 4.3.5 json-stringify-safe: 5.0.1 @@ -10747,18 +14290,18 @@ packages: dev: true /node-addon-api@2.0.2: - resolution: { integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== } + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} dev: true /node-dir@0.1.17: - resolution: { integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== } - engines: { node: '>= 0.10.5' } + resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} + engines: {node: '>= 0.10.5'} dependencies: minimatch: 3.1.2 /node-fetch@2.6.12: - resolution: { integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -10768,17 +14311,17 @@ packages: whatwg-url: 5.0.0 /node-forge@1.3.1: - resolution: { integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== } - engines: { node: '>= 6.13.0' } + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} /node-gyp-build@4.6.1: - resolution: { integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== } + resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} hasBin: true dev: true /node-gyp@10.1.0: - resolution: { integrity: sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: env-paths: 2.2.1 @@ -10796,45 +14339,48 @@ packages: dev: true /node-int64@0.4.0: - resolution: { integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== } + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} /node-machine-id@1.1.12: - resolution: { integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== } + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} dev: true /node-releases@2.0.13: - resolution: { integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== } + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} /node-stream-zip@1.15.0: - resolution: { integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} + engines: {node: '>=0.12.0'} /nopt@5.0.0: - resolution: { integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} hasBin: true requiresBuild: true dependencies: abbrev: 1.1.1 /nopt@7.2.0: - resolution: { integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: abbrev: 2.0.0 dev: true /nopt@7.2.1: - resolution: { integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: abbrev: 2.0.0 dev: true /normalize-package-data@2.5.0: - resolution: { integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== } + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 resolve: 1.22.6 @@ -10843,8 +14389,8 @@ packages: dev: true /normalize-package-data@3.0.3: - resolution: { integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.0 @@ -10853,8 +14399,8 @@ packages: dev: true /normalize-package-data@4.0.1: - resolution: { integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: hosted-git-info: 5.2.1 is-core-module: 2.13.0 @@ -10862,60 +14408,50 @@ packages: validate-npm-package-license: 3.0.4 dev: true - /normalize-package-data@6.0.0: - resolution: { integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== } - engines: { node: ^16.14.0 || >=18.0.0 } - dependencies: - hosted-git-info: 7.0.1 - is-core-module: 2.13.0 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@6.0.2: - resolution: { integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 7.0.1 + hosted-git-info: 7.0.2 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true /normalize-path@3.0.0: - resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} /npm-bundled@3.0.0: - resolution: { integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: npm-normalize-package-bin: 3.0.1 dev: true /npm-install-checks@6.2.0: - resolution: { integrity: sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 dev: true /npm-normalize-package-bin@3.0.1: - resolution: { integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /npm-package-arg@11.0.2: - resolution: { integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: - hosted-git-info: 7.0.1 + hosted-git-info: 7.0.2 proc-log: 4.2.0 semver: 7.5.4 validate-npm-package-name: 5.0.1 dev: true /npm-package-arg@7.0.0: - resolution: { integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g== } + resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} dependencies: hosted-git-info: 3.0.8 osenv: 0.1.5 @@ -10923,15 +14459,15 @@ packages: validate-npm-package-name: 3.0.0 /npm-packlist@8.0.2: - resolution: { integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: ignore-walk: 6.0.4 dev: true /npm-pick-manifest@9.0.0: - resolution: { integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: npm-install-checks: 6.2.0 npm-normalize-package-bin: 3.0.1 @@ -10940,8 +14476,8 @@ packages: dev: true /npm-pick-manifest@9.0.1: - resolution: { integrity: sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: npm-install-checks: 6.2.0 npm-normalize-package-bin: 3.0.1 @@ -10950,8 +14486,8 @@ packages: dev: true /npm-registry-fetch@17.1.0: - resolution: { integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/redact': 2.0.1 jsonparse: 1.3.1 @@ -10966,8 +14502,8 @@ packages: dev: true /npm-run-all@4.1.5: - resolution: { integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} hasBin: true dependencies: ansi-styles: 3.2.1 @@ -10982,27 +14518,27 @@ packages: dev: true /npm-run-path@2.0.2: - resolution: { integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} dependencies: path-key: 2.0.1 /npm-run-path@4.0.1: - resolution: { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true /npm-run-path@5.1.0: - resolution: { integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 dev: true /npmlog@5.0.1: - resolution: { integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== } + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} requiresBuild: true dependencies: are-we-there-yet: 2.0.0 @@ -11011,10 +14547,10 @@ packages: set-blocking: 2.0.0 /nullthrows@1.1.1: - resolution: { integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== } + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} /nx@18.3.3: - resolution: { integrity: sha512-GqC5ANfTWV6SFbgquZwuRMI2Z2nO0c0Yx4JzM3x32aJOgXsmRml3WcV0a5648bIXSen34gylHYl2EHaxVWkzNQ== } + resolution: {integrity: sha512-GqC5ANfTWV6SFbgquZwuRMI2Z2nO0c0Yx4JzM3x32aJOgXsmRml3WcV0a5648bIXSen34gylHYl2EHaxVWkzNQ==} hasBin: true requiresBuild: true peerDependencies: @@ -11076,37 +14612,51 @@ packages: dev: true /ob1@0.73.10: - resolution: { integrity: sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw== } + resolution: {integrity: sha512-aO6EYC+QRRCkZxVJhCWhLKgVjhNuD6Gu1riGjxrIm89CqLsmKgxzYDDEsktmKsoDeRdWGQM5EdMzXDl5xcVfsw==} /object-assign@4.1.1: - resolution: { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} /object-hash@2.2.0: - resolution: { integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} dev: false /object-inspect@1.12.3: - resolution: { integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== } + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: false /object-keys@1.1.1: - resolution: { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} /object.assign@4.1.4: - resolution: { integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false /object.fromentries@2.0.7: - resolution: { integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -11114,7 +14664,7 @@ packages: dev: true /object.groupby@1.0.1: - resolution: { integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== } + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -11123,8 +14673,8 @@ packages: dev: true /object.values@1.1.7: - resolution: { integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -11132,53 +14682,53 @@ packages: dev: true /oidc-token-hash@5.0.3: - resolution: { integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== } - engines: { node: ^10.13.0 || >=12.0.0 } + resolution: {integrity: sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==} + engines: {node: ^10.13.0 || >=12.0.0} dev: false /on-finished@2.3.0: - resolution: { integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 /on-finished@2.4.1: - resolution: { integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 /on-headers@1.0.2: - resolution: { integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} /once@1.4.0: - resolution: { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 /onetime@2.0.1: - resolution: { integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} dependencies: mimic-fn: 1.2.0 /onetime@5.1.2: - resolution: { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 /onetime@6.0.0: - resolution: { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 dev: true /open-cli@7.2.0: - resolution: { integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} + engines: {node: '>=14.16'} hasBin: true dependencies: file-type: 18.5.0 @@ -11188,23 +14738,45 @@ packages: tempy: 3.1.0 dev: true + /open-cli@8.0.0: + resolution: {integrity: sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A==} + engines: {node: '>=18'} + hasBin: true + dependencies: + file-type: 18.7.0 + get-stdin: 9.0.0 + meow: 12.1.1 + open: 10.1.0 + tempy: 3.1.0 + dev: true + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: true + /open@6.4.0: - resolution: { integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} + engines: {node: '>=8'} dependencies: is-wsl: 1.1.0 /open@8.4.2: - resolution: { integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 /open@9.1.0: - resolution: { integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 @@ -11213,7 +14785,7 @@ packages: dev: true /openid-client@5.5.0: - resolution: { integrity: sha512-Y7Xl8BgsrkzWLHkVDYuroM67hi96xITyEDSkmWaGUiNX6CkcXC3XyQGdv5aWZ6dukVKBFVQCADi9gCavOmU14w== } + resolution: {integrity: sha512-Y7Xl8BgsrkzWLHkVDYuroM67hi96xITyEDSkmWaGUiNX6CkcXC3XyQGdv5aWZ6dukVKBFVQCADi9gCavOmU14w==} dependencies: jose: 4.15.9 lru-cache: 6.0.0 @@ -11221,9 +14793,21 @@ packages: oidc-token-hash: 5.0.3 dev: false + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + dev: false + /optionator@0.9.3: - resolution: { integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -11234,8 +14818,8 @@ packages: dev: true /ora@3.4.0: - resolution: { integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==} + engines: {node: '>=6'} dependencies: chalk: 2.4.2 cli-cursor: 2.1.0 @@ -11245,8 +14829,8 @@ packages: wcwidth: 1.0.1 /ora@5.3.0: - resolution: { integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -11259,8 +14843,8 @@ packages: dev: true /ora@5.4.1: - resolution: { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -11273,149 +14857,149 @@ packages: wcwidth: 1.0.1 /os-homedir@1.0.2: - resolution: { integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} /os-tmpdir@1.0.2: - resolution: { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} /osenv@0.1.5: - resolution: { integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== } + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} dependencies: os-homedir: 1.0.2 os-tmpdir: 1.0.2 /p-finally@1.0.0: - resolution: { integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== } - engines: { node: '>=4' } + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} /p-limit@1.3.0: - resolution: { integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== } - engines: { node: '>=4' } + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} dependencies: p-try: 1.0.0 dev: true /p-limit@2.3.0: - resolution: { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } - engines: { node: '>=6' } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: p-try: 2.2.0 /p-limit@3.1.0: - resolution: { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 /p-limit@4.0.0: - resolution: { integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 dev: true /p-locate@2.0.0: - resolution: { integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} dependencies: p-limit: 1.3.0 dev: true /p-locate@3.0.0: - resolution: { integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} dependencies: p-limit: 2.3.0 /p-locate@4.1.0: - resolution: { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} dependencies: p-limit: 2.3.0 /p-locate@5.0.0: - resolution: { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 /p-locate@6.0.0: - resolution: { integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 dev: true /p-map-series@2.1.0: - resolution: { integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} dev: true /p-map@3.0.0: - resolution: { integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} dependencies: aggregate-error: 3.1.0 dev: true /p-map@4.0.0: - resolution: { integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 /p-pipe@3.1.0: - resolution: { integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} dev: true /p-queue@6.6.2: - resolution: { integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 dev: true /p-reduce@2.1.0: - resolution: { integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} dev: true /p-timeout@3.2.0: - resolution: { integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} dependencies: p-finally: 1.0.0 /p-try@1.0.0: - resolution: { integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== } - engines: { node: '>=4' } + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} dev: true /p-try@2.2.0: - resolution: { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} /p-wait-for@3.2.0: - resolution: { integrity: sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==} + engines: {node: '>=8'} dependencies: p-timeout: 3.2.0 dev: false /p-waterfall@2.1.1: - resolution: { integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} dependencies: p-reduce: 2.1.0 dev: true /pacote@18.0.6: - resolution: { integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true dependencies: '@npmcli/git': 5.0.6 @@ -11440,16 +15024,27 @@ packages: - supports-color dev: true + /pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + dev: true + /parent-module@1.0.1: - resolution: { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parent-module@2.0.0: + resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} + engines: {node: '>=8'} dependencies: callsites: 3.1.0 dev: true /parse-conflict-json@3.0.1: - resolution: { integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: json-parse-even-better-errors: 3.0.2 just-diff: 6.0.2 @@ -11457,15 +15052,15 @@ packages: dev: true /parse-json@4.0.0: - resolution: { integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 /parse-json@5.2.0: - resolution: { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} dependencies: '@babel/code-frame': 7.22.13 error-ex: 1.3.2 @@ -11474,49 +15069,49 @@ packages: dev: true /parse-path@7.0.0: - resolution: { integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== } + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} dependencies: protocols: 2.0.1 dev: true /parse-png@2.1.0: - resolution: { integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==} + engines: {node: '>=10'} dependencies: pngjs: 3.4.0 /parse-url@8.1.0: - resolution: { integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== } + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} dependencies: parse-path: 7.0.0 dev: true /parse5-htmlparser2-tree-adapter@6.0.1: - resolution: { integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== } + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} dependencies: parse5: 6.0.1 dev: true /parse5@5.1.1: - resolution: { integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== } + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} dev: true /parse5@6.0.1: - resolution: { integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== } + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true /parseurl@1.3.3: - resolution: { integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} /passport-strategy@1.0.0: - resolution: { integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} dev: false /passport@0.6.0: - resolution: { integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==} + engines: {node: '>= 0.4.0'} dependencies: passport-strategy: 1.0.0 pause: 0.0.1 @@ -11524,172 +15119,185 @@ packages: dev: false /password-prompt@1.1.3: - resolution: { integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== } + resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} dependencies: ansi-escapes: 4.3.2 cross-spawn: 7.0.3 /path-browserify@1.0.1: - resolution: { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== } + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} /path-exists@3.0.0: - resolution: { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} /path-exists@4.0.0: - resolution: { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} /path-exists@5.0.0: - resolution: { integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /path-is-absolute@1.0.1: - resolution: { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} /path-key@2.0.1: - resolution: { integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} /path-key@3.1.1: - resolution: { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} /path-key@4.0.0: - resolution: { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} dev: true /path-parse@1.0.7: - resolution: { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} /path-scurry@1.10.1: - resolution: { integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.0.1 minipass: 7.0.3 dev: true /path-to-regexp@0.1.7: - resolution: { integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== } + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false /path-type@3.0.0: - resolution: { integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} dependencies: pify: 3.0.0 dev: true /path-type@4.0.0: - resolution: { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} /pause@0.0.1: - resolution: { integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== } + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} dev: false /peek-readable@5.0.0: - resolution: { integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + engines: {node: '>=14.16'} dev: true /picocolors@1.0.0: - resolution: { integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== } + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} /picomatch@2.3.1: - resolution: { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} /pidtree@0.3.1: - resolution: { integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} hasBin: true dev: true /pify@2.3.0: - resolution: { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} dev: true /pify@3.0.0: - resolution: { integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} dev: true /pify@4.0.1: - resolution: { integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== } - engines: { node: '>=6' } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} /pify@5.0.0: - resolution: { integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} dev: true /pirates@4.0.6: - resolution: { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} /pkg-dir@3.0.0: - resolution: { integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} dependencies: find-up: 3.0.0 /pkg-dir@4.2.0: - resolution: { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 dev: true /pkg-up@3.1.0: - resolution: { integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} dependencies: find-up: 3.0.0 /plist@3.1.0: - resolution: { integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== } - engines: { node: '>=10.4.0' } + resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} + engines: {node: '>=10.4.0'} dependencies: '@xmldom/xmldom': 0.8.10 base64-js: 1.5.1 xmlbuilder: 15.1.1 /pngjs@3.4.0: - resolution: { integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: false /postcss-selector-parser@6.1.0: - resolution: { integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} + engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 dev: true + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: false + /prelude-ls@1.2.1: - resolution: { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} dev: true /prettier@3.3.2: - resolution: { integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== } - engines: { node: '>=14' } + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} hasBin: true dev: true /pretty-bytes@5.6.0: - resolution: { integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} /pretty-format@26.6.2: - resolution: { integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} dependencies: '@jest/types': 26.6.2 ansi-regex: 5.0.1 @@ -11697,45 +15305,45 @@ packages: react-is: 17.0.2 /pretty-format@29.7.0: - resolution: { integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 /proc-log@3.0.0: - resolution: { integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /proc-log@4.2.0: - resolution: { integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /process-nextick-args@2.0.1: - resolution: { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} /proggy@2.0.0: - resolution: { integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /progress@2.0.3: - resolution: { integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} /promise-all-reject-late@1.0.1: - resolution: { integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== } + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} dev: true /promise-call-limit@3.0.1: - resolution: { integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg== } + resolution: {integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==} dev: true /promise-inflight@1.0.1: - resolution: { integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== } + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' peerDependenciesMeta: @@ -11743,149 +15351,149 @@ packages: optional: true /promise-retry@2.0.1: - resolution: { integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== } - engines: { node: '>=10' } + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} dependencies: err-code: 2.0.3 retry: 0.12.0 dev: true /promise@7.3.1: - resolution: { integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== } + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: asap: 2.0.6 /promise@8.3.0: - resolution: { integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== } + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 /prompts@2.4.2: - resolution: { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 /promzard@1.0.0: - resolution: { integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: read: 2.1.0 dev: true /prop-types@15.8.1: - resolution: { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 /propagate@2.0.1: - resolution: { integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==} + engines: {node: '>= 8'} dev: true /protocols@2.0.1: - resolution: { integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== } + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} dev: true /proxy-addr@2.0.7: - resolution: { integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 dev: false /proxy-from-env@1.1.0: - resolution: { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true /pump@3.0.0: - resolution: { integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== } + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 /punycode@1.4.1: - resolution: { integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== } + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true /punycode@2.3.0: - resolution: { integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} /pure-rand@6.0.4: - resolution: { integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== } + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} dev: true /pvtsutils@1.3.5: - resolution: { integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== } + resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} dependencies: tslib: 2.6.2 /pvutils@1.1.3: - resolution: { integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} /qrcode-terminal@0.11.0: - resolution: { integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ== } + resolution: {integrity: sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==} hasBin: true /qs@6.11.0: - resolution: { integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 /qs@6.11.2: - resolution: { integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 /querystringify@2.2.0: - resolution: { integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== } + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} /queue-microtask@1.2.3: - resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} /quick-lru@4.0.1: - resolution: { integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} dev: true /quick-lru@6.1.2: - resolution: { integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} dev: true /random-bytes@1.0.0: - resolution: { integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} dev: false /randombytes@2.1.0: - resolution: { integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== } + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 dev: true /randomfill@1.0.4: - resolution: { integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== } + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} dependencies: randombytes: 2.1.0 safe-buffer: 5.2.1 dev: true /range-parser@1.2.1: - resolution: { integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} /raw-body@2.5.2: - resolution: { integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -11893,7 +15501,7 @@ packages: unpipe: 1.0.0 /rc@1.2.8: - resolution: { integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== } + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: deep-extend: 0.6.0 @@ -11902,14 +15510,14 @@ packages: strip-json-comments: 2.0.1 /rdf-canonize@3.4.0: - resolution: { integrity: sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==} + engines: {node: '>=12'} dependencies: setimmediate: 1.0.5 dev: true /react-devtools-core@4.28.0: - resolution: { integrity: sha512-E3C3X1skWBdBzwpOUbmXG8SgH6BtsluSMe+s6rRcujNKG1DGi8uIfhdhszkgDpAsMoE55hwqRUzeXCmETDBpTg== } + resolution: {integrity: sha512-E3C3X1skWBdBzwpOUbmXG8SgH6BtsluSMe+s6rRcujNKG1DGi8uIfhdhszkgDpAsMoE55hwqRUzeXCmETDBpTg==} dependencies: shell-quote: 1.8.1 ws: 7.5.9 @@ -11918,16 +15526,16 @@ packages: - utf-8-validate /react-is@16.13.1: - resolution: { integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} /react-is@17.0.2: - resolution: { integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} /react-is@18.2.0: - resolution: { integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== } + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} /react-native-codegen@0.71.6(@babel/preset-env@7.22.20): - resolution: { integrity: sha512-e5pR4VldIhEaFctfSAEgxbng0uG4gjBQxAHes3EKLdosH/Av90pQfSe9IDVdFIngvNPzt8Y14pNjrtqov/yNIg== } + resolution: {integrity: sha512-e5pR4VldIhEaFctfSAEgxbng0uG4gjBQxAHes3EKLdosH/Av90pQfSe9IDVdFIngvNPzt8Y14pNjrtqov/yNIg==} dependencies: '@babel/parser': 7.23.0 flow-parser: 0.185.2 @@ -11938,21 +15546,20 @@ packages: - supports-color /react-native-gradle-plugin@0.71.19: - resolution: { integrity: sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ== } + resolution: {integrity: sha512-1dVk9NwhoyKHCSxcrM6vY6cxmojeATsBobDicX0ZKr7DgUF2cBQRTKsimQFvzH8XhOVXyH8p4HyDSZNIFI8OlQ==} /react-native-securerandom@0.1.1(react-native@0.71.13): - resolution: { integrity: sha512-CozcCx0lpBLevxiXEb86kwLRalBCHNjiGPlw3P7Fi27U6ZLdfjOCNRHD1LtBKcvPvI3TvkBXB3GOtLvqaYJLGw== } + resolution: {integrity: sha512-CozcCx0lpBLevxiXEb86kwLRalBCHNjiGPlw3P7Fi27U6ZLdfjOCNRHD1LtBKcvPvI3TvkBXB3GOtLvqaYJLGw==} requiresBuild: true peerDependencies: react-native: '*' dependencies: base64-js: 1.5.1 react-native: 0.71.13(@babel/core@7.23.0)(@babel/preset-env@7.22.20)(react@18.2.0) - dev: false optional: true /react-native-securerandom@1.0.1(react-native@0.71.13): - resolution: { integrity: sha512-ibuDnd3xi17HyD5CkilOXGPFpS9Z1oifjyHFwUl8NMzcQcpruM0ZX8ytr3A4rCeAsaBHjz69r78Xgd6vUswv1Q== } + resolution: {integrity: sha512-ibuDnd3xi17HyD5CkilOXGPFpS9Z1oifjyHFwUl8NMzcQcpruM0ZX8ytr3A4rCeAsaBHjz69r78Xgd6vUswv1Q==} peerDependencies: react-native: '*' dependencies: @@ -11961,8 +15568,8 @@ packages: dev: false /react-native@0.71.13(@babel/core@7.23.0)(@babel/preset-env@7.22.20)(react@18.2.0): - resolution: { integrity: sha512-zEa69YQNLdv8Sf5Pn0CNDB1K9eGuNy1KoMNxXlrZ89JZ8d02b5hihZIoOCCIwhH+iPgslYwr3ZoGd3AY6FMrgw== } - engines: { node: '>=14' } + resolution: {integrity: sha512-zEa69YQNLdv8Sf5Pn0CNDB1K9eGuNy1KoMNxXlrZ89JZ8d02b5hihZIoOCCIwhH+iPgslYwr3ZoGd3AY6FMrgw==} + engines: {node: '>=14'} hasBin: true peerDependencies: react: 18.2.0 @@ -12012,11 +15619,11 @@ packages: - utf-8-validate /react-refresh@0.4.3: - resolution: { integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} + engines: {node: '>=0.10.0'} /react-shallow-renderer@16.15.0(react@18.2.0): - resolution: { integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== } + resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: @@ -12025,35 +15632,35 @@ packages: react-is: 18.2.0 /react@18.2.0: - resolution: { integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 /read-cmd-shim@4.0.0: - resolution: { integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /read-package-json-fast@3.0.2: - resolution: { integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: json-parse-even-better-errors: 3.0.2 npm-normalize-package-bin: 3.0.1 dev: true /read-pkg-up@3.0.0: - resolution: { integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} dependencies: find-up: 2.1.0 read-pkg: 3.0.0 dev: true /read-pkg-up@7.0.1: - resolution: { integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 read-pkg: 5.2.0 @@ -12061,8 +15668,8 @@ packages: dev: true /read-pkg-up@9.1.0: - resolution: { integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: find-up: 6.3.0 read-pkg: 7.1.0 @@ -12070,8 +15677,8 @@ packages: dev: true /read-pkg@3.0.0: - resolution: { integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 @@ -12079,8 +15686,8 @@ packages: dev: true /read-pkg@5.2.0: - resolution: { integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} dependencies: '@types/normalize-package-data': 2.4.2 normalize-package-data: 2.5.0 @@ -12089,8 +15696,8 @@ packages: dev: true /read-pkg@7.1.0: - resolution: { integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg== } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} dependencies: '@types/normalize-package-data': 2.4.2 normalize-package-data: 3.0.3 @@ -12099,21 +15706,21 @@ packages: dev: true /read@2.1.0: - resolution: { integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: mute-stream: 1.0.0 dev: true /read@3.0.1: - resolution: { integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: mute-stream: 1.0.0 dev: true /readable-stream@2.3.8: - resolution: { integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -12124,26 +15731,26 @@ packages: util-deprecate: 1.0.2 /readable-stream@3.6.2: - resolution: { integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 /readable-web-to-node-stream@3.0.2: - resolution: { integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} dependencies: readable-stream: 3.6.2 dev: true /readline@1.3.0: - resolution: { integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== } + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} /recast@0.21.5: - resolution: { integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} + engines: {node: '>= 4'} dependencies: ast-types: 0.15.2 esprima: 4.0.1 @@ -12151,60 +15758,69 @@ packages: tslib: 2.6.2 /redent@3.0.0: - resolution: { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 dev: true /redent@4.0.0: - resolution: { integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag== } - engines: { node: '>=12' } + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 dev: true /reduce-flatten@2.0.0: - resolution: { integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== } - engines: { node: '>=6' } + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} requiresBuild: true dev: true optional: true /regenerate-unicode-properties@10.1.1: - resolution: { integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== } - engines: { node: '>=4' } + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} dependencies: regenerate: 1.4.2 /regenerate@1.4.2: - resolution: { integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== } + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} /regenerator-runtime@0.13.11: - resolution: { integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== } + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} /regenerator-runtime@0.14.0: - resolution: { integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== } + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} /regenerator-transform@0.15.2: - resolution: { integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== } + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: '@babel/runtime': 7.23.1 /regexp.prototype.flags@1.5.1: - resolution: { integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: false /regexpu-core@5.3.2: - resolution: { integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 @@ -12214,115 +15830,127 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 /regjsparser@0.9.1: - resolution: { integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== } + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 /remove-trailing-slash@0.1.1: - resolution: { integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA== } + resolution: {integrity: sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==} + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true /require-directory@2.1.1: - resolution: { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} /require-from-string@2.0.2: - resolution: { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} /require-main-filename@2.0.0: - resolution: { integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== } + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} /requireg@0.2.2: - resolution: { integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg== } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==} + engines: {node: '>= 4.0.0'} dependencies: nested-error-stacks: 2.0.1 rc: 1.2.8 resolve: 1.7.1 /requires-port@1.0.0: - resolution: { integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== } + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} /reselect@4.1.8: - resolution: { integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== } + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} /resolve-cwd@3.0.0: - resolution: { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 dev: true /resolve-from@3.0.0: - resolution: { integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== } - engines: { node: '>=4' } + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} /resolve-from@4.0.0: - resolution: { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} dev: true /resolve-from@5.0.0: - resolution: { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true /resolve.exports@2.0.2: - resolution: { integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} dev: true /resolve@1.22.6: - resolution: { integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== } + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 /resolve@1.7.1: - resolution: { integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== } + resolution: {integrity: sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==} dependencies: path-parse: 1.0.7 /restore-cursor@2.0.0: - resolution: { integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== } - engines: { node: '>=4' } + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} dependencies: onetime: 2.0.1 signal-exit: 3.0.7 /restore-cursor@3.1.0: - resolution: { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 /retry@0.12.0: - resolution: { integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== } - engines: { node: '>= 4' } + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} dev: true /reusify@1.0.4: - resolution: { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} /rfc4648@1.5.2: - resolution: { integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg== } + resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==} dev: true /rfdc@1.3.0: - resolution: { integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== } + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} dev: false /rimraf@2.2.8: - resolution: { integrity: sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== } + resolution: {integrity: sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true /rimraf@2.4.5: - resolution: { integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ== } + resolution: {integrity: sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true requiresBuild: true @@ -12331,52 +15959,52 @@ packages: optional: true /rimraf@2.6.3: - resolution: { integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== } + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 /rimraf@2.7.1: - resolution: { integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== } + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 /rimraf@3.0.2: - resolution: { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 /rimraf@4.4.1: - resolution: { integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== } - engines: { node: '>=14' } + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} hasBin: true dependencies: glob: 9.3.5 dev: true /rimraf@5.0.8: - resolution: { integrity: sha512-XSh0V2/yNhDEi8HwdIefD8MLgs4LQXPag/nEJWs3YUc3Upn+UHa1GyIkEg9xSSNt7HnkO5FjTvmcRzgf+8UZuw== } - engines: { node: '>=18' } + resolution: {integrity: sha512-XSh0V2/yNhDEi8HwdIefD8MLgs4LQXPag/nEJWs3YUc3Upn+UHa1GyIkEg9xSSNt7HnkO5FjTvmcRzgf+8UZuw==} + engines: {node: '>=18'} hasBin: true dependencies: glob: 10.3.10 dev: true /ripemd160@2.0.2: - resolution: { integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== } + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 dev: true /roarr@7.15.1: - resolution: { integrity: sha512-0ExL9rjOXeQPvQvQo8IcV8SR2GTXmDr1FQFlY2HiAV+gdVQjaVZNOx9d4FI2RqFFsd0sNsiw2TRS/8RU9g0ZfA== } - engines: { node: '>=12.0' } + resolution: {integrity: sha512-0ExL9rjOXeQPvQvQo8IcV8SR2GTXmDr1FQFlY2HiAV+gdVQjaVZNOx9d4FI2RqFFsd0sNsiw2TRS/8RU9g0ZfA==} + engines: {node: '>=12.0'} dependencies: boolean: 3.2.0 fast-json-stringify: 5.8.0 @@ -12387,25 +16015,30 @@ packages: dev: false /run-applescript@5.0.0: - resolution: { integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== } - engines: { node: '>=12' } + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} dependencies: execa: 5.1.1 dev: true + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: true + /run-async@2.4.1: - resolution: { integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} dev: true /run-parallel@1.2.0: - resolution: { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 /rxjs@6.6.7: - resolution: { integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== } - engines: { npm: '>=2.0.0' } + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} requiresBuild: true dependencies: tslib: 1.14.1 @@ -12413,59 +16046,79 @@ packages: optional: true /rxjs@7.8.1: - resolution: { integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== } + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.6.2 dev: true /safe-array-concat@1.0.1: - resolution: { integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: false /safe-buffer@5.1.2: - resolution: { integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} /safe-buffer@5.2.1: - resolution: { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} /safe-json-stringify@1.2.0: - resolution: { integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== } + resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} requiresBuild: true optional: true /safe-regex-test@1.0.0: - resolution: { integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== } + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - dev: true - /safe-stable-stringify@2.4.3: - resolution: { integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== } - engines: { node: '>=10' } + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 dev: false + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + /safer-buffer@2.1.2: - resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} /sax@1.3.0: - resolution: { integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== } + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} /scheduler@0.23.0: - resolution: { integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== } + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: true + /secp256k1@4.0.3: - resolution: { integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} requiresBuild: true dependencies: elliptic: 6.5.4 @@ -12474,32 +16127,32 @@ packages: dev: true /semver-compare@1.0.0: - resolution: { integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== } + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} dev: false /semver@5.7.2: - resolution: { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true /semver@6.3.1: - resolution: { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true /semver@7.3.2: - resolution: { integrity: sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==} + engines: {node: '>=10'} hasBin: true /semver@7.5.4: - resolution: { integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 /send@0.18.0: - resolution: { integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} dependencies: debug: 2.6.9 depd: 2.0.0 @@ -12518,25 +16171,31 @@ packages: - supports-color /serialize-error@2.1.0: - resolution: { integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} /serialize-error@6.0.0: - resolution: { integrity: sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-3vmBkMZLQO+BR4RPHcyRGdE09XCF6cvxzk2N2qn8Er3F91cy8Qt7VvEbZBOpaL53qsBbe2cFOefU6tRY6WDelA==} + engines: {node: '>=10'} dependencies: type-fest: 0.12.0 + /serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + dependencies: + type-fest: 0.13.1 + dev: true + /serialize-error@8.1.0: - resolution: { integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} + engines: {node: '>=10'} dependencies: type-fest: 0.20.2 - dev: false /serve-static@1.15.0: - resolution: { integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 @@ -12546,77 +16205,108 @@ packages: - supports-color /set-blocking@2.0.0: - resolution: { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== } + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: false /set-function-name@2.0.1: - resolution: { integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.0 - dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: false /setimmediate@1.0.5: - resolution: { integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== } + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} /setprototypeof@1.2.0: - resolution: { integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} /sha.js@2.4.11: - resolution: { integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== } + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 /shallow-clone@3.0.1: - resolution: { integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} dependencies: kind-of: 6.0.3 /shebang-command@1.2.0: - resolution: { integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 /shebang-command@2.0.0: - resolution: { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 /shebang-regex@1.0.0: - resolution: { integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} /shebang-regex@3.0.0: - resolution: { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} /shell-quote@1.8.1: - resolution: { integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== } + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} /side-channel@1.0.4: - resolution: { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== } + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: false + /signal-exit@3.0.7: - resolution: { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} /signal-exit@4.1.0: - resolution: { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} dev: true /sigstore@2.3.0: - resolution: { integrity: sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-q+o8L2ebiWD1AxD17eglf1pFrl9jtW7FHa0ygqY6EKvibK8JHyq9Z26v9MZXeDiw+RbfOJ9j2v70M10Hd6E06A==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@sigstore/bundle': 2.3.1 '@sigstore/core': 1.1.0 @@ -12629,11 +16319,11 @@ packages: dev: true /simple-concat@1.0.1: - resolution: { integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== } + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: false /simple-get@3.1.1: - resolution: { integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== } + resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} dependencies: decompress-response: 4.2.1 once: 1.4.0 @@ -12641,39 +16331,52 @@ packages: dev: false /simple-plist@1.3.1: - resolution: { integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== } + resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} dependencies: bplist-creator: 0.1.0 bplist-parser: 0.3.1 plist: 3.1.0 /sisteransi@1.0.5: - resolution: { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} /slash@3.0.0: - resolution: { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } - engines: { node: '>=8' } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} /slice-ansi@2.1.0: - resolution: { integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} + engines: {node: '>=6'} dependencies: ansi-styles: 3.2.1 astral-regex: 1.0.0 is-fullwidth-code-point: 2.0.0 /slugify@1.6.6: - resolution: { integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} + engines: {node: '>=8.0.0'} /smart-buffer@4.2.0: - resolution: { integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== } - engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /sock-daemon@1.4.2: + resolution: {integrity: sha512-IzbegWshWWR+UzQ7487mbdYNmfJ1jXUXQBUHooqtpylO+aW0vMVbFN2d2ug3CSPZ0wbG7ZTTGwpUuthIDFIOGg==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + dependencies: + rimraf: 5.0.8 + signal-exit: 4.1.0 + socket-post-message: 1.0.3 + dev: true + + /socket-post-message@1.0.3: + resolution: {integrity: sha512-UhJaB3xR2oF+HvddFOq2cBZi4zVKOHvdiBo+BaScNxsEUg3TLWSP8BkweKfe07kfH1thjn1hJR0af/w1EtBFjg==} dev: true /socks-proxy-agent@6.2.1: - resolution: { integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ== } - engines: { node: '>= 10' } + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 debug: 4.3.5 @@ -12683,8 +16386,8 @@ packages: dev: true /socks-proxy-agent@8.0.3: - resolution: { integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== } - engines: { node: '>= 14' } + resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} + engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 debug: 4.3.5 @@ -12694,158 +16397,182 @@ packages: dev: true /socks@2.7.1: - resolution: { integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== } - engines: { node: '>= 10.13.0', npm: '>= 3.0.0' } + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: ip: 2.0.0 smart-buffer: 4.2.0 dev: true /sort-keys@2.0.0: - resolution: { integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} dependencies: is-plain-obj: 1.1.0 dev: true /source-map-support@0.5.13: - resolution: { integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== } + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 dev: true /source-map-support@0.5.21: - resolution: { integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== } + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 /source-map@0.5.7: - resolution: { integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} /source-map@0.6.1: - resolution: { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} /source-map@0.7.4: - resolution: { integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} /spdx-correct@3.2.0: - resolution: { integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== } + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.15 dev: true /spdx-exceptions@2.3.0: - resolution: { integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== } + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} dev: true /spdx-expression-parse@3.0.1: - resolution: { integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== } + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.15 dev: true /spdx-license-ids@3.0.15: - resolution: { integrity: sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== } + resolution: {integrity: sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==} dev: true /split2@3.2.2: - resolution: { integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== } + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 dev: true /split@1.0.1: - resolution: { integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== } + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 /sprintf-js@1.0.3: - resolution: { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} /ssri@10.0.6: - resolution: { integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minipass: 7.0.3 dev: true /ssri@8.0.1: - resolution: { integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 /stack-utils@2.0.6: - resolution: { integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 /stackframe@1.3.4: - resolution: { integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== } + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} /stacktrace-parser@0.1.10: - resolution: { integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} dependencies: type-fest: 0.7.1 + /static-eval@2.0.2: + resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==} + dependencies: + escodegen: 1.14.3 + dev: false + /statuses@1.5.0: - resolution: { integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} /statuses@2.0.1: - resolution: { integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} /str2buf@1.3.0: - resolution: { integrity: sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA== } + resolution: {integrity: sha512-xIBmHIUHYZDP4HyoXGHYNVmxlXLXDrtFHYT0eV6IOdEj3VO9ccaF1Ejl9Oq8iFjITllpT8FhaXb4KsNmw+3EuA==} /stream-buffers@2.2.0: - resolution: { integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} + engines: {node: '>= 0.10.0'} /stream-events@1.0.5: - resolution: { integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg== } + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} dependencies: stubs: 3.0.0 dev: true /string-length@4.0.2: - resolution: { integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 dev: true /string-width@4.2.3: - resolution: { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } - engines: { node: '>=8' } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 /string-width@5.1.2: - resolution: { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 dev: true + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: false + /string.prototype.padend@3.1.5: - resolution: { integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 @@ -12853,112 +16580,136 @@ packages: dev: true /string.prototype.trim@1.2.8: - resolution: { integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: false /string.prototype.trimend@1.0.7: - resolution: { integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== } + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: false /string.prototype.trimstart@1.0.7: - resolution: { integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== } + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: false /string_decoder@1.1.1: - resolution: { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 /string_decoder@1.3.0: - resolution: { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 /strip-ansi@5.2.0: - resolution: { integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} dependencies: ansi-regex: 4.1.1 /strip-ansi@6.0.1: - resolution: { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 /strip-ansi@7.1.0: - resolution: { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 dev: true /strip-bom@3.0.0: - resolution: { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} dev: true /strip-bom@4.0.0: - resolution: { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} dev: true /strip-eof@1.0.0: - resolution: { integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} /strip-final-newline@2.0.0: - resolution: { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } - engines: { node: '>=6' } + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} dev: true /strip-final-newline@3.0.0: - resolution: { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} dev: true /strip-indent@3.0.0: - resolution: { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} dependencies: min-indent: 1.0.1 dev: true /strip-indent@4.0.0: - resolution: { integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} dependencies: min-indent: 1.0.1 dev: true /strip-json-comments@2.0.1: - resolution: { integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} /strip-json-comments@3.1.1: - resolution: { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} dev: true /strnum@1.0.5: - resolution: { integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== } + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} /strong-log-transformer@2.1.0: - resolution: { integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} + engines: {node: '>=4'} hasBin: true dependencies: duplexer: 0.1.2 @@ -12967,23 +16718,23 @@ packages: dev: true /strtok3@7.0.0: - resolution: { integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} dependencies: '@tokenizer/token': 0.3.0 peek-readable: 5.0.0 dev: true /structured-headers@0.4.1: - resolution: { integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg== } + resolution: {integrity: sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==} /stubs@3.0.0: - resolution: { integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw== } + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} dev: true /sucrase@3.34.0: - resolution: { integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} hasBin: true dependencies: '@jridgewell/gen-mapping': 0.3.3 @@ -12995,17 +16746,17 @@ packages: ts-interface-checker: 0.1.13 /sudo-prompt@8.2.5: - resolution: { integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw== } + resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==} /sudo-prompt@9.1.1: - resolution: { integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== } + resolution: {integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==} /sudo-prompt@9.2.1: - resolution: { integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== } + resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} /superagent@8.1.2: - resolution: { integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA== } - engines: { node: '>=6.4.0 <13 || >=14' } + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} dependencies: component-emitter: 1.3.0 cookiejar: 2.1.4 @@ -13022,8 +16773,8 @@ packages: dev: true /supertest@6.3.3: - resolution: { integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA== } - engines: { node: '>=6.4.0' } + resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + engines: {node: '>=6.4.0'} dependencies: methods: 1.1.2 superagent: 8.1.2 @@ -13032,37 +16783,37 @@ packages: dev: true /supports-color@5.5.0: - resolution: { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } - engines: { node: '>=4' } + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 /supports-color@7.2.0: - resolution: { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 /supports-color@8.1.1: - resolution: { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} dependencies: has-flag: 4.0.0 /supports-hyperlinks@2.3.0: - resolution: { integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 supports-color: 7.2.0 /supports-preserve-symlinks-flag@1.0.0: - resolution: { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} /table-layout@1.0.2: - resolution: { integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} requiresBuild: true dependencies: array-back: 4.0.2 @@ -13072,9 +16823,14 @@ packages: dev: true optional: true + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /tar-stream@2.2.0: - resolution: { integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} dependencies: bl: 4.1.0 end-of-stream: 1.4.4 @@ -13084,8 +16840,8 @@ packages: dev: true /tar@6.2.0: - resolution: { integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -13095,8 +16851,8 @@ packages: yallist: 4.0.0 /tar@6.2.1: - resolution: { integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== } - engines: { node: '>=10' } + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -13107,8 +16863,8 @@ packages: dev: true /teeny-request@7.1.1: - resolution: { integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-iwY6rkW5DDGq8hE2YgNQlKbptYpY5Nn2xecjQiNjOXWbKzPGUfmeUBCSQbbr306d7Z7U2N0TPl+/SwYRfua1Dg==} + engines: {node: '>=10'} dependencies: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 @@ -13121,42 +16877,42 @@ packages: dev: true /temp-dir@1.0.0: - resolution: { integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} /temp-dir@2.0.0: - resolution: { integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} /temp-dir@3.0.0: - resolution: { integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} dev: true /temp@0.8.3: - resolution: { integrity: sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== } - engines: { '0': node >=0.8.0 } + resolution: {integrity: sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==} + engines: {'0': node >=0.8.0} dependencies: os-tmpdir: 1.0.2 rimraf: 2.2.8 /temp@0.8.4: - resolution: { integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} + engines: {node: '>=6.0.0'} dependencies: rimraf: 2.6.3 /tempy@0.3.0: - resolution: { integrity: sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==} + engines: {node: '>=8'} dependencies: temp-dir: 1.0.0 type-fest: 0.3.1 unique-string: 1.0.0 /tempy@0.7.1: - resolution: { integrity: sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==} + engines: {node: '>=10'} dependencies: del: 6.1.1 is-stream: 2.0.1 @@ -13165,8 +16921,8 @@ packages: unique-string: 2.0.0 /tempy@3.1.0: - resolution: { integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 @@ -13175,15 +16931,15 @@ packages: dev: true /terminal-link@2.1.1: - resolution: { integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== } - engines: { node: '>=8' } + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} dependencies: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 /terser@5.20.0: - resolution: { integrity: sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==} + engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 @@ -13192,8 +16948,8 @@ packages: source-map-support: 0.5.21 /test-exclude@6.0.0: - resolution: { integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== } - engines: { node: '>=8' } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 @@ -13201,119 +16957,123 @@ packages: dev: true /text-extensions@1.9.0: - resolution: { integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} dev: true /text-table@0.2.0: - resolution: { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} /thenify-all@1.6.0: - resolution: { integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 /thenify@3.3.1: - resolution: { integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 /throat@5.0.0: - resolution: { integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== } + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} /through2@2.0.5: - resolution: { integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== } + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 /through@2.3.8: - resolution: { integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} /titleize@3.0.0: - resolution: { integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} dev: true /tmp@0.0.33: - resolution: { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } - engines: { node: '>=0.6.0' } + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 /tmp@0.2.1: - resolution: { integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== } - engines: { node: '>=8.17.0' } + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} dependencies: rimraf: 3.0.2 dev: true /tmpl@1.0.5: - resolution: { integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== } + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} /to-fast-properties@2.0.0: - resolution: { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } - engines: { node: '>=4' } + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} /to-regex-range@5.0.1: - resolution: { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 /toidentifier@1.0.1: - resolution: { integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} /token-types@5.0.1: - resolution: { integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 dev: true /toml@3.0.0: - resolution: { integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== } + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} requiresBuild: true dev: true optional: true /tr46@0.0.3: - resolution: { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} /tr46@3.0.0: - resolution: { integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== } - engines: { node: '>=12' } + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} dependencies: punycode: 2.3.0 dev: false /traverse@0.6.7: - resolution: { integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== } + resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} /treeverse@3.0.0: - resolution: { integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /trim-newlines@3.0.1: - resolution: { integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} dev: true /trim-newlines@4.1.1: - resolution: { integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} dev: true /ts-interface-checker@0.1.13: - resolution: { integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-jest@29.1.1(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.4.5): - resolution: { integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + /ts-interface-checker@1.0.2: + resolution: {integrity: sha512-4IKKvhZRXhvtYF/mtu+OCfBqJKV6LczUq4kQYcpT+iSB7++R9+giWnp2ecwWMIcnG16btVOkXFnoxLSYMN1Q1g==} + dev: true + + /ts-jest@29.1.1(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -13332,7 +17092,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@18.18.0) @@ -13345,9 +17105,9 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.4.5): - resolution: { integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== } - engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } + /ts-jest@29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -13369,7 +17129,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@18.19.39) @@ -13382,9 +17142,9 @@ packages: yargs-parser: 21.1.1 dev: true - /ts-jest@29.1.5(@babel/core@7.23.0)(jest@29.7.0)(typescript@5.5.3): - resolution: { integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg== } - engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } + /ts-jest@29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.5.3): + resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -13406,7 +17166,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.0 + '@babel/core': 7.24.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0(@types/node@18.19.39)(ts-node@10.9.2) @@ -13419,8 +17179,22 @@ packages: yargs-parser: 21.1.1 dev: true + /ts-json-schema-generator@1.5.0: + resolution: {integrity: sha512-RkiaJ6YxGc5EWVPfyHxszTmpGxX8HC2XBvcFlAl1zcvpOG4tjjh+eXioStXJQYTvr9MoK8zCOWzAUlko3K0DiA==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + '@types/json-schema': 7.0.13 + commander: 11.1.0 + glob: 8.1.0 + json5: 2.2.3 + normalize-path: 3.0.0 + safe-stable-stringify: 2.4.3 + typescript: 5.3.3 + dev: true + /ts-node@10.9.2(@types/node@18.19.39)(typescript@5.5.3): - resolution: { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -13451,13 +17225,13 @@ packages: dev: true /ts-typed-json@0.3.2: - resolution: { integrity: sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA== } + resolution: {integrity: sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA==} requiresBuild: true dev: true optional: true /tsconfig-paths@3.15.0: - resolution: { integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== } + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 @@ -13466,29 +17240,52 @@ packages: dev: true /tsconfig-paths@4.2.0: - resolution: { integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== } - engines: { node: '>=6' } + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 dev: true + /tsimp@2.0.11(typescript@5.5.3): + resolution: {integrity: sha512-wRhMmvar8tWHN3ZmykD8f4B4sjCn/f8DFM67LRY+stf/LPa2Kq8ATE2PIi570/DiDJA8kjjxzos3EgP0LmnFLA==} + engines: {node: 16 >=16.17.0 || 18 >= 18.6.0 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.1.0 + dependencies: + '@isaacs/cached': 1.0.1 + '@isaacs/catcher': 1.0.4 + foreground-child: 3.1.1 + mkdirp: 3.0.1 + pirates: 4.0.6 + rimraf: 5.0.8 + signal-exit: 4.1.0 + sock-daemon: 1.4.2 + typescript: 5.5.3 + walk-up-path: 3.0.1 + dev: true + /tslib@1.14.1: - resolution: { integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true /tslib@2.6.2: - resolution: { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} /tsscmp@1.0.6: - resolution: { integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== } - engines: { node: '>=0.6.x' } + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} dev: false /tsutils@3.21.0(typescript@5.5.3): - resolution: { integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== } - engines: { node: '>= 6' } + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: @@ -13497,8 +17294,8 @@ packages: dev: true /tuf-js@2.2.0: - resolution: { integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg== } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==} + engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@tufjs/models': 2.0.0 debug: 4.3.5 @@ -13508,157 +17305,221 @@ packages: dev: true /tweetnacl@1.0.3: - resolution: { integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== } + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: false /type-check@0.4.0: - resolution: { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true /type-detect@4.0.8: - resolution: { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } - engines: { node: '>=4' } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} /type-fest@0.12.0: - resolution: { integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==} + engines: {node: '>=10'} + + /type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true /type-fest@0.16.0: - resolution: { integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== } - engines: { node: '>=10' } + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} /type-fest@0.18.1: - resolution: { integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} dev: true /type-fest@0.20.2: - resolution: { integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== } - engines: { node: '>=10' } + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} /type-fest@0.21.3: - resolution: { integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== } - engines: { node: '>=10' } + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} /type-fest@0.3.1: - resolution: { integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} + engines: {node: '>=6'} /type-fest@0.4.1: - resolution: { integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== } - engines: { node: '>=6' } + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} dev: true /type-fest@0.6.0: - resolution: { integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} dev: true /type-fest@0.7.1: - resolution: { integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} /type-fest@0.8.1: - resolution: { integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} dev: true /type-fest@1.4.0: - resolution: { integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} dev: true /type-fest@2.19.0: - resolution: { integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} /type-fest@3.13.1: - resolution: { integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} dev: true /type-is@1.6.18: - resolution: { integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} dependencies: media-typer: 0.3.0 mime-types: 2.1.35 /typed-array-buffer@1.0.0: - resolution: { integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: false /typed-array-byte-length@1.0.0: - resolution: { integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: false /typed-array-byte-offset@1.0.0: - resolution: { integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: false /typed-array-length@1.0.4: - resolution: { integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== } + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: false + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 dev: true /typedarray@0.0.6: - resolution: { integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== } + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true dev: true /typescript@5.4.5: - resolution: { integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} hasBin: true /typescript@5.5.3: - resolution: { integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} hasBin: true dev: true /typical@4.0.0: - resolution: { integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} requiresBuild: true dev: true optional: true /typical@5.2.0: - resolution: { integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} requiresBuild: true dev: true optional: true /ua-parser-js@1.0.36: - resolution: { integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== } + resolution: {integrity: sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==} /uglify-es@3.3.9: - resolution: { integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} + engines: {node: '>=0.8.0'} deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 hasBin: true dependencies: @@ -13666,131 +17527,137 @@ packages: source-map: 0.6.1 /uglify-js@3.17.4: - resolution: { integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true dev: true optional: true /uid-safe@2.1.5: - resolution: { integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} dependencies: random-bytes: 1.0.0 dev: false /uint8arrays@3.1.1: - resolution: { integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== } + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} dependencies: multiformats: 9.9.0 /unbox-primitive@1.0.2: - resolution: { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== } + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /undici-types@5.26.5: - resolution: { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: true /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: { integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== } - engines: { node: '>=4' } + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} /unicode-match-property-ecmascript@2.0.0: - resolution: { integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== } - engines: { node: '>=4' } + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} dependencies: unicode-canonical-property-names-ecmascript: 2.0.0 unicode-property-aliases-ecmascript: 2.1.0 /unicode-match-property-value-ecmascript@2.1.0: - resolution: { integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== } - engines: { node: '>=4' } + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} /unicode-property-aliases-ecmascript@2.1.0: - resolution: { integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== } - engines: { node: '>=4' } + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} /unique-filename@1.1.1: - resolution: { integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== } + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: unique-slug: 2.0.2 /unique-filename@3.0.0: - resolution: { integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: unique-slug: 4.0.0 dev: true /unique-slug@2.0.2: - resolution: { integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== } + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: imurmurhash: 0.1.4 /unique-slug@4.0.0: - resolution: { integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: imurmurhash: 0.1.4 dev: true /unique-string@1.0.0: - resolution: { integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg== } - engines: { node: '>=4' } + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} dependencies: crypto-random-string: 1.0.0 /unique-string@2.0.0: - resolution: { integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== } - engines: { node: '>=8' } + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} dependencies: crypto-random-string: 2.0.0 /unique-string@3.0.0: - resolution: { integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: crypto-random-string: 4.0.0 dev: true /universal-user-agent@6.0.0: - resolution: { integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== } + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} dev: true /universalify@0.1.2: - resolution: { integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} /universalify@1.0.0: - resolution: { integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} + engines: {node: '>= 10.0.0'} /universalify@2.0.0: - resolution: { integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} /unpipe@1.0.0: - resolution: { integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} /untildify@4.0.0: - resolution: { integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== } - engines: { node: '>=8' } + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} dev: true /upath@2.0.1: - resolution: { integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== } - engines: { node: '>=4' } + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} dev: true /update-browserslist-db@1.0.13(browserslist@4.22.0): - resolution: { integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== } + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -13799,38 +17666,48 @@ packages: escalade: 3.1.1 picocolors: 1.0.0 + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.2 + escalade: 3.1.2 + picocolors: 1.0.1 + /uri-js@4.4.1: - resolution: { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 /url-join@4.0.0: - resolution: { integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA== } + resolution: {integrity: sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==} /url-parse@1.5.10: - resolution: { integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== } + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 /urlgrey@1.0.0: - resolution: { integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w== } + resolution: {integrity: sha512-hJfIzMPJmI9IlLkby8QrsCykQ+SXDeO2W5Q9QTW3QpqZVTx4a/K7p8/5q+/isD8vsbVaFgql/gvAoQCRQ2Cb5w==} dependencies: fast-url-parser: 1.1.3 dev: true /use-sync-external-store@1.2.0(react@18.2.0): - resolution: { integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== } + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 18.2.0 /util-deprecate@1.0.2: - resolution: { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} /util@0.12.5: - resolution: { integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== } + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} dependencies: inherits: 2.0.4 is-arguments: 1.1.1 @@ -13840,38 +17717,38 @@ packages: dev: true /utils-merge@1.0.1: - resolution: { integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} /uuid@10.0.0: - resolution: { integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== } + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true dev: true /uuid@3.4.0: - resolution: { integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== } + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true /uuid@7.0.3: - resolution: { integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== } + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} hasBin: true /uuid@8.3.2: - resolution: { integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== } + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true /uuid@9.0.1: - resolution: { integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== } + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true /v8-compile-cache-lib@3.0.1: - resolution: { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true /v8-to-istanbul@9.1.0: - resolution: { integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.19 '@types/istanbul-lib-coverage': 2.0.4 @@ -13879,65 +17756,78 @@ packages: dev: true /valid-url@1.0.9: - resolution: { integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== } + resolution: {integrity: sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==} /validate-npm-package-license@3.0.4: - resolution: { integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== } + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 dev: true /validate-npm-package-name@3.0.0: - resolution: { integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== } + resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} dependencies: builtins: 1.0.3 /validate-npm-package-name@5.0.1: - resolution: { integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true /validator@13.11.0: - resolution: { integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} dev: true /varint@6.0.0: - resolution: { integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== } + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} dev: true /vary@1.1.2: - resolution: { integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} /vlq@1.0.1: - resolution: { integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== } + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + + /vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + dev: true + + /vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + dev: true /walk-up-path@3.0.1: - resolution: { integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== } + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} dev: true /walker@1.0.8: - resolution: { integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== } + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 /wcwidth@1.0.1: - resolution: { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 /web-encoding@1.1.5: - resolution: { integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== } + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} dependencies: util: 0.12.5 optionalDependencies: '@zxing/text-encoding': 0.9.0 dev: true + /web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + dev: true + /webcrypto-core@1.7.7: - resolution: { integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== } + resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} dependencies: '@peculiar/asn1-schema': 2.3.6 '@peculiar/json-schema': 1.1.12 @@ -13946,7 +17836,7 @@ packages: tslib: 2.6.2 /webcrypto-core@1.7.9: - resolution: { integrity: sha512-FE+a4PPkOmBbgNDIyRmcHhgXn+2ClRl3JzJdDu/P4+B8y81LqKe6RAsI9b3lAOHe1T1BMkSjsRHTYRikImZnVA== } + resolution: {integrity: sha512-FE+a4PPkOmBbgNDIyRmcHhgXn+2ClRl3JzJdDu/P4+B8y81LqKe6RAsI9b3lAOHe1T1BMkSjsRHTYRikImZnVA==} dependencies: '@peculiar/asn1-schema': 2.3.8 '@peculiar/json-schema': 1.1.12 @@ -13956,93 +17846,108 @@ packages: dev: true /webcrypto-shim@0.1.7: - resolution: { integrity: sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg== } + resolution: {integrity: sha512-JAvAQR5mRNRxZW2jKigWMjCMkjSdmP5cColRP1U/pTg69VgHXEi1orv5vVpJ55Zc5MIaPc1aaurzd9pjv2bveg==} /webidl-conversions@3.0.1: - resolution: { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} /webidl-conversions@7.0.0: - resolution: { integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== } - engines: { node: '>=12' } + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} dev: false /whatwg-fetch@3.6.19: - resolution: { integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== } + resolution: {integrity: sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==} /whatwg-url@11.0.0: - resolution: { integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 dev: false /whatwg-url@5.0.0: - resolution: { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 /which-boxed-primitive@1.0.2: - resolution: { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== } + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true /which-module@2.0.1: - resolution: { integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== } + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} /which-typed-array@1.1.11: - resolution: { integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: false /which@1.3.1: - resolution: { integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== } + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 /which@2.0.2: - resolution: { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 /which@4.0.0: - resolution: { integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== } - engines: { node: ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true dependencies: isexe: 3.1.1 dev: true /wide-align@1.1.5: - resolution: { integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== } + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 /wonka@4.0.15: - resolution: { integrity: sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg== } + resolution: {integrity: sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==} + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: false /wordwrap@1.0.0: - resolution: { integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== } + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + requiresBuild: true dev: true /wordwrapjs@4.0.1: - resolution: { integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} requiresBuild: true dependencies: reduce-flatten: 2.0.0 @@ -14051,24 +17956,24 @@ packages: optional: true /wrap-ansi@6.2.0: - resolution: { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 /wrap-ansi@7.0.0: - resolution: { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 /wrap-ansi@8.1.0: - resolution: { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } - engines: { node: '>=12' } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 @@ -14076,34 +17981,43 @@ packages: dev: true /wrappy@1.0.2: - resolution: { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} /write-file-atomic@2.4.3: - resolution: { integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== } + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} dependencies: graceful-fs: 4.2.11 imurmurhash: 0.1.4 signal-exit: 3.0.7 + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + /write-file-atomic@4.0.2: - resolution: { integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 dev: true /write-file-atomic@5.0.1: - resolution: { integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: imurmurhash: 0.1.4 signal-exit: 4.1.0 dev: true /write-json-file@3.2.0: - resolution: { integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} dependencies: detect-indent: 5.0.0 graceful-fs: 4.2.11 @@ -14114,8 +18028,8 @@ packages: dev: true /write-pkg@4.0.0: - resolution: { integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== } - engines: { node: '>=8' } + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} dependencies: sort-keys: 2.0.0 type-fest: 0.4.1 @@ -14123,7 +18037,7 @@ packages: dev: true /ws@6.2.2: - resolution: { integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== } + resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -14135,9 +18049,22 @@ packages: dependencies: async-limiter: 1.0.1 + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws@7.5.9: - resolution: { integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -14148,8 +18075,20 @@ packages: optional: true /ws@8.14.2: - resolution: { integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -14158,77 +18097,83 @@ packages: optional: true utf-8-validate: optional: true + dev: true /x25519-key-agreement-2020-context@1.0.0: - resolution: { integrity: sha512-zblYd8oSg6hNAD+fA9X7ek1hJQRircl3jVlEVCaBTNN9Mv9b4G32uJvRZFMQEMmda8iaTtYo9i2dRMdXX8pjpA== } + resolution: {integrity: sha512-zblYd8oSg6hNAD+fA9X7ek1hJQRircl3jVlEVCaBTNN9Mv9b4G32uJvRZFMQEMmda8iaTtYo9i2dRMdXX8pjpA==} dev: false /xcode@3.0.1: - resolution: { integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA== } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==} + engines: {node: '>=10.0.0'} dependencies: simple-plist: 1.3.1 uuid: 7.0.3 + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + dev: true + /xml2js@0.4.23: - resolution: { integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} dependencies: sax: 1.3.0 xmlbuilder: 11.0.1 /xml@1.0.1: - resolution: { integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== } + resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} dev: true /xmlbuilder@11.0.1: - resolution: { integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} /xmlbuilder@14.0.0: - resolution: { integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg== } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==} + engines: {node: '>=8.0'} /xmlbuilder@15.1.1: - resolution: { integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} + engines: {node: '>=8.0'} /xtend@4.0.2: - resolution: { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} /y18n@4.0.3: - resolution: { integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== } + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} /y18n@5.0.8: - resolution: { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} /yallist@3.1.1: - resolution: { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} /yallist@4.0.0: - resolution: { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} /yargs-parser@18.1.3: - resolution: { integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== } - engines: { node: '>=6' } + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 /yargs-parser@20.2.4: - resolution: { integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== } - engines: { node: '>=10' } + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} dev: true /yargs-parser@21.1.1: - resolution: { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } - engines: { node: '>=12' } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} /yargs@15.4.1: - resolution: { integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== } - engines: { node: '>=8' } + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -14243,8 +18188,8 @@ packages: yargs-parser: 18.1.3 /yargs@16.2.0: - resolution: { integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== } - engines: { node: '>=10' } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} dependencies: cliui: 7.0.4 escalade: 3.1.1 @@ -14256,8 +18201,8 @@ packages: dev: true /yargs@17.7.2: - resolution: { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } - engines: { node: '>=12' } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} dependencies: cliui: 8.0.1 escalade: 3.1.1 @@ -14268,22 +18213,22 @@ packages: yargs-parser: 21.1.1 /yn@3.1.1: - resolution: { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } - engines: { node: '>=6' } + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} dev: true /yocto-queue@0.1.0: - resolution: { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} /yocto-queue@1.0.0: - resolution: { integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== } - engines: { node: '>=12.20' } + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} dev: true /z-schema@5.0.5: - resolution: { integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q== } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} hasBin: true dependencies: lodash.get: 4.4.2