From 59998c723085ac3864ea2c7ba00e1b9f170ccf8d Mon Sep 17 00:00:00 2001 From: dagnelies Date: Tue, 27 Sep 2022 16:48:46 +0200 Subject: [PATCH] ... --- README.md | 68 +- demo/dev.html | 26 + demo/example.html | 26 + demo/img/banner-playground.svg | 4121 ++++++++++++++++++++ demo/img/icon_authenticate.svg | 101 + demo/img/icon_register.svg | 66 + demo/img/icon_validate.svg | 144 + demo/js/playground.js | 95 + demo/playground.html | 200 + demo/theme.css | 34 + dist/passwordless.min.js | 2 - dist/passwordless.min.js.map | 7 - dist/webauthn.min.js | 2 + dist/webauthn.min.js.map | 7 + package-lock.json | 5224 ++++---------------------- package.json | 17 +- src/authenticators.ts | 9 +- src/utils.ts | 12 +- src/{passwordless.ts => webauthn.ts} | 75 +- 19 files changed, 5711 insertions(+), 4525 deletions(-) create mode 100644 demo/dev.html create mode 100644 demo/example.html create mode 100644 demo/img/banner-playground.svg create mode 100644 demo/img/icon_authenticate.svg create mode 100644 demo/img/icon_register.svg create mode 100644 demo/img/icon_validate.svg create mode 100644 demo/js/playground.js create mode 100644 demo/playground.html create mode 100644 demo/theme.css delete mode 100644 dist/passwordless.min.js delete mode 100644 dist/passwordless.min.js.map create mode 100644 dist/webauthn.min.js create mode 100644 dist/webauthn.min.js.map rename src/{passwordless.ts => webauthn.ts} (75%) diff --git a/README.md b/README.md index 553f0f6..7bba116 100644 --- a/README.md +++ b/README.md @@ -15,25 +15,26 @@ npm install @passwordless-id/webauthn ``` ```js -import * as passwordless from '@passwordless-id/webauthn' +import * as webauthn from '@passwordless-id/webauthn' ``` Browser: ```js ``` + Registration ------------ -Example: +Example call: ```js -passwordless.register("Arnaud", "random-server-challenge", { +webauthn.register("Arnaud", "random-server-challenge", { "authenticatorType": "auto", "userVerification": "required", "timeout": 60000, @@ -41,29 +42,82 @@ passwordless.register("Arnaud", "random-server-challenge", { }) ``` +Example response: + +```json +{ + "username": "Arnaud", + "challenge": "random-server-challenge", + "credential": { + "id": "RufE-HKYK2...", + "publicKey": "MIIBIjANBg...", + "algorithm": "RS256" + }, + "authenticator": { + "isLocal": true, + "aaguid": "08987058-cadc-4b81-b6e1-30de50dcbe96", + "name": "Windows Hello Hardware Authenticator", + "attestation": "o2NmbXRjdH...", + "clientData": "eyJ0eXBlIj..." + } +} +``` + Parameters: - `username`: The desired username. - `challenge`: A server-side randomly generated string. - `options`: See below. + + Authentication -------------- -Example: +Example call: ```js -passwordless.login(["credentialIdBase64encoded"], "random-server-challenge", { +webauthn.login(["credentialIdBase64encoded"], "random-server-challenge", { "authenticatorType": "auto", "userVerification": "required", "timeout": 60000 }) ``` +Example response: + +```json +{ + "credentialId": "c8VC7q_TY0NvKIhcS_rafPLEvdw8GwePABH81QRNt4Y", + "userHash": "awopRTWFXAQrBPRAbEPFg3WUd4forBvMho7Ie4sxabE=", + "clientJson": { + "type": "webauthn.get", + "challenge": "ZTEyNGE0ZTAtNjg4NS00YzhlLWFhODktNTZkMjJhZDUxNGYz", + "origin": "http://localhost:8080", + "crossOrigin": false + }, + "clientData": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiWlRFeU5HRTBaVEF0TmpnNE5TMDBZemhsTFdGaE9Ea3ROVFprTWpKaFpEVXhOR1l6Iiwib3JpZ2luIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiwiY3Jvc3NPcmlnaW4iOmZhbHNlfQ==", + "signature": "J8PbSE9ZgC2JME9r2SYGY7WMDUKVDFby8WPXxSpXYfLpmfjimGed8oEqvUtD4UhvshjKV9FOlS0Dc8N8ILvIDL77gmUPeY6oZbTqrw9+2NgeXONM9hNDnxIjOUxekC8a3LY1HFq7aWy4v9I/gu1vD5NGSouvlzxJXPHcC30Bxu70EMcTwtz3EnRmQ3UGuZXjYO2xd2l2BsUgyI87c/wpquaCThrOPEf1PlzS4Larv5lE/Lfh4gQ2O/1TvmBcjtT/oSFkkb6hAgJp51/QbrUbnzdAtTtbGnSTOukM/HZ6yFY5i4oy3l+cJbwAGxEqFUU7yAdPrmTJdLeLmzimve58RA==", + "authenticatorJson": { + "rpIdHash": "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2M=", + "flags": { + "userPresent": true, + "userVerified": true, + "backupEligibility": false, + "backupState": false, + "attestedData": false, + "extensionsIncluded": false + }, + "counter": 1 + }, + "authenticatorData": "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MFAAAAAQ==" +} +``` + Parameters: - `credentialIds`: The list of credential IDs that can be used for signing. -- `challenge`: A server-side randomly generated string, the base64 encoded version will be signed. +- `challenge`: A server-side randomly generated string, the base64url encoded version will be signed. - `options`: See below Options diff --git a/demo/dev.html b/demo/dev.html new file mode 100644 index 0000000..de8a232 --- /dev/null +++ b/demo/dev.html @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/demo/example.html b/demo/example.html new file mode 100644 index 0000000..1e82c4c --- /dev/null +++ b/demo/example.html @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/demo/img/banner-playground.svg b/demo/img/banner-playground.svg new file mode 100644 index 0000000..b6ccc3d --- /dev/null +++ b/demo/img/banner-playground.svg @@ -0,0 +1,4121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/img/icon_authenticate.svg b/demo/img/icon_authenticate.svg new file mode 100644 index 0000000..295a81f --- /dev/null +++ b/demo/img/icon_authenticate.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/img/icon_register.svg b/demo/img/icon_register.svg new file mode 100644 index 0000000..89c9e6e --- /dev/null +++ b/demo/img/icon_register.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/img/icon_validate.svg b/demo/img/icon_validate.svg new file mode 100644 index 0000000..7d7acc5 --- /dev/null +++ b/demo/img/icon_validate.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demo/js/playground.js b/demo/js/playground.js new file mode 100644 index 0000000..0135824 --- /dev/null +++ b/demo/js/playground.js @@ -0,0 +1,95 @@ +import * as webauthn from '/dist/webauthn.min.js' + + const app = new Vue({ + el: '#app', + data: { + registration: { + username: "Arnaud", + challenge: btoa(window.crypto.randomUUID()), + options: { + authenticatorType: 'auto', + userVerification: 'required', + timeout: 60000, + attestation: false, + }, + result: null + }, + authentication: { + credentialId: null, + challenge: btoa(window.crypto.randomUUID()), + options: { + authenticatorType: 'auto', + userVerification: 'required', + timeout: 60000, + }, + result: null + }, + verification: { + publicKey: null, //"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzXUir6UgELFeM9il6id2vgZ1sWbZTk4C5JLIiMpg7lywwTRdp0i+lPP9rEdzcmwKwRLh5QT8DlPFQuKrUc8eXb9r+RPq/CvVOxVCqdK6A9fg0PDnvA3k7c5Ax5V5n/HcSw/uXVAzwstxQsbV5pOk0JDtys7rKiPjdO+XH5TbANNJE7PsS5j90zHLKNQaSybgF8V0v4Oz4I9u7IjVQKEz2V56E4Qfj/D7g0PCu63M5mNz5bGsmUzg5XwSRIaG3J3kDTuyTTGjPYhTnYFyWYXuMu1ZQ7JCe5FUv9m4oj3jH33VQEW3sorea7UOBjnSsLWp8MyE08M4tlY2xgyFL59obQIDAQAB", + algorithm: "RS256", + clientData: null, //"eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiWmpreE5URTBZVGN0TkRKa015MDBOMlU0TFdFME1HTXRZVFEyTkdRNVlqTmpNVGN3Iiwib3JpZ2luIjoiaHR0cDovL2xvY2FsaG9zdDo2MzM0MiIsImNyb3NzT3JpZ2luIjpmYWxzZSwib3RoZXJfa2V5c19jYW5fYmVfYWRkZWRfaGVyZSI6ImRvIG5vdCBjb21wYXJlIGNsaWVudERhdGFKU09OIGFnYWluc3QgYSB0ZW1wbGF0ZS4gU2VlIGh0dHBzOi8vZ29vLmdsL3lhYlBleCJ9", + authenticatorData: null, //"SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MFAAAAAQ==", + signature: null, //"E/XchoqDlSOanozr0o03DN++EEz5qVymtgiaLbepoysxgdxAz/uH/34wt7/YrUs7ESaH/3ni3/0mk71WRc9SP9GMRNYqKSeZkwAM+ZHMc7e3OEpOETWIBCO+aOKmKPflB/nVzXocNUHnhW/aw5UAOhU43qjjy1X9+5+t+60C6RyGaDXTz6Mk6rmgX3z21M8pOFw8VAAtUojX6ab+Lh48SaMN1Z2BK8Exh//pFjveMVngx4yuYRm6Tu7irRvGZVe7Wnii6GNUz56kT2Q4Fc8hR28c3+qufKWuaHLJUnsw6GILQNxemDzirlKBhXFjz7Ht7tyGaqUwFZr9q+93j/95Ag==", + isValid: null + } + }, + methods: { + newChallenge() { + return btoa(window.crypto.randomUUID()) + }, + async register() { + try { + let res = await webauthn.register(this.registration.username, this.registration.challenge, this.registration.options) + this.$buefy.toast.open({ + message: 'Registered!', + type: 'is-success' + }) + console.log(res) + this.registration.result = res + this.authentication.credentialId = res.credential.id + } + catch(e) { + console.warn(e) + this.$buefy.toast.open({ + message: e, + type: 'is-danger' + }) + this.registration.result = {} + } + }, + async login() { + try { + let res = await webauthn.login([this.authentication.credentialId], this.authentication.challenge, this.authentication.options) + console.log(res) + this.authentication.result = res + } + catch(e) { + console.warn(e) + this.$buefy.toast.open({ + message: e, + type: 'is-danger' + }) + this.authentication.result = {} + } + }, + async verifySignature() { + try { + this.verification.isValid = await webauthn.verify(this.verification) + } + catch(e) { + console.warn(e) + this.$buefy.toast.open({ + message: e, + type: 'is-danger' + }) + this.verification.isValid = false + } + }, + parseAuthData(authData) { + return webauthn.parseAuthenticatorData(authData) + }, + parseClientData(clientData) { + return JSON.parse(window.atob(clientData)) + } + } + }) \ No newline at end of file diff --git a/demo/playground.html b/demo/playground.html new file mode 100644 index 0000000..848d362 --- /dev/null +++ b/demo/playground.html @@ -0,0 +1,200 @@ + + + + + + + + + + +
+ +
+ banner +
+

Passwordless.ID /

+

Webauthn Playground

+
+
+ +

This is a plaground for the webauthn wrapper library. Nothing here is sent to any server, everything runs locally.

+ +
+
+ +

Registration

+
+ + + +
A username, email or other identifier
+
+ + + + +

+ +

+
+
A server-side randomly generated nonce, base64url encoded.
+
+ + + + + + + + + +
Which device to use as authenticator.
+
+ + + +
Number of milliseconds the user has to respond to the biometric/PIN check.
+
+ + + + + + + +
Whether to prompt for biometric/PIN check or not.
+
+ + + +
+

If enabled, the device attestation and clientData will be provided as base64 encoded binary data. Not + available on some platforms.

+
+
+ +
+
webauthn.register("{{registration.username}}", "{{registration.challenge}}", {{registration.options}})
+
+ + Register device + +
+
{{registration.result}}
+
+
+ + +
+
+ +

Authentication

+
+ + + +
+
+ + + + +

+ +

+
+
A server-side randomly generated nonce, base64url encoded.
+
+ + + + + + + + +
Which device to use as authenticator.
+
+ + + +
Number of milliseconds the user has to respond to the biometric/PIN check.
+
+ + + + + + + +
Whether to prompt for biometric/PIN check or not.
+
+ +
webauthn.login(["{{authentication.credentialId}}"], "{{authentication.challenge}}", {{authentication.options}})
+ + Login + +
{{authentication.result}}
+
+ + +
+
+ +

Validation

+
+ + + + + + +
The algorithm used for the public key created during registration.
+
+ + + +
The public key created during registration.
+
+ +
+ + + +
{{parseAuthData(verification.authenticatorData)}}
+
+ + + +
{{parseClientData(verification.clientData)}}
+
+ + + +
+

signature = sign(algorithm, publicKey, authenticatorData + sha256(clientData))

+
+
+ + + Verify + + +
+
+ Signature is {{verification.isValid ? 'valid' : 'invalid'}} +
+
+
+ +
+ + + + + + + + \ No newline at end of file diff --git a/demo/theme.css b/demo/theme.css new file mode 100644 index 0000000..447f11d --- /dev/null +++ b/demo/theme.css @@ -0,0 +1,34 @@ +label.required::after { + content: "*"; + color: red; +} + +.field .field { + flex-basis: 0; + overflow: auto; +} + + + +.with-big-icon { + margin: 1rem; + display: flex; + justify-content: center; + align-items: center; +} + +.with-big-icon img { + height: 4rem; + margin: 0 1rem; +} + +.col { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +section { + padding: 1rem; +} \ No newline at end of file diff --git a/dist/passwordless.min.js b/dist/passwordless.min.js deleted file mode 100644 index 6c53227..0000000 --- a/dist/passwordless.min.js +++ /dev/null @@ -1,2 +0,0 @@ -var w=Object.defineProperty;var B=(a,t)=>{for(var r in t)w(a,r,{get:t[r],enumerable:!0})};function O(a){return Uint8Array.from(a,t=>t.charCodeAt(0)).buffer}function l(a){return String.fromCharCode(...new Uint8Array(a))}function c(a){return btoa(l(a))}function s(a){return O(atob(a))}function d(a){return s(a.replace(/-/g,"+").replace(/_/g,"/"))}async function y(a){return await window.crypto.subtle.digest("SHA-256",a)}function g(a){return[...new Uint8Array(a)].map(t=>t.toString(16).padStart(2,"0")).join("")}function p(a,t){var r=new Uint8Array(a.byteLength+t.byteLength);return r.set(new Uint8Array(a),0),r.set(new Uint8Array(t),a.byteLength),r}var f={};B(f,{"08987058-cadc-4b81-b6e1-30de50dcbe96":()=>N,"12ded745-4bed-47d4-abaa-e713f51d6393":()=>ee,"149a2021-8ef6-4133-96b8-81f8d5b7f1f5":()=>V,"1c086528-58d5-f211-823c-356786e36140":()=>we,"2c0df832-92de-4be1-8412-88a8f074df4a":()=>L,"2fc0579f-8113-47ea-b116-bb5a8db9202a":()=>_,"34f5766d-1536-4a24-9033-0e294e510fb0":()=>te,"3789da91-f943-46bc-95c3-50ea2012f03a":()=>D,"39a5647e-1853-446c-a1f6-a79bae9f5bc7":()=>K,"3b1adb99-0dfe-46fd-90b8-7f7614a4de2a":()=>U,"3e078ffd-4c54-4586-8baa-a77da113aec5":()=>pe,"3e22415d-7fdf-4ea4-8a0c-dd60c4249b9d":()=>$,"4e768f2c-5fab-48b3-b300-220eb487752b":()=>P,"504d7149-4e4c-3841-4555-55445a677357":()=>le,"516d3969-5a57-5651-5958-4e7a49434167":()=>j,"54d9fee8-e621-4291-8b18-7157b99c5bec":()=>ce,"6028b017-b1d4-4c02-b4b3-afcdafc96bb2":()=>oe,"692db549-7ae5-44d5-a1e5-dd20a493b723":()=>Q,"6d44ba9b-f6ec-2e49-b930-0c8fe920cb73":()=>se,"73402251-f2a8-4f03-873e-3cb6db604b03":()=>fe,"73bb0cd4-e502-49b8-9c6f-b59445bf720b":()=>v,"77010bd7-212a-4fc9-b236-d2ca5e9d4084":()=>Be,"820d89ed-d65a-409e-85cb-f73f0578f82a":()=>k,"833b721a-ff5f-4d00-bb2e-bdda3ec01e29":()=>Oe,"83c47309-aabb-4108-8470-8be838b573cb":()=>re,"85203421-48f9-4355-9bc8-8a53846e5083":()=>W,"88bbd2f0-342a-42e7-9729-dd158be5407a":()=>ae,"8c97a730-3f7b-41a6-87d6-1e9b62bda6f0":()=>Ae,"931327dd-c89b-406c-a81e-ed7058ef36c6":()=>x,"9c835346-796b-4c27-8898-d6032f515cc5":()=>F,"9ddd1817-af5a-4672-a2b9-3e3dd95000a9":()=>q,"9f0d8150-baa5-4c00-9299-ad62c8bb4e87":()=>Z,"9f77e279-a6e2-4d58-b700-31e5943c6a98":()=>de,"a1f52be5-dfab-4364-b51c-2bd496b14a56":()=>ge,"aeb6569c-f8fb-4950-ac60-24ca2bbe2e52":()=>X,"b6ede29c-3772-412c-8a78-539c1f4c62d2":()=>J,"b92c3f9a-c014-4056-887f-140a2501163b":()=>ie,"b93fd961-f2e6-462f-b122-82002247de78":()=>z,"bc2fe499-0d8e-4ffe-96f3-94a82840cf8c":()=>Se,"be727034-574a-f799-5c76-0929e0430973":()=>ne,"c1f9a0bc-1dd2-404a-b27f-8e29047a43fd":()=>be,"c5703116-972b-4851-a3e7-ae1259843399":()=>R,"c5ef55ff-ad9a-4b9f-b580-adebafe026d0":()=>C,"cb69481e-8ff7-4039-93ec-0a2729a154a8":()=>ye,"d41f5a69-b817-4144-a13c-9ebd6d9254d6":()=>he,"d821a7d4-e97c-4cb6-bd82-4237731fd4be":()=>M,"d8522d9f-575b-4866-88a9-ba99fa02f35b":()=>G,"d91c5288-0ef0-49b7-b8ae-21ca0aa6b3f3":()=>E,default:()=>Fe,"e1a96183-5016-4f24-b55b-e3ae23614cc6":()=>T,"e416201b-afeb-41ca-a03d-2281c28322aa":()=>ue,"ee041bce-25e5-4cdb-8f86-897fd6418464":()=>H,"ee882879-721c-4913-9775-3dfcce97072a":()=>me,"f8a011f3-8c0a-4d15-8006-17111f9edc7d":()=>Y,"fa2b99dc-9e39-4257-8f92-4a30d23c4118":()=>I});var F={name:"Cryptnox FIDO2"},C={name:"YubiKey 5Ci"},K={name:"Vancosys Android Authenticator"},D={name:"NEOWAVE Winkeo FIDO2"},I={name:"YubiKey 5 Series with NFC"},P={name:"Hideez Key 4 FIDO2 SDK"},x={name:"Swissbit iShield FIDO2"},T={name:"ATKey.Pro CTAP2.0"},N={name:"Windows Hello Hardware Authenticator"},E={name:"KEY-ID FIDO2 Authenticator"},H={name:"Feitian ePass FIDO2-NFC Authenticator"},v={name:"YubiKey 5 FIPS Series"},V={name:"Security Key by Yubico with NFC"},U={name:"GoTrust Idem Key FIDO2 Authenticator"},Y={name:"Security Key by Yubico"},L={name:"Feitian FIDO Smart Card"},R={name:"NEOWAVE Badgeo FIDO2"},k={name:"Vancosys iOS Authenticator"},J={name:"Feitian BioPass FIDO2 Plus Authenticator"},W={name:"YubiKey 5Ci FIPS"},M={name:"Hyper FIDO Bio Security Key"},j={name:"SmartDisplayer BobeePass (NFC-BLE FIDO2 Authenticator)"},z={name:"Android Authenticator with SafetyNet Attestation"},_={name:"YubiKey 5 Series with NFC"},q={name:"Windows Hello VBS Hardware Authenticator"},G={name:"YubiKey Bio Series"},Q={name:"HID Crescendo Key"},$={name:"Feitian iePass FIDO Authenticator"},X={name:"HID Crescendo C2300"},Z={name:"GoTrust Idem Card FIDO2 Authenticator"},ee={name:"Feitian AllinOne FIDO2 Authenticator"},ae={name:"Precision InnaIT Key FIDO 2 Level 2 certified"},te={name:"YubiKey 5 Series CTAP2.1 Preview 1 "},re={name:"YubiKey Bio Series (Enterprise Profile)"},ne={name:"Crayonic KeyVault K1 (USB-NFC-BLE FIDO2 Authenticator)"},ie={name:"Security Key by Yubico"},ce={name:"HID Crescendo Enabled"},oe={name:"Windows Hello Software Authenticator"},se={name:"Security Key by Yubico with NFC"},ue={name:"ATKey.Pro CTAP2.1"},de={name:"Hyper FIDO Pro"},fe={name:"uTrust FIDO2 Security Key"},be={name:"YubiKey 5 FIPS Series with NFC"},le={name:"WiSECURE AuthTron USB FIDO2 Authenticator"},ye={name:"YubiKey 5 Series"},me={name:"YubiKey 5 Series"},Ae={name:"FT-JCOS FIDO Fingerprint Card"},ge={name:"OCTATCO EzFinger2 FIDO2 AUTHENTICATOR"},pe={name:"Hideez Key 3 FIDO2"},he={name:"ATKey.Card CTAP2.0"},Se={name:"OCTATCO EzQuant FIDO2 AUTHENTICATOR"},we={name:"Atos CardOS FIDO2"},Be={name:"Feitian BioPass FIDO2 Authenticator"},Oe={name:"Feitian ePass FIDO2 Authenticator"},Fe={"9c835346-796b-4c27-8898-d6032f515cc5":F,"c5ef55ff-ad9a-4b9f-b580-adebafe026d0":C,"39a5647e-1853-446c-a1f6-a79bae9f5bc7":K,"3789da91-f943-46bc-95c3-50ea2012f03a":D,"fa2b99dc-9e39-4257-8f92-4a30d23c4118":I,"4e768f2c-5fab-48b3-b300-220eb487752b":P,"931327dd-c89b-406c-a81e-ed7058ef36c6":x,"e1a96183-5016-4f24-b55b-e3ae23614cc6":T,"08987058-cadc-4b81-b6e1-30de50dcbe96":N,"d91c5288-0ef0-49b7-b8ae-21ca0aa6b3f3":E,"ee041bce-25e5-4cdb-8f86-897fd6418464":H,"73bb0cd4-e502-49b8-9c6f-b59445bf720b":v,"149a2021-8ef6-4133-96b8-81f8d5b7f1f5":V,"3b1adb99-0dfe-46fd-90b8-7f7614a4de2a":U,"f8a011f3-8c0a-4d15-8006-17111f9edc7d":Y,"2c0df832-92de-4be1-8412-88a8f074df4a":L,"c5703116-972b-4851-a3e7-ae1259843399":R,"820d89ed-d65a-409e-85cb-f73f0578f82a":k,"b6ede29c-3772-412c-8a78-539c1f4c62d2":J,"85203421-48f9-4355-9bc8-8a53846e5083":W,"d821a7d4-e97c-4cb6-bd82-4237731fd4be":M,"516d3969-5a57-5651-5958-4e7a49434167":j,"b93fd961-f2e6-462f-b122-82002247de78":z,"2fc0579f-8113-47ea-b116-bb5a8db9202a":_,"9ddd1817-af5a-4672-a2b9-3e3dd95000a9":q,"d8522d9f-575b-4866-88a9-ba99fa02f35b":G,"692db549-7ae5-44d5-a1e5-dd20a493b723":Q,"3e22415d-7fdf-4ea4-8a0c-dd60c4249b9d":$,"aeb6569c-f8fb-4950-ac60-24ca2bbe2e52":X,"9f0d8150-baa5-4c00-9299-ad62c8bb4e87":Z,"12ded745-4bed-47d4-abaa-e713f51d6393":ee,"88bbd2f0-342a-42e7-9729-dd158be5407a":ae,"34f5766d-1536-4a24-9033-0e294e510fb0":te,"83c47309-aabb-4108-8470-8be838b573cb":re,"be727034-574a-f799-5c76-0929e0430973":ne,"b92c3f9a-c014-4056-887f-140a2501163b":ie,"54d9fee8-e621-4291-8b18-7157b99c5bec":ce,"6028b017-b1d4-4c02-b4b3-afcdafc96bb2":oe,"6d44ba9b-f6ec-2e49-b930-0c8fe920cb73":se,"e416201b-afeb-41ca-a03d-2281c28322aa":ue,"9f77e279-a6e2-4d58-b700-31e5943c6a98":de,"73402251-f2a8-4f03-873e-3cb6db604b03":fe,"c1f9a0bc-1dd2-404a-b27f-8e29047a43fd":be,"504d7149-4e4c-3841-4555-55445a677357":le,"cb69481e-8ff7-4039-93ec-0a2729a154a8":ye,"ee882879-721c-4913-9775-3dfcce97072a":me,"8c97a730-3f7b-41a6-87d6-1e9b62bda6f0":Ae,"a1f52be5-dfab-4364-b51c-2bd496b14a56":ge,"3e078ffd-4c54-4586-8baa-a77da113aec5":pe,"d41f5a69-b817-4144-a13c-9ebd6d9254d6":he,"bc2fe499-0d8e-4ffe-96f3-94a82840cf8c":Se,"1c086528-58d5-f211-823c-356786e36140":we,"77010bd7-212a-4fc9-b236-d2ca5e9d4084":Be,"833b721a-ff5f-4d00-bb2e-bdda3ec01e29":Oe};console.debug(f);function m(a){console.debug(a);let t=new DataView(a.slice(32,33)).getUint8(0);console.debug(t);let r={rpIdHash:c(a.slice(0,32)),flags:{userPresent:!!(t&1),userVerified:!!(t&4),backupEligibility:!!(t&8),backupState:!!(t&16),attestedData:!!(t&64),extensionsIncluded:!!(t&128)},counter:new DataView(a.slice(33,37)).getUint32(0,!1)};if(a.byteLength>37){let o=new DataView(a.slice(53,55)).getUint16(0,!1);r={...r,aaguid:b(a),credentialId:c(a.slice(55,55+o)),publicKey:c(a.slice(55+o,a.byteLength))}}return r}function b(a){return Ce(a.slice(37,53))}function Ce(a){let t=g(a);return t=t.substring(0,8)+"-"+t.substring(8,12)+"-"+t.substring(12,16)+"-"+t.substring(16,20)+"-"+t.substring(20,24),t}function S(a){let t=b(a);return(Ke??f)[t]?.name}var Ke=null;function Ee(){return!!window.PublicKeyCredential}async function Ie(){return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()}function He(a){return m(s(a))}async function Pe(a){if(a==="local")return"platform";if(a==="extern")return"cross-platform";if(a!=="both")try{return await Ie()?"platform":"cross-platform"}catch{return}}function xe(a){switch(a){case-7:return"ES256";case-257:return"RS256";default:throw new Error(`Unknown algorithm code: ${a}`)}}async function ve(a,t,r){r||(r={});let o={challenge:d(t),rp:{id:window.location.hostname,name:window.location.hostname},user:{id:await y(new TextEncoder().encode(a)),name:a,displayName:a},pubKeyCredParams:[{alg:-7,type:"public-key"},{alg:-257,type:"public-key"}],timeout:r.timeout??6e4,authenticatorSelection:{userVerification:r.userVerification??"required",authenticatorAttachment:await Pe(r.authenticatorType??"auto")},attestation:"direct"};console.debug(o);let i=await navigator.credentials.create({publicKey:o});console.debug(i);let n=i.response;return{username:a,challenge:t,credential:{id:i.id,publicKey:c(n.getPublicKey()),algorithm:xe(i.response.getPublicKeyAlgorithm())},authenticator:{isLocal:i.authenticatorAttachment==="platform",aaguid:b(n.getAuthenticatorData()),name:S(n.getAuthenticatorData()),attestation:r.attestation?c(n.attestationObject):null,clientData:r.attestation?c(n.clientDataJSON):null}}}async function Ve(a,t,r){r||(r={});let o={challenge:d(t),rpId:window.location.hostname,allowCredentials:a.map(u=>({id:d(u),type:"public-key"})),userVerification:r.userVerification??"required",timeout:r.timeout??6e4};console.debug(o);let i=await navigator.credentials.get({publicKey:o});console.debug(i);let n=i.response;return{credentialId:i.id,clientJson:JSON.parse(l(n.clientDataJSON)),clientData:c(n.clientDataJSON),signature:c(n.signature),authenticatorJson:m(n.authenticatorData),authenticatorData:c(n.authenticatorData)}}async function Ue({algorithm:a,publicKey:t,authenticatorData:r,clientData:o,signature:i}){let n=await window.crypto.subtle.importKey("spki",s(t),{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},!1,["verify"]);console.debug(n);let u=await y(s(o));console.debug(u);let A=p(s(r),u);return console.debug(A),console.debug(s(i)),await window.crypto.subtle.verify({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},n,s(i),A)}export{Ee as isAvailable,Ie as isLocalAuthenticator,Ve as login,He as parseAuthenticatorData,ve as register,Ue as verify}; -//# sourceMappingURL=passwordless.min.js.map diff --git a/dist/passwordless.min.js.map b/dist/passwordless.min.js.map deleted file mode 100644 index 06cf0b1..0000000 --- a/dist/passwordless.min.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/utils.ts", "../src/authenticators.ts", "../src/passwordless.ts"], - "sourcesContent": ["/********************************\r\n Encoding/Decoding Utils\r\n********************************/\r\n\r\nexport function toBuffer(txt :string) :ArrayBuffer {\r\n return Uint8Array.from(txt, c => c.charCodeAt(0)).buffer\r\n}\r\n\r\nexport function parseBuffer(buffer :ArrayBuffer) :string {\r\n return String.fromCharCode(...new Uint8Array(buffer))\r\n}\r\n\r\n\r\nexport function toBase64(buffer :ArrayBuffer) :string {\r\n return btoa(parseBuffer(buffer))\r\n}\r\n\r\nexport function parseBase64(txt :string) :ArrayBuffer {\r\n return toBuffer(atob(txt))\r\n}\r\n\r\nexport function parseBase64url(txt :string) :ArrayBuffer {\r\n return parseBase64(txt.replace(/-/g, '+').replace(/_/g, '/'))\r\n}\r\n\r\n\r\nexport async function sha256(buffer :ArrayBuffer) :Promise {\r\n return await window.crypto.subtle.digest('SHA-256', buffer)\r\n}\r\n\r\nexport function bufferToHex (buffer :ArrayBuffer) :string {\r\n return [...new Uint8Array (buffer)]\r\n .map (b => b.toString (16).padStart (2, \"0\"))\r\n .join (\"\");\r\n}\r\n\r\n\r\nexport function concatenateBuffers(buffer1 :ArrayBuffer, buffer2 :ArrayBuffer) {\r\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\r\n tmp.set(new Uint8Array(buffer1), 0);\r\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\r\n return tmp;\r\n };", "import * as authenticatorMetadata from './authenticatorMetadata.json'\r\nimport * as utils from './utils'\r\n\r\nconsole.debug(authenticatorMetadata)\r\n\r\n\r\nexport function parseAuthData(authData :ArrayBuffer) {\r\n console.debug(authData)\r\n let flags = new DataView(authData.slice(32,33)).getUint8(0)\r\n console.debug(flags)\r\n\r\n // https://w3c.github.io/webauthn/#sctn-authenticator-data\r\n let parsed :any = {\r\n rpIdHash: utils.toBase64(authData.slice(0,32)),\r\n flags: {\r\n userPresent: !!(flags & 1),\r\n //reserved1: !!(flags & 2),\r\n userVerified: !!(flags & 4),\r\n backupEligibility: !!(flags & 8),\r\n backupState: !!(flags & 16),\r\n //reserved2: !!(flags & 32),\r\n attestedData: !!(flags & 64),\r\n extensionsIncluded: !!(flags & 128)\r\n },\r\n counter: new DataView(authData.slice(33,37)).getUint32(0, false), // Big-Endian!\r\n }\r\n\r\n if(authData.byteLength > 37) {\r\n // https://w3c.github.io/webauthn/#attested-credential-data\r\n let credentialLength = new DataView(authData.slice(53,55)).getUint16(0, false) // Big-Endian!\r\n parsed = {\r\n ...parsed,\r\n aaguid: extractAaguid(authData),\r\n credentialId: utils.toBase64(authData.slice(55, 55+credentialLength)),\r\n publicKey: utils.toBase64(authData.slice(55+credentialLength, authData.byteLength)) // probably breaks if extensions are invoked\r\n }\r\n }\r\n\r\n return parsed\r\n}\r\n\r\nexport function extractAaguid(authData :ArrayBuffer) :string {\r\n return formatAaguid(authData.slice(37, 53))\r\n}\r\n\r\nfunction formatAaguid(buffer :ArrayBuffer) :string {\r\n let aaguid = utils.bufferToHex(buffer)\r\n aaguid = aaguid.substring(0,8) + '-' + aaguid.substring(8,12) + '-' + aaguid.substring(12,16) + '-' + aaguid.substring(16,20) + '-' + aaguid.substring(20,24)\r\n return aaguid // example: \"d41f5a69-b817-4144-a13c-9ebd6d9254d6\"\r\n}\r\n\r\nexport function resolveAuthenticatorName(authData :ArrayBuffer) :string {\r\n const aaguid = extractAaguid(authData)\r\n const aaguidMetadata = updatedAuthenticatorMetadata ?? authenticatorMetadata //await getAaguidMetadata()\r\n return aaguidMetadata[aaguid]?.name\r\n}\r\n\r\nlet updatedAuthenticatorMetadata :any = null\r\n\r\n// List of AAGUIDs are encoded as JWT here: https://mds.fidoalliance.org/\r\nexport async function updateDevicesMetadata() {\r\n // this function is rather resource intensive and time consuming\r\n // therefore, the result is cached in local storage\r\n const jwt = await (await fetch(\"https://mds.fidoalliance.org\")).text()\r\n\r\n // the response is a JWT including all AAGUIDs and their metadata\r\n console.debug(jwt)\r\n\r\n // let us ignore the JWT verification, since this is solely for descriptive purposes, not signed data\r\n const payload = jwt.split('.')[1].replaceAll('-', '+').replaceAll('_', '/')\r\n const json = JSON.parse(atob(payload))\r\n console.debug(json)\r\n\r\n let aaguidMetadata :any = {}\r\n for(const e of json.entries) {\r\n if(!e.aaguid || !e.metadataStatement)\r\n continue\r\n\r\n aaguidMetadata[e.aaguid] = {name: e.metadataStatement.description}\r\n }\r\n\r\n console.debug(aaguidMetadata)\r\n updatedAuthenticatorMetadata = aaguidMetadata\r\n}\r\n", "import * as utils from './utils'\r\nimport * as authenticators from './authenticators'\r\n\r\n/**\r\n * Returns whether passwordless authentication is available on this browser/platform or not.\r\n */\r\nexport function isAvailable() :boolean {\r\n return !!window.PublicKeyCredential\r\n}\r\n\r\n/**\r\n * Returns whether the device itself can be used as authenticator.\r\n */\r\nexport async function isLocalAuthenticator() :Promise {\r\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()\r\n}\r\n\r\n\r\n\r\nexport function parseAuthenticatorData(authData :string) {\r\n return authenticators.parseAuthData(utils.parseBase64(authData))\r\n}\r\n\r\ntype AuthType = 'auto' | 'local' | 'extern' | 'both'\r\n\r\nasync function getAuthAttachment(authType :AuthType) :Promise {\r\n if(authType === \"local\")\r\n return \"platform\";\r\n if(authType === \"extern\")\r\n return \"cross-platform\";\r\n if(authType === \"both\")\r\n return undefined // The webauthn protocol considers `null` as invalid but `undefined` as \"both\"!\r\n\r\n // the default case: \"auto\", depending on device capabilities\r\n try {\r\n if(await isLocalAuthenticator())\r\n return \"platform\"\r\n else\r\n return \"cross-platform\"\r\n } catch(e) {\r\n // might happen due to some security policies\r\n // see https://w3c.github.io/webauthn/#sctn-isUserVerifyingPlatformAuthenticatorAvailable\r\n return undefined // The webauthn protocol considers `null` as invalid but `undefined` as \"both\"!\r\n }\r\n}\r\n\r\n\r\ntype NumAlgo = -7 | -257\r\ntype NamedAlgo = 'RS256' | 'ES256'\r\n\r\nfunction getAlgoName(num :NumAlgo) :NamedAlgo {\r\n switch(num) {\r\n case -7: return \"ES256\"\r\n // case -8 ignored to to its rarity\r\n case -257: return \"RS256\"\r\n default: throw new Error(`Unknown algorithm code: ${num}`)\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Creates a cryptographic key pair, in order to register the public key for later passwordless authentication.\r\n *\r\n * @param {string} username\r\n * @param {string} challenge A server-side randomly generated string.\r\n * @param {Object} [options] Optional parameters.\r\n * @param {number} [options.timeout=60000] Number of milliseconds the user has to respond to the biometric/PIN check.\r\n * @param {'required'|'preferred'|'discouraged'} [options.userVerification='required'] Whether to prompt for biometric/PIN check or not.\r\n * @param {'auto'|'local'|'extern'|'both'} [options.authenticatorType='auto'] Which device to use as authenticator.\r\n * 'auto': if the local device can be used as authenticator it will be preferred. Otherwise it will prompt for an external device.\r\n * 'local': use the local device (using TouchID, FaceID, Windows Hello or PIN)\r\n * 'extern': use an external device (security key or connected phone)\r\n * 'both': prompt the user to choose between local or external device. The UI and user interaction in this case is platform specific.\r\n * @param {boolean} [attestation=false] If enabled, the device attestation and clientData will be provided as base64 encoded binary data.\r\n * Note that this is not available on some platforms.\r\n */\r\n//\r\nexport async function register(username :string, challenge :string, options :any) {\r\n if(!options)\r\n options = {}\r\n\r\n const creationOptions :PublicKeyCredentialCreationOptions = {\r\n challenge: utils.parseBase64url(challenge),\r\n rp: {\r\n id: window.location.hostname,\r\n name: window.location.hostname\r\n },\r\n user: {\r\n id: await utils.sha256(new TextEncoder().encode(username)), // ID should not be directly \"identifiable\" for privacy concerns\r\n name: username,\r\n displayName: username,\r\n },\r\n pubKeyCredParams: [\r\n {alg: -7, type: \"public-key\"}, // ES256 (Webauthn's default algorithm)\r\n {alg: -257, type: \"public-key\"}, // RS256 (for Windows Hello and others)\r\n ],\r\n timeout: options.timeout ?? 60000,\r\n authenticatorSelection: {\r\n userVerification: options.userVerification ?? \"required\", // Webauthn default is \"preferred\"\r\n authenticatorAttachment: await getAuthAttachment(options.authenticatorType ?? \"auto\"),\r\n },\r\n attestation: \"direct\" // options.attestation ? \"direct\" : \"none\"\r\n }\r\n\r\n console.debug(creationOptions)\r\n const credential = await navigator.credentials.create({publicKey: creationOptions}) as any //PublicKeyCredential\r\n console.debug(credential)\r\n \r\n const response = credential.response as any //AuthenticatorAttestationResponse\r\n\r\n return {\r\n username: username,\r\n challenge: challenge,\r\n credential: {\r\n id: credential.id,\r\n publicKey: utils.toBase64(response.getPublicKey()),\r\n algorithm: getAlgoName(credential.response.getPublicKeyAlgorithm())\r\n },\r\n authenticator: {\r\n isLocal: (credential.authenticatorAttachment === \"platform\"),\r\n //transport: response.getTransports()[0], // In the RFC but not implemented by browsers\r\n aaguid: authenticators.extractAaguid(response.getAuthenticatorData()),\r\n name: authenticators.resolveAuthenticatorName(response.getAuthenticatorData()),\r\n attestation: options.attestation ? utils.toBase64(response.attestationObject) : null,\r\n clientData: options.attestation ? utils.toBase64(response.clientDataJSON) : null,\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Signs a challenge using one of the provided credentials IDs in order to authenticate the user.\r\n *\r\n * @param {string[]} credentialIds The list of credential IDs that can be used for signing.\r\n * @param {string} challenge A server-side randomly generated string, the base64 encoded version will be signed.\r\n * @param {Object} [options] Optional parameters.\r\n * @param {number} [options.timeout=60000] Number of milliseconds the user has to respond to the biometric/PIN check.\r\n * @param {'required'|'preferred'|'discouraged'} [options.userVerification='required'] Whether to prompt for biometric/PIN check or not.\r\n */\r\nexport async function login(credentialIds :string[], challenge :string, options :any) {\r\n if(!options)\r\n options = {}\r\n\r\n let authOptions :PublicKeyCredentialRequestOptions = {\r\n challenge: utils.parseBase64url(challenge),\r\n rpId: window.location.hostname,\r\n allowCredentials: credentialIds.map(id => { return {\r\n id: utils.parseBase64url(id),\r\n type: 'public-key',\r\n //transports: ['internal', 'usb', 'ble', 'nfc'],\r\n }}),\r\n userVerification: options.userVerification ?? \"required\",\r\n timeout: options.timeout ?? 60000,\r\n }\r\n\r\n console.debug(authOptions)\r\n let auth = await navigator.credentials.get({publicKey: authOptions}) as PublicKeyCredential\r\n console.debug(auth)\r\n\r\n const response = auth.response as AuthenticatorAssertionResponse\r\n\r\n return {\r\n credentialId: auth.id,\r\n //userHash: utils.toBase64(response.userHandle), // unreliable, optional for authenticators\r\n clientJson: JSON.parse(utils.parseBuffer(response.clientDataJSON)),\r\n clientData: utils.toBase64(response.clientDataJSON),\r\n signature: utils.toBase64(response.signature),\r\n authenticatorJson: authenticators.parseAuthData(response.authenticatorData),\r\n authenticatorData: utils.toBase64(response.authenticatorData)\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\ntype VerifyParams = {\r\n algorithm :'RS256' | 'ES256',\r\n publicKey :string, // Base64 encoded\r\n authenticatorData :string, // Base64 encoded\r\n clientData :string, // Base64 encoded\r\n signature :string, // Base64 encoded\r\n}\r\n\r\n// https://w3c.github.io/webauthn/#sctn-verifying-assertion\r\nexport async function verify({algorithm, publicKey, authenticatorData, clientData, signature} :VerifyParams) :Promise {\r\n let cryptoKey = await window.crypto.subtle.importKey(\r\n 'spki', utils.parseBase64(publicKey), {name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, false, ['verify'])\r\n console.debug(cryptoKey)\r\n\r\n let clientHash = await utils.sha256( utils.parseBase64(clientData) );\r\n console.debug(clientHash)\r\n\r\n\r\n //let comboBuffer = concatenateBuffers(parseBase64(authenticatorData), parseBase64(clientData)) // clientHash)\r\n let comboBuffer = utils.concatenateBuffers(utils.parseBase64(authenticatorData), clientHash)\r\n console.debug(comboBuffer)\r\n\r\n console.debug(utils.parseBase64(signature))\r\n\r\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify\r\n let validity = await window.crypto.subtle.verify({name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, cryptoKey, utils.parseBase64(signature), comboBuffer)\r\n\r\n return validity\r\n}"], - "mappings": "0FAIO,SAASA,EAASC,EAA0B,CAC/C,OAAO,WAAW,KAAKA,EAAKC,GAAKA,EAAE,WAAW,CAAC,CAAC,EAAE,MACtD,CAEO,SAASC,EAAYC,EAA6B,CACrD,OAAO,OAAO,aAAa,GAAG,IAAI,WAAWA,CAAM,CAAC,CACxD,CAGO,SAASC,EAASD,EAA6B,CAClD,OAAO,KAAKD,EAAYC,CAAM,CAAC,CACnC,CAEO,SAASE,EAAYL,EAA0B,CAClD,OAAOD,EAAS,KAAKC,CAAG,CAAC,CAC7B,CAEO,SAASM,EAAeN,EAA0B,CACrD,OAAOK,EAAYL,EAAI,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,CAAC,CAChE,CAGA,eAAsBO,EAAOJ,EAA2C,CACpE,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,UAAWA,CAAM,CAC9D,CAEO,SAASK,EAAaL,EAA6B,CACtD,MAAO,CAAC,GAAG,IAAI,WAAYA,CAAM,CAAC,EAC7B,IAAKM,GAAKA,EAAE,SAAU,EAAE,EAAE,SAAU,EAAG,GAAG,CAAC,EAC3C,KAAM,EAAE,CACjB,CAGO,SAASC,EAAmBC,EAAsBC,EAAuB,CAC5E,IAAIC,EAAM,IAAI,WAAWF,EAAQ,WAAaC,EAAQ,UAAU,EAChE,OAAAC,EAAI,IAAI,IAAI,WAAWF,CAAO,EAAG,CAAC,EAClCE,EAAI,IAAI,IAAI,WAAWD,CAAO,EAAGD,EAAQ,UAAU,EAC5CE,CACT,uwNCvCF,QAAQ,MAAMC,CAAqB,EAG5B,SAASC,EAAcC,EAAuB,CACjD,QAAQ,MAAMA,CAAQ,EACtB,IAAIC,EAAQ,IAAI,SAASD,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,EAC1D,QAAQ,MAAMC,CAAK,EAGnB,IAAIC,EAAc,CACd,SAAgBC,EAASH,EAAS,MAAM,EAAE,EAAE,CAAC,EACzC,MAAO,CACF,YAAa,CAAC,EAAEC,EAAQ,GAExB,aAAc,CAAC,EAAEA,EAAS,GAC1B,kBAAmB,CAAC,EAAEA,EAAQ,GAC9B,YAAa,CAAC,EAAEA,EAAQ,IAExB,aAAc,CAAC,EAAEA,EAAQ,IACzB,mBAAoB,CAAC,EAAEA,EAAQ,IACpC,EACA,QAAS,IAAI,SAASD,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,EAAG,EAAK,CACvE,EAEA,GAAGA,EAAS,WAAa,GAAI,CAEzB,IAAII,EAAmB,IAAI,SAASJ,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,EAAG,EAAK,EAC7EE,EAAS,CACL,GAAGA,EACH,OAAQG,EAAcL,CAAQ,EAC9B,aAAoBG,EAASH,EAAS,MAAM,GAAI,GAAGI,CAAgB,CAAC,EACpE,UAAiBD,EAASH,EAAS,MAAM,GAAGI,EAAkBJ,EAAS,UAAU,CAAC,CACtF,CACJ,CAEA,OAAOE,CACX,CAEO,SAASG,EAAcL,EAA+B,CACzD,OAAOM,GAAaN,EAAS,MAAM,GAAI,EAAE,CAAC,CAC9C,CAEA,SAASM,GAAaC,EAA6B,CAC/C,IAAIC,EAAeC,EAAYF,CAAM,EACrC,OAAAC,EAASA,EAAO,UAAU,EAAE,CAAC,EAAI,IAAMA,EAAO,UAAU,EAAE,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EACrJA,CACX,CAEO,SAASE,EAAyBV,EAA+B,CACpE,IAAMQ,EAASH,EAAcL,CAAQ,EAErC,OADuBW,IAAgCb,GACjCU,IAAS,IACnC,CAEA,IAAIG,GAAoC,KCnDjC,SAASC,IAAuB,CACnC,MAAO,CAAC,CAAC,OAAO,mBACpB,CAKA,eAAsBC,IAAyC,CAC3D,OAAO,MAAM,oBAAoB,8CAA8C,CACnF,CAIO,SAASC,GAAuBC,EAAkB,CACrD,OAAsBC,EAAoBC,EAAYF,CAAQ,CAAC,CACnE,CAIA,eAAeG,GAAkBC,EAAgE,CAC7F,GAAGA,IAAa,QACZ,MAAO,WACX,GAAGA,IAAa,SACZ,MAAO,iBACX,GAAGA,IAAa,OAIhB,GAAI,CACA,OAAG,MAAMN,GAAqB,EACnB,WAEA,gBACf,MAAE,CAGE,MACJ,CACJ,CAMA,SAASO,GAAYC,EAAyB,CAC1C,OAAOA,EAAK,CACR,IAAK,GAAI,MAAO,QAEhB,IAAK,KAAM,MAAO,QAClB,QAAS,MAAM,IAAI,MAAM,2BAA2BA,GAAK,CAC7D,CACJ,CAoBA,eAAsBC,GAASC,EAAkBC,EAAmBC,EAAc,CAC1EA,IACAA,EAAU,CAAC,GAEf,IAAMC,EAAsD,CACxD,UAAiBC,EAAeH,CAAS,EACzC,GAAI,CACA,GAAI,OAAO,SAAS,SACpB,KAAM,OAAO,SAAS,QAC1B,EACA,KAAM,CACF,GAAI,MAAYI,EAAO,IAAI,YAAY,EAAE,OAAOL,CAAQ,CAAC,EACzD,KAAMA,EACN,YAAaA,CACjB,EACA,iBAAkB,CACd,CAAC,IAAK,GAAI,KAAM,YAAY,EAC5B,CAAC,IAAK,KAAM,KAAM,YAAY,CAClC,EACA,QAASE,EAAQ,SAAW,IAC5B,uBAAwB,CACpB,iBAAkBA,EAAQ,kBAAoB,WAC9C,wBAAyB,MAAMP,GAAkBO,EAAQ,mBAAqB,MAAM,CACxF,EACA,YAAa,QACjB,EAEA,QAAQ,MAAMC,CAAe,EAC7B,IAAMG,EAAa,MAAM,UAAU,YAAY,OAAO,CAAC,UAAWH,CAAe,CAAC,EAClF,QAAQ,MAAMG,CAAU,EAExB,IAAMC,EAAWD,EAAW,SAE5B,MAAO,CACH,SAAUN,EACV,UAAWC,EACX,WAAY,CACR,GAAIK,EAAW,GACf,UAAiBE,EAASD,EAAS,aAAa,CAAC,EACjD,UAAWV,GAAYS,EAAW,SAAS,sBAAsB,CAAC,CACtE,EACA,cAAe,CACX,QAAUA,EAAW,0BAA4B,WAEjD,OAAuBG,EAAcF,EAAS,qBAAqB,CAAC,EACpE,KAAqBG,EAAyBH,EAAS,qBAAqB,CAAC,EAC7E,YAAaL,EAAQ,YAAoBM,EAASD,EAAS,iBAAiB,EAAI,KAChF,WAAYL,EAAQ,YAAoBM,EAASD,EAAS,cAAc,EAAI,IAChF,CACJ,CACJ,CAYA,eAAsBI,GAAMC,EAAyBX,EAAmBC,EAAc,CAC9EA,IACAA,EAAU,CAAC,GAEf,IAAIW,EAAiD,CACjD,UAAiBT,EAAeH,CAAS,EACzC,KAAM,OAAO,SAAS,SACtB,iBAAkBW,EAAc,IAAIE,IAAe,CAC/C,GAAUV,EAAeU,CAAE,EAC3B,KAAM,YAEV,EAAE,EACF,iBAAkBZ,EAAQ,kBAAoB,WAC9C,QAASA,EAAQ,SAAW,GAChC,EAEA,QAAQ,MAAMW,CAAW,EACzB,IAAIE,EAAO,MAAM,UAAU,YAAY,IAAI,CAAC,UAAWF,CAAW,CAAC,EACnE,QAAQ,MAAME,CAAI,EAElB,IAAMR,EAAWQ,EAAK,SAEtB,MAAO,CACH,aAAcA,EAAK,GAEnB,WAAY,KAAK,MAAYC,EAAYT,EAAS,cAAc,CAAC,EACjE,WAAkBC,EAASD,EAAS,cAAc,EAClD,UAAiBC,EAASD,EAAS,SAAS,EAC5C,kBAAkCd,EAAcc,EAAS,iBAAiB,EAC1E,kBAAyBC,EAASD,EAAS,iBAAiB,CAChE,CACJ,CAgBA,eAAsBU,GAAO,CAAC,UAAAC,EAAW,UAAAC,EAAW,kBAAAC,EAAmB,WAAAC,EAAY,UAAAC,CAAS,EAAmC,CAC3H,IAAIC,EAAY,MAAM,OAAO,OAAO,OAAO,UACvC,OAAc7B,EAAYyB,CAAS,EAAG,CAAC,KAAK,oBAAqB,KAAK,SAAS,EAAG,GAAO,CAAC,QAAQ,CAAC,EACvG,QAAQ,MAAMI,CAAS,EAEvB,IAAIC,EAAa,MAAYnB,EAAcX,EAAY2B,CAAU,CAAE,EACnE,QAAQ,MAAMG,CAAU,EAIxB,IAAIC,EAAoBC,EAAyBhC,EAAY0B,CAAiB,EAAGI,CAAU,EAC3F,eAAQ,MAAMC,CAAW,EAEzB,QAAQ,MAAY/B,EAAY4B,CAAS,CAAC,EAG3B,MAAM,OAAO,OAAO,OAAO,OAAO,CAAC,KAAK,oBAAqB,KAAK,SAAS,EAAGC,EAAiB7B,EAAY4B,CAAS,EAAGG,CAAW,CAGrJ", - "names": ["toBuffer", "txt", "c", "parseBuffer", "buffer", "toBase64", "parseBase64", "parseBase64url", "sha256", "bufferToHex", "b", "concatenateBuffers", "buffer1", "buffer2", "tmp", "authenticatorMetadata_exports", "parseAuthData", "authData", "flags", "parsed", "toBase64", "credentialLength", "extractAaguid", "formatAaguid", "buffer", "aaguid", "bufferToHex", "resolveAuthenticatorName", "updatedAuthenticatorMetadata", "isAvailable", "isLocalAuthenticator", "parseAuthenticatorData", "authData", "parseAuthData", "parseBase64", "getAuthAttachment", "authType", "getAlgoName", "num", "register", "username", "challenge", "options", "creationOptions", "parseBase64url", "sha256", "credential", "response", "toBase64", "extractAaguid", "resolveAuthenticatorName", "login", "credentialIds", "authOptions", "id", "auth", "parseBuffer", "verify", "algorithm", "publicKey", "authenticatorData", "clientData", "signature", "cryptoKey", "clientHash", "comboBuffer", "concatenateBuffers"] -} diff --git a/dist/webauthn.min.js b/dist/webauthn.min.js new file mode 100644 index 0000000..2dff442 --- /dev/null +++ b/dist/webauthn.min.js @@ -0,0 +1,2 @@ +var B=Object.defineProperty;var O=(e,a)=>{for(var r in a)B(e,r,{get:a[r],enumerable:!0})};function F(e){return Uint8Array.from(e,a=>a.charCodeAt(0)).buffer}function f(e){return String.fromCharCode(...new Uint8Array(e))}function b(e){return e.match(/^[a-zA-Z0-9\-_]+=*$/)!==null}function c(e){return btoa(f(e)).replaceAll("+","-").replaceAll("/","_")}function o(e){return e=e.replaceAll("-","+").replaceAll("_","/"),F(atob(e))}async function y(e){return await window.crypto.subtle.digest("SHA-256",e)}function p(e){return[...new Uint8Array(e)].map(a=>a.toString(16).padStart(2,"0")).join("")}function g(e,a){var r=new Uint8Array(e.byteLength+a.byteLength);return r.set(new Uint8Array(e),0),r.set(new Uint8Array(a),e.byteLength),r}var m={};O(m,{"08987058-cadc-4b81-b6e1-30de50dcbe96":()=>E,"12ded745-4bed-47d4-abaa-e713f51d6393":()=>te,"149a2021-8ef6-4133-96b8-81f8d5b7f1f5":()=>U,"1c086528-58d5-f211-823c-356786e36140":()=>Be,"2c0df832-92de-4be1-8412-88a8f074df4a":()=>R,"2fc0579f-8113-47ea-b116-bb5a8db9202a":()=>q,"34f5766d-1536-4a24-9033-0e294e510fb0":()=>re,"3789da91-f943-46bc-95c3-50ea2012f03a":()=>I,"39a5647e-1853-446c-a1f6-a79bae9f5bc7":()=>D,"3b1adb99-0dfe-46fd-90b8-7f7614a4de2a":()=>Y,"3e078ffd-4c54-4586-8baa-a77da113aec5":()=>he,"3e22415d-7fdf-4ea4-8a0c-dd60c4249b9d":()=>Z,"4e768f2c-5fab-48b3-b300-220eb487752b":()=>x,"504d7149-4e4c-3841-4555-55445a677357":()=>ye,"516d3969-5a57-5651-5958-4e7a49434167":()=>z,"54d9fee8-e621-4291-8b18-7157b99c5bec":()=>oe,"6028b017-b1d4-4c02-b4b3-afcdafc96bb2":()=>se,"692db549-7ae5-44d5-a1e5-dd20a493b723":()=>Q,"6d44ba9b-f6ec-2e49-b930-0c8fe920cb73":()=>ue,"73402251-f2a8-4f03-873e-3cb6db604b03":()=>fe,"73bb0cd4-e502-49b8-9c6f-b59445bf720b":()=>V,"77010bd7-212a-4fc9-b236-d2ca5e9d4084":()=>Oe,"820d89ed-d65a-409e-85cb-f73f0578f82a":()=>J,"833b721a-ff5f-4d00-bb2e-bdda3ec01e29":()=>Fe,"83c47309-aabb-4108-8470-8be838b573cb":()=>ne,"85203421-48f9-4355-9bc8-8a53846e5083":()=>M,"88bbd2f0-342a-42e7-9729-dd158be5407a":()=>ae,"8c97a730-3f7b-41a6-87d6-1e9b62bda6f0":()=>pe,"931327dd-c89b-406c-a81e-ed7058ef36c6":()=>T,"9c835346-796b-4c27-8898-d6032f515cc5":()=>C,"9ddd1817-af5a-4672-a2b9-3e3dd95000a9":()=>G,"9f0d8150-baa5-4c00-9299-ad62c8bb4e87":()=>ee,"9f77e279-a6e2-4d58-b700-31e5943c6a98":()=>de,"a1f52be5-dfab-4364-b51c-2bd496b14a56":()=>ge,"aeb6569c-f8fb-4950-ac60-24ca2bbe2e52":()=>X,"b6ede29c-3772-412c-8a78-539c1f4c62d2":()=>W,"b92c3f9a-c014-4056-887f-140a2501163b":()=>ce,"b93fd961-f2e6-462f-b122-82002247de78":()=>j,"bc2fe499-0d8e-4ffe-96f3-94a82840cf8c":()=>Se,"be727034-574a-f799-5c76-0929e0430973":()=>ie,"c1f9a0bc-1dd2-404a-b27f-8e29047a43fd":()=>be,"c5703116-972b-4851-a3e7-ae1259843399":()=>k,"c5ef55ff-ad9a-4b9f-b580-adebafe026d0":()=>K,"cb69481e-8ff7-4039-93ec-0a2729a154a8":()=>me,"d41f5a69-b817-4144-a13c-9ebd6d9254d6":()=>we,"d821a7d4-e97c-4cb6-bd82-4237731fd4be":()=>_,"d8522d9f-575b-4866-88a9-ba99fa02f35b":()=>$,"d91c5288-0ef0-49b7-b8ae-21ca0aa6b3f3":()=>H,default:()=>Ce,"e1a96183-5016-4f24-b55b-e3ae23614cc6":()=>N,"e416201b-afeb-41ca-a03d-2281c28322aa":()=>le,"ee041bce-25e5-4cdb-8f86-897fd6418464":()=>v,"ee882879-721c-4913-9775-3dfcce97072a":()=>Ae,"f8a011f3-8c0a-4d15-8006-17111f9edc7d":()=>L,"fa2b99dc-9e39-4257-8f92-4a30d23c4118":()=>P});var C={name:"Cryptnox FIDO2"},K={name:"YubiKey 5Ci"},D={name:"Vancosys Android Authenticator"},I={name:"NEOWAVE Winkeo FIDO2"},P={name:"YubiKey 5 Series with NFC"},x={name:"Hideez Key 4 FIDO2 SDK"},T={name:"Swissbit iShield FIDO2"},N={name:"ATKey.Pro CTAP2.0"},E={name:"Windows Hello Hardware Authenticator"},H={name:"KEY-ID FIDO2 Authenticator"},v={name:"Feitian ePass FIDO2-NFC Authenticator"},V={name:"YubiKey 5 FIPS Series"},U={name:"Security Key by Yubico with NFC"},Y={name:"GoTrust Idem Key FIDO2 Authenticator"},L={name:"Security Key by Yubico"},R={name:"Feitian FIDO Smart Card"},k={name:"NEOWAVE Badgeo FIDO2"},J={name:"Vancosys iOS Authenticator"},W={name:"Feitian BioPass FIDO2 Plus Authenticator"},M={name:"YubiKey 5Ci FIPS"},_={name:"Hyper FIDO Bio Security Key"},z={name:"SmartDisplayer BobeePass (NFC-BLE FIDO2 Authenticator)"},j={name:"Android Authenticator with SafetyNet Attestation"},q={name:"YubiKey 5 Series with NFC"},G={name:"Windows Hello VBS Hardware Authenticator"},$={name:"YubiKey Bio Series"},Q={name:"HID Crescendo Key"},Z={name:"Feitian iePass FIDO Authenticator"},X={name:"HID Crescendo C2300"},ee={name:"GoTrust Idem Card FIDO2 Authenticator"},te={name:"Feitian AllinOne FIDO2 Authenticator"},ae={name:"Precision InnaIT Key FIDO 2 Level 2 certified"},re={name:"YubiKey 5 Series CTAP2.1 Preview 1 "},ne={name:"YubiKey Bio Series (Enterprise Profile)"},ie={name:"Crayonic KeyVault K1 (USB-NFC-BLE FIDO2 Authenticator)"},ce={name:"Security Key by Yubico"},oe={name:"HID Crescendo Enabled"},se={name:"Windows Hello Software Authenticator"},ue={name:"Security Key by Yubico with NFC"},le={name:"ATKey.Pro CTAP2.1"},de={name:"Hyper FIDO Pro"},fe={name:"uTrust FIDO2 Security Key"},be={name:"YubiKey 5 FIPS Series with NFC"},ye={name:"WiSECURE AuthTron USB FIDO2 Authenticator"},me={name:"YubiKey 5 Series"},Ae={name:"YubiKey 5 Series"},pe={name:"FT-JCOS FIDO Fingerprint Card"},ge={name:"OCTATCO EzFinger2 FIDO2 AUTHENTICATOR"},he={name:"Hideez Key 3 FIDO2"},we={name:"ATKey.Card CTAP2.0"},Se={name:"OCTATCO EzQuant FIDO2 AUTHENTICATOR"},Be={name:"Atos CardOS FIDO2"},Oe={name:"Feitian BioPass FIDO2 Authenticator"},Fe={name:"Feitian ePass FIDO2 Authenticator"},Ce={"9c835346-796b-4c27-8898-d6032f515cc5":C,"c5ef55ff-ad9a-4b9f-b580-adebafe026d0":K,"39a5647e-1853-446c-a1f6-a79bae9f5bc7":D,"3789da91-f943-46bc-95c3-50ea2012f03a":I,"fa2b99dc-9e39-4257-8f92-4a30d23c4118":P,"4e768f2c-5fab-48b3-b300-220eb487752b":x,"931327dd-c89b-406c-a81e-ed7058ef36c6":T,"e1a96183-5016-4f24-b55b-e3ae23614cc6":N,"08987058-cadc-4b81-b6e1-30de50dcbe96":E,"d91c5288-0ef0-49b7-b8ae-21ca0aa6b3f3":H,"ee041bce-25e5-4cdb-8f86-897fd6418464":v,"73bb0cd4-e502-49b8-9c6f-b59445bf720b":V,"149a2021-8ef6-4133-96b8-81f8d5b7f1f5":U,"3b1adb99-0dfe-46fd-90b8-7f7614a4de2a":Y,"f8a011f3-8c0a-4d15-8006-17111f9edc7d":L,"2c0df832-92de-4be1-8412-88a8f074df4a":R,"c5703116-972b-4851-a3e7-ae1259843399":k,"820d89ed-d65a-409e-85cb-f73f0578f82a":J,"b6ede29c-3772-412c-8a78-539c1f4c62d2":W,"85203421-48f9-4355-9bc8-8a53846e5083":M,"d821a7d4-e97c-4cb6-bd82-4237731fd4be":_,"516d3969-5a57-5651-5958-4e7a49434167":z,"b93fd961-f2e6-462f-b122-82002247de78":j,"2fc0579f-8113-47ea-b116-bb5a8db9202a":q,"9ddd1817-af5a-4672-a2b9-3e3dd95000a9":G,"d8522d9f-575b-4866-88a9-ba99fa02f35b":$,"692db549-7ae5-44d5-a1e5-dd20a493b723":Q,"3e22415d-7fdf-4ea4-8a0c-dd60c4249b9d":Z,"aeb6569c-f8fb-4950-ac60-24ca2bbe2e52":X,"9f0d8150-baa5-4c00-9299-ad62c8bb4e87":ee,"12ded745-4bed-47d4-abaa-e713f51d6393":te,"88bbd2f0-342a-42e7-9729-dd158be5407a":ae,"34f5766d-1536-4a24-9033-0e294e510fb0":re,"83c47309-aabb-4108-8470-8be838b573cb":ne,"be727034-574a-f799-5c76-0929e0430973":ie,"b92c3f9a-c014-4056-887f-140a2501163b":ce,"54d9fee8-e621-4291-8b18-7157b99c5bec":oe,"6028b017-b1d4-4c02-b4b3-afcdafc96bb2":se,"6d44ba9b-f6ec-2e49-b930-0c8fe920cb73":ue,"e416201b-afeb-41ca-a03d-2281c28322aa":le,"9f77e279-a6e2-4d58-b700-31e5943c6a98":de,"73402251-f2a8-4f03-873e-3cb6db604b03":fe,"c1f9a0bc-1dd2-404a-b27f-8e29047a43fd":be,"504d7149-4e4c-3841-4555-55445a677357":ye,"cb69481e-8ff7-4039-93ec-0a2729a154a8":me,"ee882879-721c-4913-9775-3dfcce97072a":Ae,"8c97a730-3f7b-41a6-87d6-1e9b62bda6f0":pe,"a1f52be5-dfab-4364-b51c-2bd496b14a56":ge,"3e078ffd-4c54-4586-8baa-a77da113aec5":he,"d41f5a69-b817-4144-a13c-9ebd6d9254d6":we,"bc2fe499-0d8e-4ffe-96f3-94a82840cf8c":Se,"1c086528-58d5-f211-823c-356786e36140":Be,"77010bd7-212a-4fc9-b236-d2ca5e9d4084":Oe,"833b721a-ff5f-4d00-bb2e-bdda3ec01e29":Fe};function A(e){console.debug(e);let a=new DataView(e.slice(32,33)).getUint8(0);console.debug(a);let r={rpIdHash:c(e.slice(0,32)),flags:{userPresent:!!(a&1),userVerified:!!(a&4),backupEligibility:!!(a&8),backupState:!!(a&16),attestedData:!!(a&64),extensionsIncluded:!!(a&128)},counter:new DataView(e.slice(33,37)).getUint32(0,!1)};if(e.byteLength>37){let s=new DataView(e.slice(53,55)).getUint16(0,!1);r={...r,aaguid:d(e),credentialId:c(e.slice(55,55+s)),publicKey:c(e.slice(55+s,e.byteLength))}}return r}function d(e){return Ke(e.slice(37,53))}function Ke(e){let a=p(e);return a=a.substring(0,8)+"-"+a.substring(8,12)+"-"+a.substring(12,16)+"-"+a.substring(16,20)+"-"+a.substring(20,24),a}function w(e){let a=d(e);return(De??m)[a]?.name}var De=null;function He(){return!!window.PublicKeyCredential}async function S(){return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()}function ve(e){return A(o(e))}async function Pe(e){if(e==="local")return"platform";if(e==="extern")return"cross-platform";if(e!=="both")try{return await S()?"platform":"cross-platform"}catch{return}}function xe(e){switch(e){case-7:return"ES256";case-257:return"RS256";default:throw new Error(`Unknown algorithm code: ${e}`)}}async function Ve(e,a,r){if(r||(r={}),!b(a))throw new Error("Provided challenge is not properly encoded in Base64url");let s={challenge:o(a),rp:{id:window.location.hostname,name:window.location.hostname},user:{id:await y(new TextEncoder().encode(e)),name:e,displayName:e},pubKeyCredParams:[{alg:-7,type:"public-key"},{alg:-257,type:"public-key"}],timeout:r.timeout??6e4,authenticatorSelection:{userVerification:r.userVerification??"required",authenticatorAttachment:await Pe(r.authenticatorType??"auto")},attestation:"direct"};console.debug(s);let i=await navigator.credentials.create({publicKey:s});console.debug(i);let n=i.response;return{username:e,challenge:a,credential:{id:i.id,publicKey:c(n.getPublicKey()),algorithm:xe(i.response.getPublicKeyAlgorithm())},authenticator:{isLocal:i.authenticatorAttachment==="platform",aaguid:d(n.getAuthenticatorData()),name:w(n.getAuthenticatorData()),attestation:r.attestation?c(n.attestationObject):null,clientData:r.attestation?c(n.clientDataJSON):null}}}async function Te(e){if(e==="local")return["internal"];if(e==="extern")return["usb","ble","nfc"];if(e==="both")return["internal","usb","ble","nfc"];try{return await S()?["internal"]:["usb","ble","nfc"]}catch{return["internal","usb","ble","nfc"]}}async function Ue(e,a,r){if(r||(r={}),!b(a))throw new Error("Provided challenge is not properly encoded in Base64url");let s=await Te(r.authenticatorType??"auto"),i={challenge:o(a),rpId:window.location.hostname,allowCredentials:e.map(l=>({id:o(l),type:"public-key",transports:s})),userVerification:r.userVerification??"required",timeout:r.timeout??6e4};console.debug(i);let n=await navigator.credentials.get({publicKey:i});console.debug(n);let u=n.response;return{credentialId:n.id,clientJson:JSON.parse(f(u.clientDataJSON)),clientData:c(u.clientDataJSON),signature:c(u.signature),authenticatorJson:A(u.authenticatorData),authenticatorData:c(u.authenticatorData)}}async function Ye({algorithm:e,publicKey:a,authenticatorData:r,clientData:s,signature:i}){let n=await window.crypto.subtle.importKey("spki",o(a),{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},!1,["verify"]);console.debug(n);let u=await y(o(s));console.debug(u);let l=g(o(r),u);return console.debug(l),console.debug(o(i)),await window.crypto.subtle.verify({name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},n,o(i),l)}export{He as isAvailable,S as isLocalAuthenticator,Ue as login,ve as parseAuthenticatorData,Ve as register,Ye as verify}; +//# sourceMappingURL=webauthn.min.js.map diff --git a/dist/webauthn.min.js.map b/dist/webauthn.min.js.map new file mode 100644 index 0000000..2dbf828 --- /dev/null +++ b/dist/webauthn.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/utils.ts", "../src/authenticators.ts", "../src/webauthn.ts"], + "sourcesContent": ["/********************************\r\n Encoding/Decoding Utils\r\n********************************/\r\n\r\nexport function toBuffer(txt :string) :ArrayBuffer {\r\n return Uint8Array.from(txt, c => c.charCodeAt(0)).buffer\r\n}\r\n\r\nexport function parseBuffer(buffer :ArrayBuffer) :string {\r\n return String.fromCharCode(...new Uint8Array(buffer))\r\n}\r\n\r\n\r\nexport function isBase64url(txt :string) :boolean {\r\n return txt.match(/^[a-zA-Z0-9\\-_]+=*$/) !== null\r\n}\r\n\r\nexport function toBase64url(buffer :ArrayBuffer) :string {\r\n const txt = btoa(parseBuffer(buffer)) // base64\r\n return txt.replaceAll('+', '-').replaceAll('/', '_')\r\n}\r\n\r\nexport function parseBase64url(txt :string) :ArrayBuffer {\r\n txt = txt.replaceAll('-', '+').replaceAll('_', '/') // base64url -> base64\r\n return toBuffer(atob(txt))\r\n}\r\n\r\n\r\nexport async function sha256(buffer :ArrayBuffer) :Promise {\r\n return await window.crypto.subtle.digest('SHA-256', buffer)\r\n}\r\n\r\nexport function bufferToHex (buffer :ArrayBuffer) :string {\r\n return [...new Uint8Array (buffer)]\r\n .map (b => b.toString (16).padStart (2, \"0\"))\r\n .join (\"\");\r\n}\r\n\r\n\r\nexport function concatenateBuffers(buffer1 :ArrayBuffer, buffer2 :ArrayBuffer) {\r\n var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\r\n tmp.set(new Uint8Array(buffer1), 0);\r\n tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\r\n return tmp;\r\n };", "import * as authenticatorMetadata from './authenticatorMetadata.json'\r\nimport * as utils from './utils'\r\n\r\n//console.debug(authenticatorMetadata)\r\n\r\nexport function parseAuthData(authData :ArrayBuffer) {\r\n console.debug(authData)\r\n let flags = new DataView(authData.slice(32,33)).getUint8(0)\r\n console.debug(flags)\r\n\r\n // https://w3c.github.io/webauthn/#sctn-authenticator-data\r\n let parsed :any = {\r\n rpIdHash: utils.toBase64url(authData.slice(0,32)),\r\n flags: {\r\n userPresent: !!(flags & 1),\r\n //reserved1: !!(flags & 2),\r\n userVerified: !!(flags & 4),\r\n backupEligibility: !!(flags & 8),\r\n backupState: !!(flags & 16),\r\n //reserved2: !!(flags & 32),\r\n attestedData: !!(flags & 64),\r\n extensionsIncluded: !!(flags & 128)\r\n },\r\n counter: new DataView(authData.slice(33,37)).getUint32(0, false), // Big-Endian!\r\n }\r\n\r\n if(authData.byteLength > 37) {\r\n // https://w3c.github.io/webauthn/#attested-credential-data\r\n let credentialLength = new DataView(authData.slice(53,55)).getUint16(0, false) // Big-Endian!\r\n parsed = {\r\n ...parsed,\r\n aaguid: extractAaguid(authData),\r\n credentialId: utils.toBase64url(authData.slice(55, 55+credentialLength)),\r\n publicKey: utils.toBase64url(authData.slice(55+credentialLength, authData.byteLength)) // probably breaks if extensions are invoked\r\n }\r\n }\r\n\r\n return parsed\r\n}\r\n\r\nexport function extractAaguid(authData :ArrayBuffer) :string {\r\n return formatAaguid(authData.slice(37, 53))\r\n}\r\n\r\nfunction formatAaguid(buffer :ArrayBuffer) :string {\r\n let aaguid = utils.bufferToHex(buffer)\r\n aaguid = aaguid.substring(0,8) + '-' + aaguid.substring(8,12) + '-' + aaguid.substring(12,16) + '-' + aaguid.substring(16,20) + '-' + aaguid.substring(20,24)\r\n return aaguid // example: \"d41f5a69-b817-4144-a13c-9ebd6d9254d6\"\r\n}\r\n\r\nexport function resolveAuthenticatorName(authData :ArrayBuffer) :string {\r\n const aaguid = extractAaguid(authData)\r\n const aaguidMetadata = updatedAuthenticatorMetadata ?? authenticatorMetadata //await getAaguidMetadata()\r\n return aaguidMetadata[aaguid]?.name\r\n}\r\n\r\nlet updatedAuthenticatorMetadata :any = null\r\n\r\n// List of AAGUIDs are encoded as JWT here: https://mds.fidoalliance.org/\r\nexport async function updateDevicesMetadata() {\r\n // this function is rather resource intensive and time consuming\r\n // therefore, the result is cached in local storage\r\n const jwt = await (await fetch(\"https://mds.fidoalliance.org\")).text()\r\n\r\n // the response is a JWT including all AAGUIDs and their metadata\r\n console.debug(jwt)\r\n\r\n // let us ignore the JWT verification, since this is solely for descriptive purposes, not signed data\r\n const payload = jwt.split('.')[1].replaceAll('-', '+').replaceAll('_', '/')\r\n const json = JSON.parse(atob(payload))\r\n console.debug(json)\r\n\r\n let aaguidMetadata :any = {}\r\n for(const e of json.entries) {\r\n if(!e.aaguid || !e.metadataStatement)\r\n continue\r\n\r\n aaguidMetadata[e.aaguid] = {name: e.metadataStatement.description}\r\n }\r\n\r\n console.debug(aaguidMetadata)\r\n updatedAuthenticatorMetadata = aaguidMetadata\r\n}\r\n", "import * as utils from './utils'\r\nimport * as authenticators from './authenticators'\r\n\r\n/**\r\n * Returns whether passwordless authentication is available on this browser/platform or not.\r\n */\r\nexport function isAvailable() :boolean {\r\n return !!window.PublicKeyCredential\r\n}\r\n\r\n/**\r\n * Returns whether the device itself can be used as authenticator.\r\n */\r\nexport async function isLocalAuthenticator() :Promise {\r\n return await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable()\r\n}\r\n\r\n\r\n// Used mainly for the playground\r\nexport function parseAuthenticatorData(authData :string) {\r\n return authenticators.parseAuthData(utils.parseBase64url(authData))\r\n}\r\n\r\ntype AuthType = 'auto' | 'local' | 'extern' | 'both'\r\n\r\nasync function getAuthAttachment(authType :AuthType) :Promise {\r\n if(authType === \"local\")\r\n return \"platform\";\r\n if(authType === \"extern\")\r\n return \"cross-platform\";\r\n if(authType === \"both\")\r\n return undefined // The webauthn protocol considers `null` as invalid but `undefined` as \"both\"!\r\n\r\n // the default case: \"auto\", depending on device capabilities\r\n try {\r\n if(await isLocalAuthenticator())\r\n return \"platform\"\r\n else\r\n return \"cross-platform\"\r\n } catch(e) {\r\n // might happen due to some security policies\r\n // see https://w3c.github.io/webauthn/#sctn-isUserVerifyingPlatformAuthenticatorAvailable\r\n return undefined // The webauthn protocol considers `null` as invalid but `undefined` as \"both\"!\r\n }\r\n}\r\n\r\n\r\ntype NumAlgo = -7 | -257\r\ntype NamedAlgo = 'RS256' | 'ES256'\r\n\r\nfunction getAlgoName(num :NumAlgo) :NamedAlgo {\r\n switch(num) {\r\n case -7: return \"ES256\"\r\n // case -8 ignored to to its rarity\r\n case -257: return \"RS256\"\r\n default: throw new Error(`Unknown algorithm code: ${num}`)\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Creates a cryptographic key pair, in order to register the public key for later passwordless authentication.\r\n *\r\n * @param {string} username\r\n * @param {string} challenge A server-side randomly generated string.\r\n * @param {Object} [options] Optional parameters.\r\n * @param {number} [options.timeout=60000] Number of milliseconds the user has to respond to the biometric/PIN check.\r\n * @param {'required'|'preferred'|'discouraged'} [options.userVerification='required'] Whether to prompt for biometric/PIN check or not.\r\n * @param {'auto'|'local'|'extern'|'both'} [options.authenticatorType='auto'] Which device to use as authenticator.\r\n * 'auto': if the local device can be used as authenticator it will be preferred. Otherwise it will prompt for an external device.\r\n * 'local': use the local device (using TouchID, FaceID, Windows Hello or PIN)\r\n * 'extern': use an external device (security key or connected phone)\r\n * 'both': prompt the user to choose between local or external device. The UI and user interaction in this case is platform specific.\r\n * @param {boolean} [attestation=false] If enabled, the device attestation and clientData will be provided as Base64url encoded binary data.\r\n * Note that this is not available on some platforms.\r\n */\r\n//\r\nexport async function register(username :string, challenge :string, options :any) {\r\n if(!options)\r\n options = {}\r\n\r\n if(!utils.isBase64url(challenge))\r\n throw new Error('Provided challenge is not properly encoded in Base64url')\r\n\r\n const creationOptions :PublicKeyCredentialCreationOptions = {\r\n challenge: utils.parseBase64url(challenge),\r\n rp: {\r\n id: window.location.hostname,\r\n name: window.location.hostname\r\n },\r\n user: {\r\n id: await utils.sha256(new TextEncoder().encode(username)), // ID should not be directly \"identifiable\" for privacy concerns\r\n name: username,\r\n displayName: username,\r\n },\r\n pubKeyCredParams: [\r\n {alg: -7, type: \"public-key\"}, // ES256 (Webauthn's default algorithm)\r\n {alg: -257, type: \"public-key\"}, // RS256 (for Windows Hello and others)\r\n ],\r\n timeout: options.timeout ?? 60000,\r\n authenticatorSelection: {\r\n userVerification: options.userVerification ?? \"required\", // Webauthn default is \"preferred\"\r\n authenticatorAttachment: await getAuthAttachment(options.authenticatorType ?? \"auto\"),\r\n },\r\n attestation: \"direct\" // options.attestation ? \"direct\" : \"none\"\r\n }\r\n\r\n console.debug(creationOptions)\r\n const credential = await navigator.credentials.create({publicKey: creationOptions}) as any //PublicKeyCredential\r\n console.debug(credential)\r\n \r\n const response = credential.response as any //AuthenticatorAttestationResponse\r\n\r\n return {\r\n username: username,\r\n challenge: challenge,\r\n credential: {\r\n id: credential.id,\r\n publicKey: utils.toBase64url(response.getPublicKey()),\r\n algorithm: getAlgoName(credential.response.getPublicKeyAlgorithm())\r\n },\r\n authenticator: {\r\n isLocal: (credential.authenticatorAttachment === \"platform\"),\r\n //transport: response.getTransports()[0], // In the RFC but not implemented by browsers\r\n aaguid: authenticators.extractAaguid(response.getAuthenticatorData()),\r\n name: authenticators.resolveAuthenticatorName(response.getAuthenticatorData()),\r\n attestation: options.attestation ? utils.toBase64url(response.attestationObject) : null,\r\n clientData: options.attestation ? utils.toBase64url(response.clientDataJSON) : null,\r\n }\r\n }\r\n}\r\n\r\n\r\nasync function getTransports(authType :AuthType) :Promise {\r\n if(authType === \"local\")\r\n return ['internal']\r\n if(authType === \"extern\")\r\n return ['usb', 'ble', 'nfc']\r\n if(authType === \"both\")\r\n return ['internal', 'usb', 'ble', 'nfc']\r\n\r\n // the default case: \"auto\", depending on device capabilities\r\n try {\r\n if(await isLocalAuthenticator())\r\n return ['internal']\r\n else\r\n return ['usb', 'ble', 'nfc']\r\n } catch(e) {\r\n return ['internal', 'usb', 'ble', 'nfc']\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Signs a challenge using one of the provided credentials IDs in order to authenticate the user.\r\n *\r\n * @param {string[]} credentialIds The list of credential IDs that can be used for signing.\r\n * @param {string} challenge A server-side randomly generated string, the base64 encoded version will be signed.\r\n * @param {Object} [options] Optional parameters.\r\n * @param {number} [options.timeout=60000] Number of milliseconds the user has to respond to the biometric/PIN check.\r\n * @param {'required'|'preferred'|'discouraged'} [options.userVerification='required'] Whether to prompt for biometric/PIN check or not.\r\n */\r\nexport async function login(credentialIds :string[], challenge :string, options :any) {\r\n if(!options)\r\n options = {}\r\n\r\n if(!utils.isBase64url(challenge))\r\n throw new Error('Provided challenge is not properly encoded in Base64url')\r\n\r\n const transports = await getTransports(options.authenticatorType ?? \"auto\");\r\n\r\n let authOptions :PublicKeyCredentialRequestOptions = {\r\n challenge: utils.parseBase64url(challenge),\r\n rpId: window.location.hostname,\r\n allowCredentials: credentialIds.map(id => { return {\r\n id: utils.parseBase64url(id),\r\n type: 'public-key',\r\n transports: transports,\r\n }}),\r\n userVerification: options.userVerification ?? \"required\",\r\n timeout: options.timeout ?? 60000,\r\n }\r\n\r\n console.debug(authOptions)\r\n let auth = await navigator.credentials.get({publicKey: authOptions}) as PublicKeyCredential\r\n console.debug(auth)\r\n\r\n const response = auth.response as AuthenticatorAssertionResponse\r\n\r\n return {\r\n credentialId: auth.id,\r\n //userHash: utils.toBase64url(response.userHandle), // unreliable, optional for authenticators\r\n clientJson: JSON.parse(utils.parseBuffer(response.clientDataJSON)),\r\n clientData: utils.toBase64url(response.clientDataJSON),\r\n signature: utils.toBase64url(response.signature),\r\n authenticatorJson: authenticators.parseAuthData(response.authenticatorData),\r\n authenticatorData: utils.toBase64url(response.authenticatorData)\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\ntype VerifyParams = {\r\n algorithm :'RS256' | 'ES256',\r\n publicKey :string, // Base64url encoded\r\n authenticatorData :string, // Base64url encoded\r\n clientData :string, // Base64url encoded\r\n signature :string, // Base64url encoded\r\n}\r\n\r\n// https://w3c.github.io/webauthn/#sctn-verifying-assertion\r\nexport async function verify({algorithm :NamedAlgo, publicKey, authenticatorData, clientData, signature} :VerifyParams) :Promise {\r\n let cryptoKey = await window.crypto.subtle.importKey(\r\n 'spki', utils.parseBase64url(publicKey), {name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, false, ['verify'])\r\n console.debug(cryptoKey)\r\n\r\n let clientHash = await utils.sha256( utils.parseBase64url(clientData) );\r\n console.debug(clientHash)\r\n\r\n\r\n let comboBuffer = utils.concatenateBuffers(utils.parseBase64url(authenticatorData), clientHash)\r\n console.debug(comboBuffer)\r\n\r\n console.debug(utils.parseBase64url(signature))\r\n\r\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify\r\n let validity = await window.crypto.subtle.verify({name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, cryptoKey, utils.parseBase64url(signature), comboBuffer)\r\n\r\n return validity\r\n}"], + "mappings": "0FAIO,SAASA,EAASC,EAA0B,CAC/C,OAAO,WAAW,KAAKA,EAAKC,GAAKA,EAAE,WAAW,CAAC,CAAC,EAAE,MACtD,CAEO,SAASC,EAAYC,EAA6B,CACrD,OAAO,OAAO,aAAa,GAAG,IAAI,WAAWA,CAAM,CAAC,CACxD,CAGO,SAASC,EAAYJ,EAAsB,CAC9C,OAAOA,EAAI,MAAM,qBAAqB,IAAM,IAChD,CAEO,SAASK,EAAYF,EAA6B,CAErD,OADY,KAAKD,EAAYC,CAAM,CAAC,EACzB,WAAW,IAAK,GAAG,EAAE,WAAW,IAAK,GAAG,CACvD,CAEO,SAASG,EAAeN,EAA0B,CACrD,OAAAA,EAAMA,EAAI,WAAW,IAAK,GAAG,EAAE,WAAW,IAAK,GAAG,EAC3CD,EAAS,KAAKC,CAAG,CAAC,CAC7B,CAGA,eAAsBO,EAAOJ,EAA2C,CACpE,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,UAAWA,CAAM,CAC9D,CAEO,SAASK,EAAaL,EAA6B,CACtD,MAAO,CAAC,GAAG,IAAI,WAAYA,CAAM,CAAC,EAC7B,IAAKM,GAAKA,EAAE,SAAU,EAAE,EAAE,SAAU,EAAG,GAAG,CAAC,EAC3C,KAAM,EAAE,CACjB,CAGO,SAASC,EAAmBC,EAAsBC,EAAuB,CAC5E,IAAIC,EAAM,IAAI,WAAWF,EAAQ,WAAaC,EAAQ,UAAU,EAChE,OAAAC,EAAI,IAAI,IAAI,WAAWF,CAAO,EAAG,CAAC,EAClCE,EAAI,IAAI,IAAI,WAAWD,CAAO,EAAGD,EAAQ,UAAU,EAC5CE,CACT,0wNCvCK,SAASC,EAAcC,EAAuB,CACjD,QAAQ,MAAMA,CAAQ,EACtB,IAAIC,EAAQ,IAAI,SAASD,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,EAC1D,QAAQ,MAAMC,CAAK,EAGnB,IAAIC,EAAc,CACd,SAAgBC,EAAYH,EAAS,MAAM,EAAE,EAAE,CAAC,EAC5C,MAAO,CACF,YAAa,CAAC,EAAEC,EAAQ,GAExB,aAAc,CAAC,EAAEA,EAAS,GAC1B,kBAAmB,CAAC,EAAEA,EAAQ,GAC9B,YAAa,CAAC,EAAEA,EAAQ,IAExB,aAAc,CAAC,EAAEA,EAAQ,IACzB,mBAAoB,CAAC,EAAEA,EAAQ,IACpC,EACA,QAAS,IAAI,SAASD,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,EAAG,EAAK,CACvE,EAEA,GAAGA,EAAS,WAAa,GAAI,CAEzB,IAAII,EAAmB,IAAI,SAASJ,EAAS,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,EAAG,EAAK,EAC7EE,EAAS,CACL,GAAGA,EACH,OAAQG,EAAcL,CAAQ,EAC9B,aAAoBG,EAAYH,EAAS,MAAM,GAAI,GAAGI,CAAgB,CAAC,EACvE,UAAiBD,EAAYH,EAAS,MAAM,GAAGI,EAAkBJ,EAAS,UAAU,CAAC,CACzF,CACJ,CAEA,OAAOE,CACX,CAEO,SAASG,EAAcL,EAA+B,CACzD,OAAOM,GAAaN,EAAS,MAAM,GAAI,EAAE,CAAC,CAC9C,CAEA,SAASM,GAAaC,EAA6B,CAC/C,IAAIC,EAAeC,EAAYF,CAAM,EACrC,OAAAC,EAASA,EAAO,UAAU,EAAE,CAAC,EAAI,IAAMA,EAAO,UAAU,EAAE,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EAAI,IAAMA,EAAO,UAAU,GAAG,EAAE,EACrJA,CACX,CAEO,SAASE,EAAyBV,EAA+B,CACpE,IAAMQ,EAASH,EAAcL,CAAQ,EAErC,OADuBW,IAAgCC,GACjCJ,IAAS,IACnC,CAEA,IAAIG,GAAoC,KClDjC,SAASE,IAAuB,CACnC,MAAO,CAAC,CAAC,OAAO,mBACpB,CAKA,eAAsBC,GAAyC,CAC3D,OAAO,MAAM,oBAAoB,8CAA8C,CACnF,CAIO,SAASC,GAAuBC,EAAkB,CACrD,OAAsBC,EAAoBC,EAAeF,CAAQ,CAAC,CACtE,CAIA,eAAeG,GAAkBC,EAAgE,CAC7F,GAAGA,IAAa,QACZ,MAAO,WACX,GAAGA,IAAa,SACZ,MAAO,iBACX,GAAGA,IAAa,OAIhB,GAAI,CACA,OAAG,MAAMN,EAAqB,EACnB,WAEA,gBACf,MAAE,CAGE,MACJ,CACJ,CAMA,SAASO,GAAYC,EAAyB,CAC1C,OAAOA,EAAK,CACR,IAAK,GAAI,MAAO,QAEhB,IAAK,KAAM,MAAO,QAClB,QAAS,MAAM,IAAI,MAAM,2BAA2BA,GAAK,CAC7D,CACJ,CAoBA,eAAsBC,GAASC,EAAkBC,EAAmBC,EAAc,CAI9E,GAHIA,IACAA,EAAU,CAAC,GAEZ,CAAOC,EAAYF,CAAS,EAC3B,MAAM,IAAI,MAAM,yDAAyD,EAE7E,IAAMG,EAAsD,CACxD,UAAiBV,EAAeO,CAAS,EACzC,GAAI,CACA,GAAI,OAAO,SAAS,SACpB,KAAM,OAAO,SAAS,QAC1B,EACA,KAAM,CACF,GAAI,MAAYI,EAAO,IAAI,YAAY,EAAE,OAAOL,CAAQ,CAAC,EACzD,KAAMA,EACN,YAAaA,CACjB,EACA,iBAAkB,CACd,CAAC,IAAK,GAAI,KAAM,YAAY,EAC5B,CAAC,IAAK,KAAM,KAAM,YAAY,CAClC,EACA,QAASE,EAAQ,SAAW,IAC5B,uBAAwB,CACpB,iBAAkBA,EAAQ,kBAAoB,WAC9C,wBAAyB,MAAMP,GAAkBO,EAAQ,mBAAqB,MAAM,CACxF,EACA,YAAa,QACjB,EAEA,QAAQ,MAAME,CAAe,EAC7B,IAAME,EAAa,MAAM,UAAU,YAAY,OAAO,CAAC,UAAWF,CAAe,CAAC,EAClF,QAAQ,MAAME,CAAU,EAExB,IAAMC,EAAWD,EAAW,SAE5B,MAAO,CACH,SAAUN,EACV,UAAWC,EACX,WAAY,CACR,GAAIK,EAAW,GACf,UAAiBE,EAAYD,EAAS,aAAa,CAAC,EACpD,UAAWV,GAAYS,EAAW,SAAS,sBAAsB,CAAC,CACtE,EACA,cAAe,CACX,QAAUA,EAAW,0BAA4B,WAEjD,OAAuBG,EAAcF,EAAS,qBAAqB,CAAC,EACpE,KAAqBG,EAAyBH,EAAS,qBAAqB,CAAC,EAC7E,YAAaL,EAAQ,YAAoBM,EAAYD,EAAS,iBAAiB,EAAI,KACnF,WAAYL,EAAQ,YAAoBM,EAAYD,EAAS,cAAc,EAAI,IACnF,CACJ,CACJ,CAGA,eAAeI,GAAcf,EAAuD,CAChF,GAAGA,IAAa,QACZ,MAAO,CAAC,UAAU,EACtB,GAAGA,IAAa,SACZ,MAAO,CAAC,MAAO,MAAO,KAAK,EAC/B,GAAGA,IAAa,OACZ,MAAO,CAAC,WAAY,MAAO,MAAO,KAAK,EAG3C,GAAI,CACA,OAAG,MAAMN,EAAqB,EACnB,CAAC,UAAU,EAEX,CAAC,MAAO,MAAO,KAAK,CACnC,MAAE,CACE,MAAO,CAAC,WAAY,MAAO,MAAO,KAAK,CAC3C,CACJ,CAYA,eAAsBsB,GAAMC,EAAyBZ,EAAmBC,EAAc,CAIlF,GAHIA,IACAA,EAAU,CAAC,GAEZ,CAAOC,EAAYF,CAAS,EAC3B,MAAM,IAAI,MAAM,yDAAyD,EAE7E,IAAMa,EAAa,MAAMH,GAAcT,EAAQ,mBAAqB,MAAM,EAEtEa,EAAiD,CACjD,UAAiBrB,EAAeO,CAAS,EACzC,KAAM,OAAO,SAAS,SACtB,iBAAkBY,EAAc,IAAIG,IAAe,CAC/C,GAAUtB,EAAesB,CAAE,EAC3B,KAAM,aACN,WAAYF,CAChB,EAAE,EACF,iBAAkBZ,EAAQ,kBAAoB,WAC9C,QAASA,EAAQ,SAAW,GAChC,EAEA,QAAQ,MAAMa,CAAW,EACzB,IAAIE,EAAO,MAAM,UAAU,YAAY,IAAI,CAAC,UAAWF,CAAW,CAAC,EACnE,QAAQ,MAAME,CAAI,EAElB,IAAMV,EAAWU,EAAK,SAEtB,MAAO,CACH,aAAcA,EAAK,GAEnB,WAAY,KAAK,MAAYC,EAAYX,EAAS,cAAc,CAAC,EACjE,WAAkBC,EAAYD,EAAS,cAAc,EACrD,UAAiBC,EAAYD,EAAS,SAAS,EAC/C,kBAAkCd,EAAcc,EAAS,iBAAiB,EAC1E,kBAAyBC,EAAYD,EAAS,iBAAiB,CACnE,CACJ,CAgBA,eAAsBY,GAAO,CAAC,UAAWC,EAAW,UAAAC,EAAW,kBAAAC,EAAmB,WAAAC,EAAY,UAAAC,CAAS,EAAmC,CACtI,IAAIC,EAAY,MAAM,OAAO,OAAO,OAAO,UACvC,OAAc/B,EAAe2B,CAAS,EAAG,CAAC,KAAK,oBAAqB,KAAK,SAAS,EAAG,GAAO,CAAC,QAAQ,CAAC,EAC1G,QAAQ,MAAMI,CAAS,EAEvB,IAAIC,EAAa,MAAYrB,EAAcX,EAAe6B,CAAU,CAAE,EACtE,QAAQ,MAAMG,CAAU,EAGxB,IAAIC,EAAoBC,EAAyBlC,EAAe4B,CAAiB,EAAGI,CAAU,EAC9F,eAAQ,MAAMC,CAAW,EAEzB,QAAQ,MAAYjC,EAAe8B,CAAS,CAAC,EAG9B,MAAM,OAAO,OAAO,OAAO,OAAO,CAAC,KAAK,oBAAqB,KAAK,SAAS,EAAGC,EAAiB/B,EAAe8B,CAAS,EAAGG,CAAW,CAGxJ", + "names": ["toBuffer", "txt", "c", "parseBuffer", "buffer", "isBase64url", "toBase64url", "parseBase64url", "sha256", "bufferToHex", "b", "concatenateBuffers", "buffer1", "buffer2", "tmp", "parseAuthData", "authData", "flags", "parsed", "toBase64url", "credentialLength", "extractAaguid", "formatAaguid", "buffer", "aaguid", "bufferToHex", "resolveAuthenticatorName", "updatedAuthenticatorMetadata", "authenticatorMetadata_exports", "isAvailable", "isLocalAuthenticator", "parseAuthenticatorData", "authData", "parseAuthData", "parseBase64url", "getAuthAttachment", "authType", "getAlgoName", "num", "register", "username", "challenge", "options", "isBase64url", "creationOptions", "sha256", "credential", "response", "toBase64url", "extractAaguid", "resolveAuthenticatorName", "getTransports", "login", "credentialIds", "transports", "authOptions", "id", "auth", "parseBuffer", "verify", "NamedAlgo", "publicKey", "authenticatorData", "clientData", "signature", "cryptoKey", "clientHash", "comboBuffer", "concatenateBuffers"] +} diff --git a/package-lock.json b/package-lock.json index e1a23f7..9459f77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,122 +1,204 @@ { - "name": "passwordless", - "version": "0.0.1", + "name": "@passwordless-id/webauthn", + "version": "0.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "passwordless", - "version": "0.0.1", + "name": "@passwordless-id/webauthn", + "version": "0.0.4", "license": "MIT", "devDependencies": { "esbuild": "^0.15.8", - "parcel": "^2.7.0", + "http-server": "^14.1.1", "typescript": "^4.8.3" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@esbuild/android-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", + "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "dependencies": { - "@babel/highlight": "^7.18.6" + "esbuild-wasm": "0.15.8" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", + "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", + "cpu": [ + "loong64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "safe-buffer": "5.1.2" }, "engines": { - "node": ">=4" + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "ms": "^2.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.8.tgz", + "integrity": "sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.8", + "@esbuild/linux-loong64": "0.15.8", + "esbuild-android-64": "0.15.8", + "esbuild-android-arm64": "0.15.8", + "esbuild-darwin-64": "0.15.8", + "esbuild-darwin-arm64": "0.15.8", + "esbuild-freebsd-64": "0.15.8", + "esbuild-freebsd-arm64": "0.15.8", + "esbuild-linux-32": "0.15.8", + "esbuild-linux-64": "0.15.8", + "esbuild-linux-arm": "0.15.8", + "esbuild-linux-arm64": "0.15.8", + "esbuild-linux-mips64le": "0.15.8", + "esbuild-linux-ppc64le": "0.15.8", + "esbuild-linux-riscv64": "0.15.8", + "esbuild-linux-s390x": "0.15.8", + "esbuild-netbsd-64": "0.15.8", + "esbuild-openbsd-64": "0.15.8", + "esbuild-sunos-64": "0.15.8", + "esbuild-windows-32": "0.15.8", + "esbuild-windows-64": "0.15.8", + "esbuild-windows-arm64": "0.15.8" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/esbuild-android-64": { "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", - "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.8.tgz", + "integrity": "sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, @@ -130,99 +212,42 @@ "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { + "node_modules/esbuild-android-arm64": { "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", - "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.8.tgz", + "integrity": "sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==", "cpu": [ - "loong64" + "arm64" ], "dev": true, "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/esbuild-darwin-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.8.tgz", + "integrity": "sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node": ">=12" } }, - "node_modules/@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "node_modules/@lezer/lr": { + "node_modules/esbuild-darwin-arm64": { "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", - "dev": true, - "dependencies": { - "@lezer/common": "^0.15.0" - } - }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.8.tgz", + "integrity": "sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==", "cpu": [ "arm64" ], @@ -230,51 +255,63 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", + "node_modules/esbuild-freebsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.8.tgz", + "integrity": "sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "darwin" - ] + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.8.tgz", + "integrity": "sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==", "cpu": [ - "arm" + "arm64" ], "dev": true, "optional": true, "os": [ - "linux" - ] + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", + "node_modules/esbuild-linux-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.8.tgz", + "integrity": "sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==", "cpu": [ - "arm64" + "ia32" ], "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", + "node_modules/esbuild-linux-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.8.tgz", + "integrity": "sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==", "cpu": [ "x64" ], @@ -282,3852 +319,563 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", + "node_modules/esbuild-linux-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.8.tgz", + "integrity": "sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==", "cpu": [ - "x64" + "arm" ], "dev": true, "optional": true, "os": [ - "win32" - ] - }, - "node_modules/@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", - "dev": true, - "dependencies": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" - }, + "linux" + ], "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", - "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", + "node_modules/esbuild-linux-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.8.tgz", + "integrity": "sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", - "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", - "cpu": [ - "x64" + "linux" ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", - "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.8.tgz", + "integrity": "sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==", "cpu": [ - "arm" + "mips64el" ], "dev": true, "optional": true, "os": [ "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", - "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", - "cpu": [ - "arm64" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.8.tgz", + "integrity": "sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==", + "cpu": [ + "ppc64" ], "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", - "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.8.tgz", + "integrity": "sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", - "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", + "node_modules/esbuild-linux-s390x": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.8.tgz", + "integrity": "sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==", "cpu": [ - "x64" + "s390x" ], "dev": true, "optional": true, "os": [ - "win32" - ] - }, - "node_modules/@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, + "linux" + ], "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", + "node_modules/esbuild-netbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.8.tgz", + "integrity": "sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "node": ">=12" } }, - "node_modules/@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", + "node_modules/esbuild-openbsd-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.8.tgz", + "integrity": "sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", + "node_modules/esbuild-sunos-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.8.tgz", + "integrity": "sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", - "dev": true, - "dependencies": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "node": ">=12" } }, - "node_modules/@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", + "node_modules/esbuild-wasm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.8.tgz", + "integrity": "sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==", "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" + "optional": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", + "node_modules/esbuild-windows-32": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.8.tgz", + "integrity": "sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "lightningcss": "^1.14.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", + "node_modules/esbuild-windows-64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.8.tgz", + "integrity": "sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", + "node_modules/esbuild-windows-arm64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.8.tgz", + "integrity": "sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, - "dependencies": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=4.0" }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "function-bind": "^1.1.1" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 0.4.0" } }, - "node_modules/@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8" } }, - "node_modules/@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" - }, "engines": { - "node": ">= 12.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "he": "bin/he" } }, - "node_modules/@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=12" } }, - "node_modules/@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=8.0.0" } }, - "node_modules/@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "bin": { + "http-server": "bin/http-server" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "engines": { + "node": ">=12" } }, - "node_modules/@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=0.10.0" } }, - "node_modules/@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">=4" } }, - "node_modules/@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "minimist": "^1.2.6" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" + "bin": { + "opener": "bin/opener-bin.js" } }, - "node_modules/@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "node": ">= 0.12.0" } }, - "node_modules/@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" + "side-channel": "^1.0.4" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@parcel/plugin": "2.7.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", - "dev": true, - "dependencies": { - "@parcel/types": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", - "dev": true, - "dependencies": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": "^12.18.3 || >=14" - } - }, - "node_modules/@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", - "dev": true, - "dependencies": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", - "dev": true, - "dependencies": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0", - "parcel": "^2.7.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "typescript": ">=3.0.0" - } - }, - "node_modules/@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", - "dev": true, - "dependencies": { - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "typescript": ">=3.0.0" - } - }, - "node_modules/@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", - "dev": true, - "dependencies": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" - } - }, - "node_modules/@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", - "dev": true, - "dependencies": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.5.tgz", - "integrity": "sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", - "dev": true, - "dependencies": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "peerDependencies": { - "@parcel/core": "^2.7.0" - } - }, - "node_modules/@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001409", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz", - "integrity": "sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.257", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.257.tgz", - "integrity": "sha512-C65sIwHqNnPC2ADMfse/jWTtmhZMII+x6ADI9gENzrOiI7BpxmfKFE84WkIEl5wEg+7+SfIkwChDlsd1Erju2A==", - "dev": true - }, - "node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.8.tgz", - "integrity": "sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.8", - "@esbuild/linux-loong64": "0.15.8", - "esbuild-android-64": "0.15.8", - "esbuild-android-arm64": "0.15.8", - "esbuild-darwin-64": "0.15.8", - "esbuild-darwin-arm64": "0.15.8", - "esbuild-freebsd-64": "0.15.8", - "esbuild-freebsd-arm64": "0.15.8", - "esbuild-linux-32": "0.15.8", - "esbuild-linux-64": "0.15.8", - "esbuild-linux-arm": "0.15.8", - "esbuild-linux-arm64": "0.15.8", - "esbuild-linux-mips64le": "0.15.8", - "esbuild-linux-ppc64le": "0.15.8", - "esbuild-linux-riscv64": "0.15.8", - "esbuild-linux-s390x": "0.15.8", - "esbuild-netbsd-64": "0.15.8", - "esbuild-openbsd-64": "0.15.8", - "esbuild-sunos-64": "0.15.8", - "esbuild-windows-32": "0.15.8", - "esbuild-windows-64": "0.15.8", - "esbuild-windows-arm64": "0.15.8" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.8.tgz", - "integrity": "sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "dependencies": { - "esbuild-wasm": "0.15.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.8.tgz", - "integrity": "sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.8.tgz", - "integrity": "sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.8.tgz", - "integrity": "sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.8.tgz", - "integrity": "sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.8.tgz", - "integrity": "sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.8.tgz", - "integrity": "sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.8.tgz", - "integrity": "sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.8.tgz", - "integrity": "sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.8.tgz", - "integrity": "sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.8.tgz", - "integrity": "sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.8.tgz", - "integrity": "sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.8.tgz", - "integrity": "sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.8.tgz", - "integrity": "sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.8.tgz", - "integrity": "sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.8.tgz", - "integrity": "sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.8.tgz", - "integrity": "sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-wasm": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.8.tgz", - "integrity": "sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==", - "dev": true, - "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.8.tgz", - "integrity": "sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.8.tgz", - "integrity": "sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.8.tgz", - "integrity": "sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/htmlnano": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" - }, - "peerDependencies": { - "cssnano": "^5.0.11", - "postcss": "^8.3.11", - "purgecss": "^4.0.3", - "relateurl": "^0.2.7", - "srcset": "^5.0.0", - "svgo": "^2.8.0", - "terser": "^5.10.0", - "uncss": "^0.17.3" - }, - "peerDependenciesMeta": { - "cssnano": { - "optional": true - }, - "postcss": { - "optional": true - }, - "purgecss": { - "optional": true - }, - "relateurl": { - "optional": true - }, - "srcset": { - "optional": true - }, - "svgo": { - "optional": true - }, - "terser": { - "optional": true - }, - "uncss": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", - "dev": true, - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2" - } - }, - "node_modules/lmdb/node_modules/node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/msgpackr": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.7.0.tgz", - "integrity": "sha512-/lumbjWnrRn8mZ8TEJXbFpkRDSei94CcqwcgbyuE0hT2/f6az2Fmi4ojNUOUTS9T8AYyADrmoPvCiLL9+ufvsA==", - "dev": true, - "optionalDependencies": { - "msgpackr-extract": "^2.1.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", - "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.0.3" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2" - } - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true - }, - "node_modules/ordered-binary": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.3.0.tgz", - "integrity": "sha512-knIeYepTI6BDAzGxqFEDGtI/iGqs57H32CInAIxEvAHG46vk1Di0CEpyc1A7iY39B1mfik3g3KLYwOTNnnMHLA==", - "dev": true - }, - "node_modules/parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "dependencies": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - }, - "bin": { - "parcel": "lib/bin.js" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "dependencies": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", - "dev": true, - "dependencies": { - "is-json": "^2.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/posthtml/node_modules/posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, - "node_modules/react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "node_modules/xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@esbuild/android-arm": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", - "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", - "dev": true, - "optional": true, - "requires": { - "esbuild-wasm": "0.15.8" - } - }, - "@esbuild/linux-loong64": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", - "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", - "dev": true, - "optional": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@lezer/common": { - "version": "0.15.12", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz", - "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==", - "dev": true - }, - "@lezer/lr": { - "version": "0.15.8", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz", - "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.0" - } - }, - "@lmdb/lmdb-darwin-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz", - "integrity": "sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-darwin-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz", - "integrity": "sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz", - "integrity": "sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-arm64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz", - "integrity": "sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-linux-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz", - "integrity": "sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==", - "dev": true, - "optional": true - }, - "@lmdb/lmdb-win32-x64": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz", - "integrity": "sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==", - "dev": true, - "optional": true - }, - "@mischnic/json-sourcemap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz", - "integrity": "sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==", - "dev": true, - "requires": { - "@lezer/common": "^0.15.7", - "@lezer/lr": "^0.15.4", - "json5": "^2.2.1" - } - }, - "@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.1.2.tgz", - "integrity": "sha512-TyVLn3S/+ikMDsh0gbKv2YydKClN8HaJDDpONlaZR+LVJmsxLFUgA+O7zu59h9+f9gX1aj/ahw9wqa6rosmrYQ==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.1.2.tgz", - "integrity": "sha512-YPXtcVkhmVNoMGlqp81ZHW4dMxK09msWgnxtsDpSiZwTzUBG2N+No2bsr7WMtBKCVJMSD6mbAl7YhKUqkp/Few==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.1.2.tgz", - "integrity": "sha512-42R4MAFeIeNn+L98qwxAt360bwzX2Kf0ZQkBBucJ2Ircza3asoY4CDbgiu9VWklq8gWJVSJSJBwDI+c/THiWkA==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.1.2.tgz", - "integrity": "sha512-vHZ2JiOWF2+DN9lzltGbhtQNzDo8fKFGrf37UJrgqxU0yvtERrzUugnfnX1wmVfFhSsF8OxrfqiNOUc5hko1Zg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.1.2.tgz", - "integrity": "sha512-RjRoRxg7Q3kPAdUSC5EUUPlwfMkIVhmaRTIe+cqHbKrGZ4M6TyCA/b5qMaukQ/1CHWrqYY2FbKOAU8Hg0pQFzg==", - "dev": true, - "optional": true - }, - "@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.1.2.tgz", - "integrity": "sha512-rIZVR48zA8hGkHIK7ED6+ZiXsjRCcAVBJbm8o89OKAMTmEAQ2QvoOxoiu3w2isAaWwzgtQIOFIqHwvZDyLKCvw==", - "dev": true, - "optional": true - }, - "@parcel/bundler-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.7.0.tgz", - "integrity": "sha512-PU5MtWWhc+dYI9x8mguYnm9yiG6TkI7niRpxgJgtqAyGHuEyNXVBQQ0X+qyOF4D9LdankBf8uNN18g31IET2Zg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/cache": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.7.0.tgz", - "integrity": "sha512-JlXNoZXcWzLKdDlfeF3dIj5Vtel5T9vtdBN72PJ+cjC4qNHk4Uwvc5sfOBELuibGN0bVu2bwY9nUgSwCiB1iIA==", - "dev": true, - "requires": { - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/utils": "2.7.0", - "lmdb": "2.5.2" - } - }, - "@parcel/codeframe": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.7.0.tgz", - "integrity": "sha512-UTKx0jejJmmO1dwTHSJuRgrO8N6PMlkxRT6sew8N6NC3Bgv6pu0EbO+RtlWt/jCvzcdLOPdIoTzj4MMZvgcMYg==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@parcel/compressor-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.7.0.tgz", - "integrity": "sha512-SCXwnOOQT6EmpusBsYWNQ/RFri+2JnKuE0gMSf2dROl2xbererX45FYzeDplWALCKAdjMNDpFwU+FyMYoVZSCQ==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/config-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.7.0.tgz", - "integrity": "sha512-ZzsLr97AYrz8c9k6qn3DlqPzifi3vbP7q3ynUrAFxmt0L4+K0H9N508ZkORYmCgaFjLIQ8Y3eWpwCJ0AewPNIg==", - "dev": true, - "requires": { - "@parcel/bundler-default": "2.7.0", - "@parcel/compressor-raw": "2.7.0", - "@parcel/namer-default": "2.7.0", - "@parcel/optimizer-css": "2.7.0", - "@parcel/optimizer-htmlnano": "2.7.0", - "@parcel/optimizer-image": "2.7.0", - "@parcel/optimizer-svgo": "2.7.0", - "@parcel/optimizer-terser": "2.7.0", - "@parcel/packager-css": "2.7.0", - "@parcel/packager-html": "2.7.0", - "@parcel/packager-js": "2.7.0", - "@parcel/packager-raw": "2.7.0", - "@parcel/packager-svg": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/resolver-default": "2.7.0", - "@parcel/runtime-browser-hmr": "2.7.0", - "@parcel/runtime-js": "2.7.0", - "@parcel/runtime-react-refresh": "2.7.0", - "@parcel/runtime-service-worker": "2.7.0", - "@parcel/transformer-babel": "2.7.0", - "@parcel/transformer-css": "2.7.0", - "@parcel/transformer-html": "2.7.0", - "@parcel/transformer-image": "2.7.0", - "@parcel/transformer-js": "2.7.0", - "@parcel/transformer-json": "2.7.0", - "@parcel/transformer-postcss": "2.7.0", - "@parcel/transformer-posthtml": "2.7.0", - "@parcel/transformer-raw": "2.7.0", - "@parcel/transformer-react-refresh-wrap": "2.7.0", - "@parcel/transformer-svg": "2.7.0" - } - }, - "@parcel/core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.7.0.tgz", - "integrity": "sha512-7yKZUdh314Q/kU/9+27ZYTfcnXS6VYHuG+iiUlIohnvUUybxLqVJhdMU9Q+z2QcPka1IdJWz4K4Xx0y6/4goyg==", - "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/graph": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "abortcontroller-polyfill": "^1.1.9", - "base-x": "^3.0.8", - "browserslist": "^4.6.6", - "clone": "^2.1.1", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "json5": "^2.2.0", - "msgpackr": "^1.5.4", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - } - }, - "@parcel/css": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@parcel/css/-/css-1.14.0.tgz", - "integrity": "sha512-r5tJWe6NF6lesfPw1N3g7N7WUKpHqi2ONnw9wl5ccSGGIxkmgcPaPQxfvmhdjXvQnktSuIOR0HjQXVXu+/en/w==", - "dev": true, - "requires": { - "lightningcss": "^1.14.0" - } - }, - "@parcel/diagnostic": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.7.0.tgz", - "integrity": "sha512-pdq/cTwVoL0n8yuDCRXFRSQHVWdmmIXPt3R3iT4KtYDYvOrMT2dLPT79IMqQkhYPANW8GuL15n/WxRngfRdkug==", - "dev": true, - "requires": { - "@mischnic/json-sourcemap": "^0.1.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.7.0.tgz", - "integrity": "sha512-kQDwMKgZ1U4M/G17qeDYF6bW5kybluN6ajYPc7mZcrWg+trEI/oXi81GMFaMX0BSUhwhbiN5+/Vb2wiG/Sn6ig==", - "dev": true - }, - "@parcel/fs": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.7.0.tgz", - "integrity": "sha512-PU5fo4Hh8y03LZgemgVREttc0wyHQUNmsJCybxTB7EjJie2CqJRumo+DFppArlvdchLwJdc9em03yQV/GNWrEg==", - "dev": true, - "requires": { - "@parcel/fs-search": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/watcher": "^2.0.0", - "@parcel/workers": "2.7.0" - } - }, - "@parcel/fs-search": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/fs-search/-/fs-search-2.7.0.tgz", - "integrity": "sha512-K1Hv25bnRpwQVA15RvcRuB8ZhfclnCHA8N8L6w7Ul1ncSJDxCIkIAc5hAubYNNYW3kWjCC2SOaEgFKnbvMllEQ==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/graph": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-2.7.0.tgz", - "integrity": "sha512-Q6E94GS6q45PtsZh+m+gvFRp/N1Qopxhu2sxjcWsGs5iBd6IWn2oYLWOH5iVzEjWuYpW2HkB08lH6J50O63uOA==", - "dev": true, - "requires": { - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/hash": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/hash/-/hash-2.7.0.tgz", - "integrity": "sha512-k6bSKnIlPJMPU3yjQzfgfvF9zuJZGOAlJgzpL4BbWvdbE8BTdjzLcFn0Ujrtud94EgIkiXd22sC2HpCUWoHGdA==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3", - "xxhash-wasm": "^0.4.2" - } - }, - "@parcel/logger": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.7.0.tgz", - "integrity": "sha512-qjMY/bYo38+o+OiIrTRldU9CwL1E7J72t+xkTP8QIcUxLWz5LYR0YbynZUVulmBSfqsykjjxCy4a+8siVr+lPw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0" - } - }, - "@parcel/markdown-ansi": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.7.0.tgz", - "integrity": "sha512-ipOX0D6FVZFEXeb/z8MnTMq2RQEIuaILY90olVIuHEFLHHfOPEn+RK3u13HA1ChF5/9E3cMD79tu6x9JL9Kqag==", - "dev": true, - "requires": { - "chalk": "^4.1.0" - } - }, - "@parcel/namer-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.7.0.tgz", - "integrity": "sha512-lIKMdsmi//7fepecNDYmJYzBlL91HifPsX03lJCdu1dC6q5fBs+gG0XjKKG7yPnSCw1qH/4m7drzt9+dRZYAHQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/node-resolver-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-2.7.0.tgz", - "integrity": "sha512-5UJQHalqMxdhJIs2hhqQzFfQpF7+NAowsRq064lYtiRvcD8wMr3OOQ9wd1iazGpFSl4JKdT7BwDU9/miDJmanQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.1" - } - }, - "@parcel/optimizer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.7.0.tgz", - "integrity": "sha512-IfnOMACqhcAclKyOW9X9JpsknB6OShk9OVvb8EvbDTKHJhQHNNmzE88OkSI/pS3ZVZP9Zj+nWcVHguV+kvDeiQ==", - "dev": true, - "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - } - }, - "@parcel/optimizer-htmlnano": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.7.0.tgz", - "integrity": "sha512-5QrGdWS5Hi4VXE3nQNrGqugmSXt68YIsWwKRAdarOxzyULSJS3gbCiQOXqIPRJobfZjnSIcdtkyxSiCUe1inIA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "htmlnano": "^2.0.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "svgo": "^2.4.0" - } - }, - "@parcel/optimizer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.7.0.tgz", - "integrity": "sha512-EnaXz5UjR67FUu0BEcqZTT9LsbB/iFAkkghCotbnbOuC5QQsloq6tw54TKU3y+R3qsjgUoMtGxPcGfVoXxZXYw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "detect-libc": "^1.0.3" - } - }, - "@parcel/optimizer-svgo": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-svgo/-/optimizer-svgo-2.7.0.tgz", - "integrity": "sha512-IO1JV4NpfP3V7FrhsqCcV8pDQIHraFi1/ZvEJyssITxjH49Im/txKlwMiQuZZryAPn8Xb8g395Muawuk6AK6sg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "svgo": "^2.4.0" - } - }, - "@parcel/optimizer-terser": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/optimizer-terser/-/optimizer-terser-2.7.0.tgz", - "integrity": "sha512-07VZjIO8xsl2/WmS/qHI8lI/cpu47iS9eRpqwfZEEsdk1cfz50jhWkmFudHBxiHGMfcZ//1+DdaPg9RDBWZtZA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "terser": "^5.2.0" - } - }, - "@parcel/package-manager": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.7.0.tgz", - "integrity": "sha512-wmfSX1mRrTi8MeA4KrnPk/x7zGUsILCQmTo6lA4gygzAxDbM1pGuyFN8/Kt0y0SFO2lbljARtD/4an5qdotH+Q==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "semver": "^5.7.1" - } - }, - "@parcel/packager-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.7.0.tgz", - "integrity": "sha512-44nzZwu+ssGuiFmYM6cf/Y4iChiUZ4DUzzpegnGlhXtKJKe4NHntxThJynuRZWKN2AAf48avApDpimg2jW0KDw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/packager-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.7.0.tgz", - "integrity": "sha512-Zgqd7sdcY/UnR370GR0q2ilmEohUDXsO8A1F28QCJzIsR1iCB6KRUT74+pawfQ1IhXZLaaFLLYe0UWcfm0JeXg==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5" - } - }, - "@parcel/packager-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.7.0.tgz", - "integrity": "sha512-wTRdM81PgRVDzWGXdWmqLwguWnTYWzhEDdjXpW2n8uMOu/CjHhMtogk65aaYk3GOnq6OBL/NsrmBiV/zKPj1vA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "globals": "^13.2.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/packager-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.7.0.tgz", - "integrity": "sha512-jg2Zp8dI5VpIQlaeahXDCfrPN9m/DKht1NkR9P2CylMAwqCcc1Xc1RRiF0wfwcPZpPMpq1265n+4qnB7rjGBlA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/packager-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.7.0.tgz", - "integrity": "sha512-EmJg3HpD6/xxKBjir/CdCKJZwI24iVfBuxRS9LUp3xHAIebOzVh1z6IN+i2Di5+NyRwfOFaLliL4uMa1zwbyCA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "posthtml": "^0.16.4" - } - }, - "@parcel/packager-ts": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.7.0.tgz", - "integrity": "sha512-XT46njOHQCYmubQRbtjQOLT9RbXgxQ8aTxCOeO9jEay6snDnY6k+HdMXHAD6qZNyVgm85HJzjmDFDUeJQt9LKw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.7.0.tgz", - "integrity": "sha512-qqgx+nnMn6/0lRc4lKbLGmhNtBiT93S2gFNB4Eb4Pfz/SxVYoW+fmml+KdfOSiZffWOAH5L6NwhyD7N8aSikzw==", - "dev": true, - "requires": { - "@parcel/types": "2.7.0" - } - }, - "@parcel/reporter-cli": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.7.0.tgz", - "integrity": "sha512-80gEODg8cnAmnxGVuaSVDo8JJ54P9AA2bHwSs1cIkHWlJ3BjDQb83H31bBHncJ5Kn5kQ/j+7WjlqHpTCiOR9PA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "term-size": "^2.2.1" - } - }, - "@parcel/reporter-dev-server": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.7.0.tgz", - "integrity": "sha512-ySuou5addK8fGue8aXzo536BaEjMujDrEc1xkp4TasInXHVcA98b+SYX5NAZTGob5CxKvZQ5ylhg77zW30B+iA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - } - }, - "@parcel/resolver-default": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.7.0.tgz", - "integrity": "sha512-v8TvWsbLK7/q7n4gv6OrYNbW18xUx4zKbVMGZb1u4yMhzEH4HFr1D9OeoTq3jk+ximAigds8B6triQbL5exF7A==", - "dev": true, - "requires": { - "@parcel/node-resolver-core": "2.7.0", - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/runtime-browser-hmr": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.7.0.tgz", - "integrity": "sha512-PLbMLdclQeYsi2LkilZVGFV1n3y55G1jaBvby4ekedUZjMw3SWdMY2tDxgSDdFWfLCnYHJXdGUQSzGGi1kPzjA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0" - } - }, - "@parcel/runtime-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.7.0.tgz", - "integrity": "sha512-9/YUZTBNrSN2H6rbz/o1EOM0O7I3ZR/x9IDzxjJBD6Mi+0uCgCD02aedare/SNr1qgnbZZWmhpOzC+YgREcfLA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/runtime-react-refresh": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.7.0.tgz", - "integrity": "sha512-vDKO0rWqRzEpmvoZ4kkYUiSsTxT5NnH904BFPFxKI0wJCl6yEmPuEifmATo73OuYhP6jIP3Qfl1R4TtiDFPJ1Q==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-error-overlay": "6.0.9", - "react-refresh": "^0.9.0" - } - }, - "@parcel/runtime-service-worker": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.7.0.tgz", - "integrity": "sha512-uD2pAV0yV6+e7JaWH4KVPbG+zRCrxr/OACyS9tIh+Q/R1vRmh8zGM3yhdrcoiZ7tFOnM72vd6xY11eTrUsSVig==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/source-map": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", - "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, - "requires": { - "detect-libc": "^1.0.3" - } - }, - "@parcel/transformer-babel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.7.0.tgz", - "integrity": "sha512-7iklDXXnKH1530+QbI+e4kIJ+Q1puA1ulRS10db3aUJMj5GnvXGDFwhSZ7+T1ps66QHO7cVO29VlbqiRDarH1Q==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "json5": "^2.2.0", - "nullthrows": "^1.1.1", - "semver": "^5.7.0" - } - }, - "@parcel/transformer-css": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.7.0.tgz", - "integrity": "sha512-J4EpWK9spQpXyNCmKK8Xnane0xW/1B/EAmfp7Fiv7g+5yUjY4ODf4KUugvE+Eb2gekPkhOKNHermO2KrX0/PFA==", - "dev": true, - "requires": { - "@parcel/css": "^1.12.2", - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "browserslist": "^4.6.6", - "nullthrows": "^1.1.1" - } - }, - "@parcel/transformer-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.7.0.tgz", - "integrity": "sha512-wYJl5rn81W+Rlk9oQwDJcjoVsWVDKyeri84FzmlGXOsg0EYgnqOiG+3MDM8GeZjfuGe5fuoum4eqZeS0WdUHXw==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-image": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.7.0.tgz", - "integrity": "sha512-mhi9/R5/ULhCkL2COVIKhNFoLDiZwQgprdaTJr5fnODggVxEX5o7ebFV6KNLMTEkwZUJWoB1hL0ziI0++DtoFA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/transformer-js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.7.0.tgz", - "integrity": "sha512-mzerR+D4rDomUSIk5RSTa2w+DXBdXUeQrpDO74WCDdpDi1lIl8ppFpqtmU7O6y6p8QsgkmS9b0g/vhcry6CJTA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/utils": "2.7.0", - "@parcel/workers": "2.7.0", - "@swc/helpers": "^0.4.2", - "browserslist": "^4.6.6", - "detect-libc": "^1.0.3", - "nullthrows": "^1.1.1", - "regenerator-runtime": "^0.13.7", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.7.0.tgz", - "integrity": "sha512-RQjuxBpYOch+kr4a0zi77KJtOLTPYRM7iq4NN80zKnA0r0dwDUCxZBtaj2l0O0o3R4MMJnm+ncP+cB7XR7dZYA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "json5": "^2.2.0" - } - }, - "@parcel/transformer-postcss": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.7.0.tgz", - "integrity": "sha512-b6RskXBWf0MjpC9qjR2dQ1ZdRnlOiKYseG5CEovWCqM218RtdydFKz7jS+5Gxkb6qBtOG7zGPONXdPe+gTILcA==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "clone": "^2.1.1", - "nullthrows": "^1.1.1", - "postcss-value-parser": "^4.2.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-posthtml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.7.0.tgz", - "integrity": "sha512-cP8YOiSynWJ1ycmBlhnnHeuQb2cwmklZ+BNyLUktj5p78kDy2de7VjX+dRNRHoW4H9OgEcSF4UEfDVVz5RYIhw==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-raw": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.7.0.tgz", - "integrity": "sha512-sDnItWCFSDez0izK1i5cgv+kXzZTbcJh4rNpVIgmE1kBLvAz608sqgcCkavb2wVJIvLesxYM+5G4p1CwkDlZ1g==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0" - } - }, - "@parcel/transformer-react-refresh-wrap": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.7.0.tgz", - "integrity": "sha512-1vRmIJzyBA1nIiXTAU6tZExq2FvJj/2F0ft6KDw8GYPv0KjmdiPo/PmaZ7JeSVOM6SdXQIQCbTmp1vkMP7DtkA==", - "dev": true, - "requires": { - "@parcel/plugin": "2.7.0", - "@parcel/utils": "2.7.0", - "react-refresh": "^0.9.0" - } - }, - "@parcel/transformer-svg": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.7.0.tgz", - "integrity": "sha512-ioER37zceuuE+K6ZrnjCyMUWEnv+63hIAFResc1OXxRhyt+7kzMz9ZqK0Mt6QMLwl1dxhkLmrU41n9IxzKZuSQ==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/plugin": "2.7.0", - "nullthrows": "^1.1.1", - "posthtml": "^0.16.5", - "posthtml-parser": "^0.10.1", - "posthtml-render": "^3.0.0", - "semver": "^5.7.1" - } - }, - "@parcel/transformer-typescript-types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.7.0.tgz", - "integrity": "sha512-7eZFJH+0ZOZoh+4ZUKVnP79LI8h45hGAAqCI1UG8l7ZEf6q9yy8lwF9cREu4dUih70TDUHnHkxoNHfZWOjkDSg==", - "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/plugin": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/ts-utils": "2.7.0", - "@parcel/utils": "2.7.0", - "nullthrows": "^1.1.1" - } - }, - "@parcel/ts-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.7.0.tgz", - "integrity": "sha512-hxgWu9p9+zo9OvllYy12DRrAEyAGGLQysI6PyNvYvsZSmb7sQg9YQ7spD1QmWIQUC1H6BkyzQsowpK0hvPK1xg==", - "dev": true, - "requires": { - "nullthrows": "^1.1.1" - } - }, - "@parcel/types": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.7.0.tgz", - "integrity": "sha512-+dhXVUnseTCpJvBTGMp0V6X13z6O/A/+CUtwEpMGZ8XSmZ4Gk44GvaTiBOp0bJpWG4fvCKp+UmC8PYbrDiiziw==", - "dev": true, - "requires": { - "@parcel/cache": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/source-map": "^2.0.0", - "@parcel/workers": "2.7.0", - "utility-types": "^3.10.0" + "node": ">=8" } }, - "@parcel/utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.7.0.tgz", - "integrity": "sha512-jNZ5bIGg1r1RDRKi562o4kuVwnz+XJ2Ie3b0Zwrqwvgfj6AbRFIKzDd+h85dWWmcDYzKUbHp11u6VJl1u8Vapg==", + "node_modules/typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true, - "requires": { - "@parcel/codeframe": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/hash": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/markdown-ansi": "2.7.0", - "@parcel/source-map": "^2.0.0", - "chalk": "^4.1.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" } }, - "@parcel/watcher": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.5.tgz", - "integrity": "sha512-x0hUbjv891omnkcHD7ZOhiyyUqUUR6MNjq89JhEI3BxppeKWAm6NPQsqqRrAkCJBogdT/o/My21sXtTI9rJIsw==", + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, - "requires": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "@parcel/workers": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.7.0.tgz", - "integrity": "sha512-99VfaOX+89+RaoTSyH9ZQtkMBFZBFMvJmVJ/GeJT6QCd2wtKBStTHlaSnQOkLD/iRjJCNwV2xpZmm8YkTwV+hg==", + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, - "requires": { - "@parcel/diagnostic": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/types": "2.7.0", - "@parcel/utils": "2.7.0", - "chrome-trace-event": "^1.0.2", - "nullthrows": "^1.1.1" + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } - }, - "@swc/helpers": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", - "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.8.tgz", + "integrity": "sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==", "dev": true, + "optional": true, "requires": { - "tslib": "^2.4.0" + "esbuild-wasm": "0.15.8" } }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "abortcontroller-polyfill": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz", - "integrity": "sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true + "@esbuild/linux-loong64": { + "version": "0.15.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.8.tgz", + "integrity": "sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==", + "dev": true, + "optional": true }, "ansi-styles": { "version": "4.3.0", @@ -4138,50 +886,41 @@ "color-convert": "^2.0.1" } }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "lodash": "^4.17.14" } }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001409", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001409.tgz", - "integrity": "sha512-V0mnJ5dwarmhYv8/MzhJ//aW68UpvnQBXv8lJ2QUsvn2pHcmAuNtu8hQEDz37XnA1iE+lRR9CIfGWWpgJ5QedQ==", - "dev": true + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } }, "chalk": { "version": "4.1.2", @@ -4193,18 +932,6 @@ "supports-color": "^7.1.0" } }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4220,145 +947,19 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-7.0.0.tgz", - "integrity": "sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.257", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.257.tgz", - "integrity": "sha512-C65sIwHqNnPC2ADMfse/jWTtmhZMII+x6ADI9gENzrOiI7BpxmfKFE84WkIEl5wEg+7+SfIkwChDlsd1Erju2A==", - "dev": true - }, - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "ms": "^2.1.1" } }, "esbuild": { @@ -4541,442 +1142,206 @@ "dev": true, "optional": true }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "htmlnano": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-2.0.2.tgz", - "integrity": "sha512-+ZrQFS4Ub+zd+/fWwfvoYCEGNEa0/zrpys6CyXxvZDwtL7Pl+pOtRkiujyvBQ7Lmfp7/iEPxtOFgxWA16Gkj3w==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.1", - "posthtml": "^0.16.5", - "timsort": "^0.3.0" - } - }, - "htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "function-bind": "^1.1.1" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-json": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", - "dev": true - }, - "js-tokens": { + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "lightningcss": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.16.0.tgz", - "integrity": "sha512-5+ZS9h+xeADcJTF2oRCT3yNZBlDYyOgQSdrWNBCqsIwm8ucKbF061OBVv/WHP4Zk8FToNhwFklk/hMuOngqsIg==", + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "requires": { - "detect-libc": "^1.0.3", - "lightningcss-darwin-arm64": "1.16.0", - "lightningcss-darwin-x64": "1.16.0", - "lightningcss-linux-arm-gnueabihf": "1.16.0", - "lightningcss-linux-arm64-gnu": "1.16.0", - "lightningcss-linux-arm64-musl": "1.16.0", - "lightningcss-linux-x64-gnu": "1.16.0", - "lightningcss-linux-x64-musl": "1.16.0", - "lightningcss-win32-x64-msvc": "1.16.0" + "whatwg-encoding": "^2.0.0" } }, - "lightningcss-darwin-arm64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.16.0.tgz", - "integrity": "sha512-gIhz6eZFwsC4oVMjBGQ3QWDdLQY7vcXFyM/x91PilgHqu63B9uBa10EZA75YoTEkbKhoz0uDCqyHh/EoF1GrkQ==", - "dev": true, - "optional": true - }, - "lightningcss-darwin-x64": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.16.0.tgz", - "integrity": "sha512-kLPi+OEpDj3UGY6DC8TfjbcULJDKMP+TVKSlrEkNGn8t1YRzi2g4oy7UVTSB5AnSbT0CusUItzdVjHQ49EdoNA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm-gnueabihf": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.16.0.tgz", - "integrity": "sha512-oSwEbvXUPr//H/ainBRJXTxHerlheee/KgkTTmAQWiVnt8HV+bRohTBWWPBy5ZArgiGLwj7ogv45istgljPN2Q==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.16.0.tgz", - "integrity": "sha512-Drq9BSVIvmV9zsDJbCZWCulMvKMQWFIlYXPCKV/iwRj+ZAJ1BRngma0cNHB6uW7Wac8Jg04CJN5IA4ELE3J+cQ==", - "dev": true, - "optional": true - }, - "lightningcss-linux-arm64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.16.0.tgz", - "integrity": "sha512-1QXWStnTEo4RFQf0mfGhRyNUeEHilCZ0NA97XgwKwrYr/M7sYKU/1HWY00dPxFJ6GITR2pfJGo9xi3ScSSBxbA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-gnu": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.16.0.tgz", - "integrity": "sha512-gD2eQYD5OFs1p83R0TcMCEc5HRyJES4lR4THmclv7khm3dc9vc+2VT0kFBPxO1L2AwlZuvXaaMan7X1Ul7uSfA==", - "dev": true, - "optional": true - }, - "lightningcss-linux-x64-musl": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.16.0.tgz", - "integrity": "sha512-HJsKeYxloEvg2WCQhtYPqzZUliLu9JBJNeI5y9cPQeDR/7ayGGLbVhJaotPtzJkElOFL/SaXsS+FRuH4w+yafg==", - "dev": true, - "optional": true - }, - "lightningcss-win32-x64-msvc": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.16.0.tgz", - "integrity": "sha512-h4ayyAlOMLUHV9NdofcIu79aEjmly93adVxcg5wDJpkvMiwDTufEN30M8G4gGcjo1JE5jFjAcyQcRpXYkYcemA==", - "dev": true, - "optional": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lmdb": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.5.2.tgz", - "integrity": "sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==", + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "@lmdb/lmdb-darwin-arm64": "2.5.2", - "@lmdb/lmdb-darwin-x64": "2.5.2", - "@lmdb/lmdb-linux-arm": "2.5.2", - "@lmdb/lmdb-linux-arm64": "2.5.2", - "@lmdb/lmdb-linux-x64": "2.5.2", - "@lmdb/lmdb-win32-x64": "2.5.2", - "msgpackr": "^1.5.4", - "node-addon-api": "^4.3.0", - "node-gyp-build-optional-packages": "5.0.3", - "ordered-binary": "^1.2.4", - "weak-lru-cache": "^1.2.2" - }, - "dependencies": { - "node-addon-api": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", - "dev": true - } + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "msgpackr": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.7.0.tgz", - "integrity": "sha512-/lumbjWnrRn8mZ8TEJXbFpkRDSei94CcqwcgbyuE0hT2/f6az2Fmi4ojNUOUTS9T8AYyADrmoPvCiLL9+ufvsA==", + "http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "requires": { - "msgpackr-extract": "^2.1.2" + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" } }, - "msgpackr-extract": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-2.1.2.tgz", - "integrity": "sha512-cmrmERQFb19NX2JABOGtrKdHMyI6RUyceaPBQ2iRz9GnDkjBWFjNJC0jyyoOfZl2U/LZE3tQCCQc4dlRyA8mcA==", + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "optional": true, "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "2.1.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "2.1.2", - "node-gyp-build-optional-packages": "5.0.3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true - }, - "node-gyp-build-optional-packages": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz", - "integrity": "sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, - "ordered-binary": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.3.0.tgz", - "integrity": "sha512-knIeYepTI6BDAzGxqFEDGtI/iGqs57H32CInAIxEvAHG46vk1Di0CEpyc1A7iY39B1mfik3g3KLYwOTNnnMHLA==", + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "parcel": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.7.0.tgz", - "integrity": "sha512-pRYwnivwtNP0tip8xYSo4zCB0XhLt7/gJzP1p8OovCqkmFjG9VG+GW9TcAKqMIo0ovEa9tT+/s6gY1Qy+BONGQ==", - "dev": true, - "requires": { - "@parcel/config-default": "2.7.0", - "@parcel/core": "2.7.0", - "@parcel/diagnostic": "2.7.0", - "@parcel/events": "2.7.0", - "@parcel/fs": "2.7.0", - "@parcel/logger": "2.7.0", - "@parcel/package-manager": "2.7.0", - "@parcel/reporter-cli": "2.7.0", - "@parcel/reporter-dev-server": "2.7.0", - "@parcel/utils": "2.7.0", - "chalk": "^4.1.0", - "commander": "^7.0.0", - "get-port": "^4.2.0", - "v8-compile-cache": "^2.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "minimist": "^1.2.6" } }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, - "posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", - "dev": true, - "requires": { - "posthtml-parser": "^0.11.0", - "posthtml-render": "^3.0.0" - }, - "dependencies": { - "posthtml-parser": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.1" - } - } - } - }, - "posthtml-parser": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.10.2.tgz", - "integrity": "sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==", + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "requires": { - "htmlparser2": "^7.1.1" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" } }, - "posthtml-render": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { - "is-json": "^2.0.1" + "side-channel": "^1.0.4" } }, - "react-error-overlay": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", - "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==", - "dev": true - }, - "react-refresh": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.9.0.tgz", - "integrity": "sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4986,110 +1351,35 @@ "has-flag": "^4.0.0" } }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", - "dev": true - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, "typescript": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true }, - "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "qs": "^6.4.0" } }, - "utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "weak-lru-cache": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", - "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true - }, - "xxhash-wasm": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz", - "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } } } } diff --git a/package.json b/package.json index 2be3520..680736c 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,11 @@ { "name": "@passwordless-id/webauthn", - "version": "0.0.4", - "description": "A small wrapper around the webauthn protocol to make one's life easier.", - - "main": "src/passwordless.ts", - + "version": "0.0.5", + "description": "A small wrapper around the webauthn protocol to make one's life easier.", + "main": "src/webauthn.ts", "scripts": { - "build": "esbuild src/passwordless.ts --platform=neutral --bundle --sourcemap --minify --target=es2022 --outfile=dist/passwordless.min.js" + "build": "esbuild src/webauthn.ts --platform=neutral --bundle --sourcemap --minify --target=es2022 --outfile=dist/webauthn.min.js", + "dev": "http-server" }, "repository": { "type": "git", @@ -14,8 +13,9 @@ }, "keywords": [ "authentication", - "passwordless", - "webauthn" + "webauthn", + "passkeys", + "passwordless" ], "author": "Arnaud Dagnelies", "license": "MIT", @@ -25,6 +25,7 @@ "homepage": "https://github.com/dagnelies/passwordless-js#readme", "devDependencies": { "esbuild": "^0.15.8", + "http-server": "^14.1.1", "typescript": "^4.8.3" } } diff --git a/src/authenticators.ts b/src/authenticators.ts index 92937ee..f760843 100644 --- a/src/authenticators.ts +++ b/src/authenticators.ts @@ -1,8 +1,7 @@ import * as authenticatorMetadata from './authenticatorMetadata.json' import * as utils from './utils' -console.debug(authenticatorMetadata) - +//console.debug(authenticatorMetadata) export function parseAuthData(authData :ArrayBuffer) { console.debug(authData) @@ -11,7 +10,7 @@ export function parseAuthData(authData :ArrayBuffer) { // https://w3c.github.io/webauthn/#sctn-authenticator-data let parsed :any = { - rpIdHash: utils.toBase64(authData.slice(0,32)), + rpIdHash: utils.toBase64url(authData.slice(0,32)), flags: { userPresent: !!(flags & 1), //reserved1: !!(flags & 2), @@ -31,8 +30,8 @@ export function parseAuthData(authData :ArrayBuffer) { parsed = { ...parsed, aaguid: extractAaguid(authData), - credentialId: utils.toBase64(authData.slice(55, 55+credentialLength)), - publicKey: utils.toBase64(authData.slice(55+credentialLength, authData.byteLength)) // probably breaks if extensions are invoked + credentialId: utils.toBase64url(authData.slice(55, 55+credentialLength)), + publicKey: utils.toBase64url(authData.slice(55+credentialLength, authData.byteLength)) // probably breaks if extensions are invoked } } diff --git a/src/utils.ts b/src/utils.ts index d27c8e8..0851a28 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -11,16 +11,18 @@ export function parseBuffer(buffer :ArrayBuffer) :string { } -export function toBase64(buffer :ArrayBuffer) :string { - return btoa(parseBuffer(buffer)) +export function isBase64url(txt :string) :boolean { + return txt.match(/^[a-zA-Z0-9\-_]+=*$/) !== null } -export function parseBase64(txt :string) :ArrayBuffer { - return toBuffer(atob(txt)) +export function toBase64url(buffer :ArrayBuffer) :string { + const txt = btoa(parseBuffer(buffer)) // base64 + return txt.replaceAll('+', '-').replaceAll('/', '_') } export function parseBase64url(txt :string) :ArrayBuffer { - return parseBase64(txt.replace(/-/g, '+').replace(/_/g, '/')) + txt = txt.replaceAll('-', '+').replaceAll('_', '/') // base64url -> base64 + return toBuffer(atob(txt)) } diff --git a/src/passwordless.ts b/src/webauthn.ts similarity index 75% rename from src/passwordless.ts rename to src/webauthn.ts index 8003f28..f3b802d 100644 --- a/src/passwordless.ts +++ b/src/webauthn.ts @@ -16,9 +16,9 @@ export async function isLocalAuthenticator() :Promise { } - +// Used mainly for the playground export function parseAuthenticatorData(authData :string) { - return authenticators.parseAuthData(utils.parseBase64(authData)) + return authenticators.parseAuthData(utils.parseBase64url(authData)) } type AuthType = 'auto' | 'local' | 'extern' | 'both' @@ -71,7 +71,7 @@ function getAlgoName(num :NumAlgo) :NamedAlgo { * 'local': use the local device (using TouchID, FaceID, Windows Hello or PIN) * 'extern': use an external device (security key or connected phone) * 'both': prompt the user to choose between local or external device. The UI and user interaction in this case is platform specific. - * @param {boolean} [attestation=false] If enabled, the device attestation and clientData will be provided as base64 encoded binary data. + * @param {boolean} [attestation=false] If enabled, the device attestation and clientData will be provided as Base64url encoded binary data. * Note that this is not available on some platforms. */ // @@ -79,6 +79,9 @@ export async function register(username :string, challenge :string, options :any if(!options) options = {} + if(!utils.isBase64url(challenge)) + throw new Error('Provided challenge is not properly encoded in Base64url') + const creationOptions :PublicKeyCredentialCreationOptions = { challenge: utils.parseBase64url(challenge), rp: { @@ -107,13 +110,13 @@ export async function register(username :string, challenge :string, options :any console.debug(credential) const response = credential.response as any //AuthenticatorAttestationResponse - + return { username: username, challenge: challenge, credential: { id: credential.id, - publicKey: utils.toBase64(response.getPublicKey()), + publicKey: utils.toBase64url(response.getPublicKey()), algorithm: getAlgoName(credential.response.getPublicKeyAlgorithm()) }, authenticator: { @@ -121,13 +124,33 @@ export async function register(username :string, challenge :string, options :any //transport: response.getTransports()[0], // In the RFC but not implemented by browsers aaguid: authenticators.extractAaguid(response.getAuthenticatorData()), name: authenticators.resolveAuthenticatorName(response.getAuthenticatorData()), - attestation: options.attestation ? utils.toBase64(response.attestationObject) : null, - clientData: options.attestation ? utils.toBase64(response.clientDataJSON) : null, + attestation: options.attestation ? utils.toBase64url(response.attestationObject) : null, + clientData: options.attestation ? utils.toBase64url(response.clientDataJSON) : null, } } } +async function getTransports(authType :AuthType) :Promise { + if(authType === "local") + return ['internal'] + if(authType === "extern") + return ['usb', 'ble', 'nfc'] + if(authType === "both") + return ['internal', 'usb', 'ble', 'nfc'] + + // the default case: "auto", depending on device capabilities + try { + if(await isLocalAuthenticator()) + return ['internal'] + else + return ['usb', 'ble', 'nfc'] + } catch(e) { + return ['internal', 'usb', 'ble', 'nfc'] + } +} + + /** * Signs a challenge using one of the provided credentials IDs in order to authenticate the user. * @@ -141,13 +164,18 @@ export async function login(credentialIds :string[], challenge :string, options if(!options) options = {} + if(!utils.isBase64url(challenge)) + throw new Error('Provided challenge is not properly encoded in Base64url') + + const transports = await getTransports(options.authenticatorType ?? "auto"); + let authOptions :PublicKeyCredentialRequestOptions = { challenge: utils.parseBase64url(challenge), rpId: window.location.hostname, allowCredentials: credentialIds.map(id => { return { id: utils.parseBase64url(id), type: 'public-key', - //transports: ['internal', 'usb', 'ble', 'nfc'], + transports: transports, }}), userVerification: options.userVerification ?? "required", timeout: options.timeout ?? 60000, @@ -158,15 +186,15 @@ export async function login(credentialIds :string[], challenge :string, options console.debug(auth) const response = auth.response as AuthenticatorAssertionResponse - + return { credentialId: auth.id, - //userHash: utils.toBase64(response.userHandle), // unreliable, optional for authenticators + //userHash: utils.toBase64url(response.userHandle), // unreliable, optional for authenticators clientJson: JSON.parse(utils.parseBuffer(response.clientDataJSON)), - clientData: utils.toBase64(response.clientDataJSON), - signature: utils.toBase64(response.signature), + clientData: utils.toBase64url(response.clientDataJSON), + signature: utils.toBase64url(response.signature), authenticatorJson: authenticators.parseAuthData(response.authenticatorData), - authenticatorData: utils.toBase64(response.authenticatorData) + authenticatorData: utils.toBase64url(response.authenticatorData) } } @@ -177,30 +205,29 @@ export async function login(credentialIds :string[], challenge :string, options type VerifyParams = { algorithm :'RS256' | 'ES256', - publicKey :string, // Base64 encoded - authenticatorData :string, // Base64 encoded - clientData :string, // Base64 encoded - signature :string, // Base64 encoded + publicKey :string, // Base64url encoded + authenticatorData :string, // Base64url encoded + clientData :string, // Base64url encoded + signature :string, // Base64url encoded } // https://w3c.github.io/webauthn/#sctn-verifying-assertion -export async function verify({algorithm, publicKey, authenticatorData, clientData, signature} :VerifyParams) :Promise { +export async function verify({algorithm :NamedAlgo, publicKey, authenticatorData, clientData, signature} :VerifyParams) :Promise { let cryptoKey = await window.crypto.subtle.importKey( - 'spki', utils.parseBase64(publicKey), {name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, false, ['verify']) + 'spki', utils.parseBase64url(publicKey), {name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, false, ['verify']) console.debug(cryptoKey) - let clientHash = await utils.sha256( utils.parseBase64(clientData) ); + let clientHash = await utils.sha256( utils.parseBase64url(clientData) ); console.debug(clientHash) - //let comboBuffer = concatenateBuffers(parseBase64(authenticatorData), parseBase64(clientData)) // clientHash) - let comboBuffer = utils.concatenateBuffers(utils.parseBase64(authenticatorData), clientHash) + let comboBuffer = utils.concatenateBuffers(utils.parseBase64url(authenticatorData), clientHash) console.debug(comboBuffer) - console.debug(utils.parseBase64(signature)) + console.debug(utils.parseBase64url(signature)) // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify - let validity = await window.crypto.subtle.verify({name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, cryptoKey, utils.parseBase64(signature), comboBuffer) + let validity = await window.crypto.subtle.verify({name:'RSASSA-PKCS1-v1_5', hash:'SHA-256'}, cryptoKey, utils.parseBase64url(signature), comboBuffer) return validity } \ No newline at end of file