From 6dd5c7495fbcca6cd88a818d16773c0d826edda9 Mon Sep 17 00:00:00 2001 From: Nicolas Luck Date: Fri, 22 Sep 2023 22:40:35 +0200 Subject: [PATCH 01/87] Set version to 0.6.1-prerelease --- bootstrap-languages/agent-language/package.json | 2 +- bootstrap-languages/direct-message-language/package.json | 2 +- bootstrap-languages/neighbourhood-language/package.json | 2 +- bootstrap-languages/p-diff-sync/package.json | 2 +- bootstrap-languages/perspective-language/package.json | 2 +- cli/Cargo.toml | 4 ++-- connect/package.json | 2 +- core/package.json | 2 +- docs/package.json | 2 +- executor/package.json | 2 +- executor/src/core/Config.ts | 2 +- package.json | 2 +- rust-client/Cargo.toml | 2 +- rust-executor/Cargo.toml | 2 +- rust-executor/package.json | 2 +- rust-executor/src/globals.rs | 2 +- test-runner/package.json | 2 +- tests/js/package.json | 2 +- ui/package.json | 2 +- ui/src-tauri/Cargo.toml | 2 +- ui/src-tauri/tauri.conf.json | 2 +- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/bootstrap-languages/agent-language/package.json b/bootstrap-languages/agent-language/package.json index 7ef210a85..ca7264e00 100644 --- a/bootstrap-languages/agent-language/package.json +++ b/bootstrap-languages/agent-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/agent-language", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "AD4M Language implementation for Holochain profile DNA", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/direct-message-language/package.json b/bootstrap-languages/direct-message-language/package.json index acb1935b4..6b4c7df4e 100644 --- a/bootstrap-languages/direct-message-language/package.json +++ b/bootstrap-languages/direct-message-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/direct-message-language", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "A templateable AD4M Language for personal, per-agent direct message Languages", "main": "index.js", "type": "module", diff --git a/bootstrap-languages/neighbourhood-language/package.json b/bootstrap-languages/neighbourhood-language/package.json index 9c73c8409..489af977e 100644 --- a/bootstrap-languages/neighbourhood-language/package.json +++ b/bootstrap-languages/neighbourhood-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/neighbourhood-language", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "This is a Language for storing AD4M neighbourhood objects", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/p-diff-sync/package.json b/bootstrap-languages/p-diff-sync/package.json index e10f1e6c7..b5c18527e 100644 --- a/bootstrap-languages/p-diff-sync/package.json +++ b/bootstrap-languages/p-diff-sync/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/perspective-diff-sync", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "An AD4M language for syncing mutations to a share perspective", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/perspective-language/package.json b/bootstrap-languages/perspective-language/package.json index 7cc94986d..a9ea2a1f3 100644 --- a/bootstrap-languages/perspective-language/package.json +++ b/bootstrap-languages/perspective-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/perspective-language", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "An AD4M Language for perspective snapshot expressions stored on IPFS", "main": "index.js", "scripts": { diff --git a/cli/Cargo.toml b/cli/Cargo.toml index d02910338..763d66dc7 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m" -version = "0.6.0" +version = "0.6.1-prerelease.0" edition = "2021" authors = ["Nicolas Luck "] description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" @@ -12,7 +12,7 @@ documentation = "https://docs.ad4m.dev" readme = "README.md" [dependencies] -ad4m-client = { path = "../rust-client", version = "0.6.0" } +ad4m-client = { path = "../rust-client", version = "0.6.1-prerelease.0" } rust-executor = { path = "../rust-executor" } anyhow = "1.0.65" clap = { version = "4.0.8", features = ["derive"] } diff --git a/connect/package.json b/connect/package.json index 5b11fb7cd..124e5f132 100644 --- a/connect/package.json +++ b/connect/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-connect", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Lib for handling everything needed to setup a connection to a local or remote ad4m-executor", "license": "CAL-1.0", "main": "dist/web.js", diff --git a/core/package.json b/core/package.json index 73341916a..a371fdc1c 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "*The Agent-Centric Distributed Application Meta-ontology* or just: *Agent-Centric DApp Meta-ontology* * A new meta-ontology for interoperable, decentralized application design * A spanning-layer to enable seamless integration between Holochain DNAs, blockchains, linked-data structures/ontologies and centralized back-ends * The basis for turning distinct, monolithic and siloed apps into a global, open and interoperable sense-making network", "main": "lib/index.cjs", "module": "lib/index.js", diff --git a/docs/package.json b/docs/package.json index 19403d4a9..5e5d8f626 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-docs", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Documentation for AD4M", "license": "CAL-1.0", "homepage": "./", diff --git a/executor/package.json b/executor/package.json index 575172e95..9baa00633 100644 --- a/executor/package.json +++ b/executor/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-executor", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Node.js package that allows the running/interfacing of AD4M Languages & Perspectives.", "main": "lib/main.js", "files": [ diff --git a/executor/src/core/Config.ts b/executor/src/core/Config.ts index 2eb78cc31..b944a207a 100644 --- a/executor/src/core/Config.ts +++ b/executor/src/core/Config.ts @@ -2,7 +2,7 @@ import * as path from 'path'; import * as fs from 'fs'; import { Address, Expression } from '@perspect3vism/ad4m'; -export let ad4mExecutorVersion = "0.6.0"; +export let ad4mExecutorVersion = "0.6.1-prerelease"; export let agentLanguageAlias = "did"; export let languageLanguageAlias = "lang"; export let neighbourhoodLanguageAlias = "neighbourhood"; diff --git a/package.json b/package.json index 14676892a..a81540686 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ad4m-monorepo", - "version": "0.6.0", + "version": "0.6.1-prerelease", "workspaces": [ "core", "docs", diff --git a/rust-client/Cargo.toml b/rust-client/Cargo.toml index 7e4ca8c31..88219f891 100644 --- a/rust-client/Cargo.toml +++ b/rust-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-client" -version = "0.6.0" +version = "0.6.1-prerelease" edition = "2021" authors = ["Nicolas Luck "] description = "Client library wrapping AD4M's GraphQL interface" diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index ad1211d90..799263a27 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust-executor" -version = "0.6.0" +version = "0.6.1-prerelease" edition = "2021" authors = ["Nicolas Luck "] description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" diff --git a/rust-executor/package.json b/rust-executor/package.json index 85f5b2898..3bd481479 100644 --- a/rust-executor/package.json +++ b/rust-executor/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/rust-ad4m-executor", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Rust built version of the ad4m-executor, exposing GraphQL methods for AD4M", "main": "", "files": [], diff --git a/rust-executor/src/globals.rs b/rust-executor/src/globals.rs index f2835cdb3..de8590c38 100644 --- a/rust-executor/src/globals.rs +++ b/rust-executor/src/globals.rs @@ -2,7 +2,7 @@ use lazy_static::lazy_static; lazy_static! { /// The current version of AD4M - pub static ref AD4M_VERSION: String = String::from("0.6.0"); + pub static ref AD4M_VERSION: String = String::from("0.6.1-prerelease"); } /// Struct representing oldest supported version and indicator if state should be cleared if update is required diff --git a/test-runner/package.json b/test-runner/package.json index b94e4afbf..3cf73b24c 100644 --- a/test-runner/package.json +++ b/test-runner/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-test", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Testing library to test ad4m languages", "license": "MIT", "bin": "./build/cli.js", diff --git a/tests/js/package.json b/tests/js/package.json index 314e6368f..d6cb5a226 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-integration-tests", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "Node.js package that allows the running/interfacing of AD4M Languages & Perspectives.", "type": "module", "scripts": { diff --git a/ui/package.json b/ui/package.json index 01a8a1b6a..cc3fcc404 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "ad4m-launcher", - "version": "0.6.0", + "version": "0.6.1-prerelease", "private": true, "type": "module", "dependencies": { diff --git a/ui/src-tauri/Cargo.toml b/ui/src-tauri/Cargo.toml index d63498bbf..8b118012e 100644 --- a/ui/src-tauri/Cargo.toml +++ b/ui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-launcher" -version = "0.6.0" +version = "0.6.1-prerelease.0" description = "Administration of ad4m services" authors = ["Kaichao Sun"] license = "" diff --git a/ui/src-tauri/tauri.conf.json b/ui/src-tauri/tauri.conf.json index 02a6d5e57..078865eb6 100644 --- a/ui/src-tauri/tauri.conf.json +++ b/ui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "ADAM Launcher", - "version": "0.6.0" + "version": "0.6.1-prerelease" }, "build": { "distDir": "../dist", From 98525e86e55fd07d16d608e649ca3d7f399ed1a7 Mon Sep 17 00:00:00 2001 From: Nicolas Luck Date: Fri, 22 Sep 2023 22:41:17 +0200 Subject: [PATCH 02/87] Use tauri-action in staging publish workflow for signing --- .github/workflows/publish_staging.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 19a6d6823..7ddc5ed20 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -97,7 +97,23 @@ jobs: env: TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - run: yarn run package-ad4m + run: yarn run build + + - name: Build the app + uses: tauri-apps/tauri-action@v0 + env: + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + with: + tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version + releaseName: 'ADAM Launcher v__VERSION__' + releaseBody: 'See the assets to download this version and install.' + releaseDraft: true + prerelease: false - name: Build AD4M-CLI & build Launcher binary (windows-latest) if: matrix.platform == 'windows-latest' From 78ebdccc4e036aa43df842b1339bb2bd5508909b Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 26 Sep 2023 20:02:25 +0200 Subject: [PATCH 03/87] add current code for socket signaling --- bootstrap-languages/p-diff-sync/esbuild.ts | 19 +++++++++- .../zomes/perspective_diff_sync/src/lib.rs | 6 ++++ .../src/link_adapter/commit.rs | 19 ++++++++++ .../p-diff-sync/linksAdapter.ts | 36 ++++++++++++++++--- rust-executor/src/mainnet_seed.json | 2 +- 5 files changed, 76 insertions(+), 6 deletions(-) diff --git a/bootstrap-languages/p-diff-sync/esbuild.ts b/bootstrap-languages/p-diff-sync/esbuild.ts index 6f3bce43c..e479a51dd 100644 --- a/bootstrap-languages/p-diff-sync/esbuild.ts +++ b/bootstrap-languages/p-diff-sync/esbuild.ts @@ -4,9 +4,26 @@ import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/mod.js"; // import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/wasm.js"; import { denoPlugins } from "https://deno.land/x/esbuild_deno_loader@0.7.0/mod.ts"; +import { loadSource, resolveUrl } from "./customHttpDownloader.js"; const result = await esbuild.build({ - plugins: [...denoPlugins()], + plugins: [ + { + name: `buffer-alias`, + setup(build) { + build.onResolve({ filter: new RegExp(`^buffer$`) }, (args) => { + return { path: `https://deno.land/std@0.177.0/node/buffer.ts`, namespace: 'imports' }; + }); + + build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) + + build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { + return loadSource(args) + }) + }, + }, + ...denoPlugins() + ], entryPoints: ['index.ts'], outfile: 'build/bundle.js', bundle: true, diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs index 7e03bab91..6de269c05 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs @@ -63,6 +63,12 @@ pub fn sync(_: ()) -> ExternResult> { .map_err(|error| utils::err(&format!("{}", error))) } +#[hdk_extern] +pub fn get_broadcast_payload(_: ()) -> ExternResult> { + link_adapter::commit::get_broadcast_payload::() + .map_err(|error| utils::err(&format!("{}", error))) +} + #[hdk_extern] pub fn pull(args: PullArguments) -> ExternResult { link_adapter::pull::pull::(true, args.hash, args.is_scribe) diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs index e9897391c..cd840c52f 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -150,3 +150,22 @@ pub fn broadcast_current() -> SocialContext }; Ok(current.map(|rev| rev.hash)) } + +pub fn get_broadcast_payload() -> SocialContextResult> { + match current_revision::()? { + Some(current) => { + let current_revision = current; + let entry_ref = + Retriever::get::(current_revision.hash.clone())?; + let diff = Retriever::get::(entry_ref.diff.clone())?; + + Ok(Some(HashBroadcast { + reference: entry_ref, + reference_hash: current_revision.hash.clone(), + diff, + broadcast_author: get_my_did()?.unwrap(), + })) + }, + None => Ok(None) + } +} diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index 62e09db15..a5482799c 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -2,7 +2,8 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; -import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; +import { DNA_NICK, ZOME_NAME, DNA } from "./build/dna.js"; +import { io } from "https://esm.sh/socket.io-client@4.7.2"; class PeerInfo { //@ts-ignore @@ -20,11 +21,28 @@ export class LinkAdapter implements LinkSyncAdapter { me: DID gossipLogCount: number = 0; myCurrentRevision: Buffer | null = null; + socket: any | null = null; constructor(context: LanguageContext) { //@ts-ignore this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; + this.socket = io("wss://socket.ad4m.dev"); + console.log("Created socket connection"); + console.dir(this.socket); + this.socket.on('error', (error: any) => { + console.error('Error:', error); + }); + this.socket.on('connect', () => { + console.log('Connected to the server'); + }); + this.socket.on('disconnect', () => { + console.log('Disconnected from the server'); + }); + this.socket.emit("join-room", DNA.toString()); + this.socket.on("signal", (signal: any) => { + this.handleHolochainSignal(signal); + }); } writable(): boolean { @@ -52,9 +70,14 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.sync(); Got lock"); try { //@ts-ignore - let current_revision = await this.hcDna.call(DNA_NICK, ZOME_NAME, "sync", null); - if (current_revision && Buffer.isBuffer(current_revision)) { - this.myCurrentRevision = current_revision; + let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); + if (broadcast_payload) { + //Use client to send to socketIO + console.log("Broadcast to socket"); + this.socket.emit("broadcast", {roomId: DNA.toString(), signal: broadcast_payload}); + } + if (broadcast_payload.reference_hash && Buffer.isBuffer(broadcast_payload.reference_hash)) { + this.myCurrentRevision = broadcast_payload.reference_hash; } } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); @@ -198,6 +221,11 @@ export class LinkAdapter implements LinkSyncAdapter { if (res && Buffer.isBuffer(res)) { this.myCurrentRevision = res; } + let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); + if (broadcast_payload) { + //Use client to send to socketIO + this.socket.emit("broadcast", {roomId: DNA.toString(), signal: broadcast_payload}); + } return res as string; } catch (e) { console.error("PerspectiveDiffSync.commit(); got error", e); diff --git a/rust-executor/src/mainnet_seed.json b/rust-executor/src/mainnet_seed.json index c42067979..85d5efd12 100644 --- a/rust-executor/src/mainnet_seed.json +++ b/rust-executor/src/mainnet_seed.json @@ -3,7 +3,7 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdmKg9nm4HXnwDZ7orhJCu3XoQYvAX2Muv4nY5aWtJVKyc" + "QmzSYwdd6SunHY8orC2xzd43qpP3YUHuwyeWLWmfsxaHF3KLH4C" ], "directMessageLanguage": "QmzSYwdp8xNu5UdWWsKQhzZs4JLYDBTk22T7ksoi3hhpscZAm3E", "agentLanguage": "QmzSYwdigpRrQTmtXcATD4zAFp1nqbXB1tVJT7ho1JaThaXCynL", From cd9a82e7931b5c6eb5d36be86e428e057246cb1e Mon Sep 17 00:00:00 2001 From: Nicolas Luck Date: Tue, 26 Sep 2023 20:41:06 +0200 Subject: [PATCH 04/87] Remove Tauri keys for signing when publishing main --- .github/workflows/publish.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 2c3c54f0b..51b14162b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -98,8 +98,6 @@ jobs: - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) if: matrix.platform != 'windows-latest' env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} From cfccdaa58985f2e1e42869928270ccd82b3ec0cf Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 26 Sep 2023 20:43:08 +0200 Subject: [PATCH 05/87] add new socket logic --- bootstrap-languages/p-diff-sync/linksAdapter.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index a5482799c..0d7875681 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -27,7 +27,7 @@ export class LinkAdapter implements LinkSyncAdapter { //@ts-ignore this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; - this.socket = io("wss://socket.ad4m.dev"); + this.socket = io("wss://socket.ad4m.dev", { transports: ['websocket'] }); console.log("Created socket connection"); console.dir(this.socket); this.socket.on('error', (error: any) => { @@ -39,6 +39,12 @@ export class LinkAdapter implements LinkSyncAdapter { this.socket.on('disconnect', () => { console.log('Disconnected from the server'); }); + this.socket.on('connect_error', (error) => { + console.error('Connection Error:', error); + }); + this.socket.on('reconnect_attempt', () => { + console.log('Trying to reconnect...'); + }); this.socket.emit("join-room", DNA.toString()); this.socket.on("signal", (signal: any) => { this.handleHolochainSignal(signal); From d7267b171fe545a344c6e97c4d1b549326cd8d65 Mon Sep 17 00:00:00 2001 From: Nicolas Luck Date: Tue, 26 Sep 2023 20:44:59 +0200 Subject: [PATCH 06/87] Fix indentation in staging publish workflow --- .github/workflows/publish_staging.yml | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 7ddc5ed20..b03ab1a72 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -100,20 +100,20 @@ jobs: run: yarn run build - name: Build the app - uses: tauri-apps/tauri-action@v0 - env: - ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - with: - tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version - releaseName: 'ADAM Launcher v__VERSION__' - releaseBody: 'See the assets to download this version and install.' - releaseDraft: true - prerelease: false + uses: tauri-apps/tauri-action@v0 + env: + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + with: + tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version + releaseName: 'ADAM Launcher v__VERSION__' + releaseBody: 'See the assets to download this version and install.' + releaseDraft: true + prerelease: false - name: Build AD4M-CLI & build Launcher binary (windows-latest) if: matrix.platform == 'windows-latest' From d279f671d0747f281773742fac8e5f2d0ad6d720 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 4 Oct 2023 14:46:03 +0530 Subject: [PATCH 07/87] Fix rlimit not working on windows --- ui/src-tauri/src/main.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/ui/src-tauri/src/main.rs b/ui/src-tauri/src/main.rs index 49ba1d262..8e26b96c0 100644 --- a/ui/src-tauri/src/main.rs +++ b/ui/src-tauri/src/main.rs @@ -14,6 +14,7 @@ use std::env; use std::fs; use std::fs::File; use std::sync::Mutex; +#[cfg(not(target_os = "windows"))] use libc::{rlimit, RLIMIT_NOFILE, setrlimit}; use std::io; use std::io::Write; @@ -76,24 +77,21 @@ pub struct AppState { req_credential: String, } -fn main() { - env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server"); - +#[cfg(not(target_os = "windows"))] +fn rlim_execute() { let mut rlim: rlimit = rlimit { rlim_cur: 0, rlim_max: 0 }; - // Get the current file limit unsafe { if libc::getrlimit(RLIMIT_NOFILE, &mut rlim) != 0 { panic!("{}", io::Error::last_os_error()); } } - let rlim_max = 1000 as u64; + println!("Current RLIMIT_NOFILE: current: {}, max: {}", rlim.rlim_cur, rlim_max); // Attempt to increase the limit rlim.rlim_cur = rlim_max; - unsafe { if setrlimit(RLIMIT_NOFILE, &rlim) != 0 { panic!("{}", io::Error::last_os_error()); @@ -106,9 +104,16 @@ fn main() { panic!("{}", io::Error::last_os_error()); } } - println!("Updated RLIMIT_NOFILE: current: {}, max: {}", rlim.rlim_cur, rlim_max); +} + +fn main() { + env::set_var("RUST_LOG", "holochain=warn,wasmer_compiler_cranelift=warn,rust_executor=info,warp::server"); + + #[cfg(not(target_os = "windows"))] + rlim_execute(); + if !data_path().exists() { let _ = fs::create_dir_all(data_path()); } From 6fbfb92bee33b17939a42df19509f658ed73009a Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 4 Oct 2023 14:46:33 +0530 Subject: [PATCH 08/87] removed the version for cli dep for ad4m-client --- cli/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 763d66dc7..6d92dccaa 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,7 +12,7 @@ documentation = "https://docs.ad4m.dev" readme = "README.md" [dependencies] -ad4m-client = { path = "../rust-client", version = "0.6.1-prerelease.0" } +ad4m-client = { path = "../rust-client"} rust-executor = { path = "../rust-executor" } anyhow = "1.0.65" clap = { version = "4.0.8", features = ["derive"] } From 2751ff8e0df469e08fb844f5c769300bba3fbd42 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 4 Oct 2023 16:14:46 +0530 Subject: [PATCH 09/87] Update deno to latest --- Cargo.lock | 681 +++++++++++++++++++++------------------ rust-executor/Cargo.toml | 4 +- 2 files changed, 369 insertions(+), 316 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f15a6dede..4d8cf300b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ dependencies = [ [[package]] name = "ad4m" -version = "0.6.0" +version = "0.6.1-prerelease.0" dependencies = [ "ad4m-client", "anyhow", @@ -38,7 +38,7 @@ dependencies = [ [[package]] name = "ad4m-client" -version = "0.6.0" +version = "0.6.1-prerelease" dependencies = [ "anyhow", "async-tungstenite", @@ -62,7 +62,7 @@ dependencies = [ [[package]] name = "ad4m-launcher" -version = "0.6.0" +version = "0.6.1" dependencies = [ "ad4m-client", "chrono", @@ -123,11 +123,25 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "aead-gcm-stream" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a09ecb526d53de2842cc876ee5c9b51161ee60399edeca4cf74892a01b48177" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle 2.4.1", +] + [[package]] name = "aes" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" dependencies = [ "cfg-if 1.0.0", "cipher", @@ -404,15 +418,15 @@ dependencies = [ [[package]] name = "ast_node" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c704e2f6ee1a98223f5a7629a6ef0f3decb3b552ed282889dc957edff98ce1e6" +checksum = "c09c69dffe06d222d072c878c3afe86eee2179806f20503faec97250268b4c24" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -436,20 +450,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "async-compression" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" -dependencies = [ - "brotli", - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] - [[package]] name = "async-compression" version = "0.4.2" @@ -718,7 +718,7 @@ dependencies = [ "cc", "cfg-if 1.0.0", "libc", - "miniz_oxide 0.7.1", + "miniz_oxide", "object 0.32.0", "rustc-demangle", ] @@ -1476,6 +1476,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + [[package]] name = "cocoa" version = "0.24.1" @@ -2046,7 +2055,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" dependencies = [ - "nix 0.26.4", + "nix 0.26.2", "windows-sys 0.48.0", ] @@ -2365,12 +2374,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "data-url" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d7439c3735f405729d52c3fbbe4de140eaf938a1fe47d227c27f8254d4302a5" - [[package]] name = "data-url" version = "0.3.0" @@ -2423,9 +2426,9 @@ dependencies = [ [[package]] name = "deno_ast" -version = "0.27.3" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b17e25531279d9795aeb076909c91c9b369fa63fd4d801486950577d0457d22" +checksum = "8a8adb6aeb787db71d015d8e9f63f6e004eeb09c86babb4ded00878be18619b1" dependencies = [ "anyhow", "base64 0.13.1", @@ -2459,9 +2462,9 @@ dependencies = [ [[package]] name = "deno_broadcast_channel" -version = "0.108.0" +version = "0.114.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3e8ca691a282c918cc5c223dcd5840286954a396e3108ade4c3c3b55017ebf" +checksum = "1fd3b2940ff536e31fd7ad5f73916a7bbb6467a5d109c4dcff8cf53e8a69cf92" dependencies = [ "async-trait", "deno_core", @@ -2471,9 +2474,9 @@ dependencies = [ [[package]] name = "deno_cache" -version = "0.46.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc385e88d95f925f3384319cde1e813022d4842a9a791c79b47699334e81d516" +checksum = "da197703a24d6e0eb9e8757505a9f8a68409007308ebd8f5170553f29b5e20fa" dependencies = [ "async-trait", "deno_core", @@ -2485,24 +2488,25 @@ dependencies = [ [[package]] name = "deno_console" -version = "0.114.0" +version = "0.120.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3df41ff26499c3f4f352f8fc1fe6bb50c39121675bf594b3af511c28db84c2" +checksum = "9717cd47758a9ed7551e50eba37dae3e6237e4fdc63133578d5cb66758e1b342" dependencies = [ "deno_core", ] [[package]] name = "deno_core" -version = "0.199.0" +version = "0.218.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70fbd0cb620ac36fac08d708c5f01362280c5aa8149657a225db4932bd73758e" +checksum = "525a5a8af1def85c6c3f0ead2300c18fce14868f94b66ee7f4fec466a4c7c938" dependencies = [ "anyhow", "bytes", "deno_ops", + "deno_unsync 0.3.0", "futures", - "indexmap 1.9.3", + "indexmap 2.0.0", "libc", "log", "once_cell", @@ -2512,7 +2516,7 @@ dependencies = [ "serde_json", "serde_v8", "smallvec 1.11.0", - "sourcemap", + "sourcemap 7.0.0", "tokio", "url 2.4.1", "v8", @@ -2520,9 +2524,9 @@ dependencies = [ [[package]] name = "deno_crypto" -version = "0.128.0" +version = "0.134.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5000445c43538cb54a021e761071137ebab615c751e17178e564c56647414f5c" +checksum = "32dc0679f71cb9f60fe618bf8182e81f491548e298da9b3f4fffdcdd043d5174" dependencies = [ "aes", "aes-gcm", @@ -2556,12 +2560,12 @@ dependencies = [ [[package]] name = "deno_fetch" -version = "0.138.0" +version = "0.144.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af49c674cf373a8946e67dae1d2badc0c1176f9ecb84cda168c5c9421ef15b3a" +checksum = "0781ec6f70fab23144078c79e4359860cd85bde2759d14fd477e7586176a9ec5" dependencies = [ "bytes", - "data-url 0.2.0", + "data-url", "deno_core", "deno_tls", "dyn-clone", @@ -2574,9 +2578,9 @@ dependencies = [ [[package]] name = "deno_ffi" -version = "0.101.0" +version = "0.107.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb34b1d3bb618b0bbbc5ebc148301263824a5673290483ff0a52386913a43e2" +checksum = "e0d352630b2f979b1a1f4a346ae75b2a3f92304f01deb9d8ac8dd0ad60b55c09" dependencies = [ "deno_core", "dlopen", @@ -2592,9 +2596,9 @@ dependencies = [ [[package]] name = "deno_fs" -version = "0.24.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ddb0692853905a87a96666c77d58e4adf1cf3671d1a7ec7edafe301cfce9441" +checksum = "51fa26124bf30b134633eff27446a33edf6f9739576b95e006eaa7e6cd03e15d" dependencies = [ "async-trait", "deno_core", @@ -2603,7 +2607,7 @@ dependencies = [ "fs3", "libc", "log", - "nix 0.24.2", + "nix 0.26.2", "rand 0.8.5", "serde", "tokio", @@ -2612,11 +2616,11 @@ dependencies = [ [[package]] name = "deno_http" -version = "0.109.0" +version = "0.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d083d63029b9cd366bcee007db8348e7c515c19e5432f0d2f138f03e5908ca1" +checksum = "e286bf5e627adfcd895cd89c417b82a7b628dfbd5eab04d5135e61ad1bb3663a" dependencies = [ - "async-compression 0.3.15", + "async-compression", "async-trait", "base64 0.13.1", "brotli", @@ -2638,6 +2642,7 @@ dependencies = [ "phf 0.10.1", "pin-project", "ring", + "scopeguard", "serde", "slab", "smallvec 1.11.0", @@ -2648,9 +2653,9 @@ dependencies = [ [[package]] name = "deno_io" -version = "0.24.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b0886f3be06a065c9738b4162c30634ea2645eaad7efcf13ec197c63d67d15" +checksum = "d9a3d355a1487498025662a959c705573964c0f1c55b4d1a8fc6546caea657d9" dependencies = [ "async-trait", "deno_core", @@ -2663,40 +2668,60 @@ dependencies = [ [[package]] name = "deno_kv" -version = "0.22.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677532e9ee16ef744205bae030f5047f66f5ff5ad6359b6a0e393197a78cd2b3" +checksum = "076db5bb2c528fea42de6255ff64854c0e2b23b9472401b079fe6efc7539278e" dependencies = [ "anyhow", "async-trait", "base64 0.13.1", + "chrono", "deno_core", + "deno_unsync 0.1.1", "hex", + "log", "num-bigint", + "prost", + "prost-build", "rand 0.8.5", + "reqwest", "rusqlite", "serde", "serde_json", + "termcolor", "tokio", + "url 2.4.1", "uuid 1.4.1", ] +[[package]] +name = "deno_lockfile" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7673d66847223bd4115075a96b0699da71b1755524aeb3956f0a3edf3af3217" +dependencies = [ + "ring", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "deno_media_type" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a798670c20308e5770cc0775de821424ff9e85665b602928509c8c70430b3ee0" dependencies = [ - "data-url 0.3.0", + "data-url", "serde", "url 2.4.1", ] [[package]] name = "deno_napi" -version = "0.44.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef1534b43dcf5cb8d28ee72035e4d5a426952fa305b75f0100dac3c89c99a4e" +checksum = "2988e23b58718f1a100ceb48086803429c72b292b416a00a71ac49e35e7be555" dependencies = [ "deno_core", "libloading 0.7.4", @@ -2704,9 +2729,9 @@ dependencies = [ [[package]] name = "deno_net" -version = "0.106.0" +version = "0.112.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fa1823075955b96bbc1a58db8584f4b4b6da3411c4be4d77063852ccf067a" +checksum = "eab9b1f26d9595fc7ebc2d45ac96369262c7977ab4b5548ba8481527404763ec" dependencies = [ "deno_core", "deno_tls", @@ -2714,7 +2739,7 @@ dependencies = [ "log", "pin-project", "serde", - "socket2 0.4.9", + "socket2 0.5.3", "tokio", "trust-dns-proto", "trust-dns-resolver", @@ -2722,18 +2747,21 @@ dependencies = [ [[package]] name = "deno_node" -version = "0.51.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede647cd70b9cf8f3d678cf3e07844a74ac1d3f20beba7bc4cd63ffd1349a56e" +checksum = "9dc14133aff9f9cfc6f49ac94c0fe1d42621f18c7b6195f60de33325c2ce0f7e" dependencies = [ + "aead-gcm-stream", "aes", "brotli", + "bytes", "cbc", "data-encoding", "deno_core", "deno_fetch", "deno_fs", "deno_media_type", + "deno_net", "deno_npm", "deno_semver", "digest 0.10.7", @@ -2741,10 +2769,12 @@ dependencies = [ "ecb", "elliptic-curve 0.13.5", "errno 0.2.8", + "h2", "hex", "hkdf 0.12.3", + "http", "idna 0.3.0", - "indexmap 1.9.3", + "indexmap 2.0.0", "lazy-regex", "libc", "libz-sys", @@ -2774,6 +2804,7 @@ dependencies = [ "signature 1.6.4", "tokio", "typenum", + "url 2.4.1", "whoami", "winapi 0.3.9", "x25519-dalek 2.0.0", @@ -2782,12 +2813,13 @@ dependencies = [ [[package]] name = "deno_npm" -version = "0.10.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5d1097de53e8ce3316d3e44095e253719ae367cf7478263f83082f44dddabf" +checksum = "210f62105862f1ff371e278c623c7ed73d62b0efece4d417c15663d37b730098" dependencies = [ "anyhow", "async-trait", + "deno_lockfile", "deno_semver", "futures", "log", @@ -2798,32 +2830,30 @@ dependencies = [ [[package]] name = "deno_ops" -version = "0.77.0" +version = "0.94.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b345c096fd8433337ed8e1727f4732397c134e188e1739c88b0c077869020f3" +checksum = "e77ea556bab98499a1a482fe02345c35251f8050e00aebd85a4e5eab34bc15a8" dependencies = [ "deno-proc-macro-rules", "lazy-regex", "once_cell", - "pmutil 0.6.1", + "pmutil", "proc-macro-crate", "proc-macro2 1.0.66", "quote 1.0.33", "regex", "strum 0.25.0", "strum_macros 0.25.2", - "syn 1.0.109", "syn 2.0.29", "thiserror", ] [[package]] name = "deno_runtime" -version = "0.122.0" +version = "0.128.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15dd7fe2a7c53ffbbd55966eb7bf2298291b77a47e043f768f0aa1732f61e95" +checksum = "ef3e9bf6d964c27f60a81cabcb327017e74329f5d26857f2c2c980b2a7a05d47" dependencies = [ - "atty", "console_static_text", "deno_ast", "deno_broadcast_channel", @@ -2857,7 +2887,7 @@ dependencies = [ "libc", "log", "netif", - "nix 0.24.2", + "nix 0.26.2", "notify", "ntapi 0.4.1", "once_cell", @@ -2869,15 +2899,16 @@ dependencies = [ "tokio", "tokio-metrics", "uuid 1.4.1", + "which", "winapi 0.3.9", "winres", ] [[package]] name = "deno_semver" -version = "0.3.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96f99990457915af1f444900003ffd5a9d3ab2e5337b06d681e56ca371b3e11f" +checksum = "d2d3f7f5a3b2ace62b8fdede8585f5fdbd4e7dba9cb33fcaf0db54887316feaa" dependencies = [ "monch", "once_cell", @@ -2888,25 +2919,43 @@ dependencies = [ [[package]] name = "deno_tls" -version = "0.101.0" +version = "0.107.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02167d4913ff4b1f93f0f3182b6ebee67f41129a94ea9ef8ce15dff51649aff4" +checksum = "9c1439c26abd5a282ebdf16d974c0c6349d48f680f24563f07db7f6c1b5a03de" dependencies = [ "deno_core", "once_cell", "rustls 0.21.7", "rustls-native-certs", "rustls-pemfile 1.0.3", + "rustls-webpki 0.101.4", "serde", - "webpki 0.22.0", - "webpki-roots 0.22.6", + "webpki-roots 0.25.2", +] + +[[package]] +name = "deno_unsync" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac0984205f25e71ddd1be603d76e70255953c12ff864707359ab195d26dfc7b3" +dependencies = [ + "tokio", +] + +[[package]] +name = "deno_unsync" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a8f3722afd50e566ecfc783cc8a3a046bc4dd5eb45007431dfb2776aeb8993" +dependencies = [ + "tokio", ] [[package]] name = "deno_url" -version = "0.114.0" +version = "0.120.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe9282c24607371fd2e6db7fca22da861032317c1396c08506a5a04ec81927a" +checksum = "47dcced032b60c40920e2c4586565838a52f53e423610196d0e42404d1cd4c10" dependencies = [ "deno_core", "serde", @@ -2915,15 +2964,17 @@ dependencies = [ [[package]] name = "deno_web" -version = "0.145.0" +version = "0.151.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b757302c2f04de142ee2962078f5f255caef80c792a9989fa860b867143a71e7" +checksum = "250af5b87fb58b4582fcbb851cce0da4e677f526438c2d96bf0b36caedfbd0ef" dependencies = [ "async-trait", "base64-simd", + "bytes", "deno_core", "encoding_rs", "flate2", + "futures", "serde", "tokio", "uuid 1.4.1", @@ -2932,18 +2983,18 @@ dependencies = [ [[package]] name = "deno_webidl" -version = "0.114.0" +version = "0.120.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a12d8e0f1ef5af84075819a2568af54f8e073886a2c2941ac6e34c2092508d7" +checksum = "51ead87def72804607526d4068f67ba74954d8f851732fa2290cb4279430f3c9" dependencies = [ "deno_core", ] [[package]] name = "deno_websocket" -version = "0.119.0" +version = "0.125.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3249bed57e808fdb99f7d39d8711210b2a0380638f0520447cb4794200c81d56" +checksum = "4390e67affc872484f2894645c5003524cea6cfd0ada312aa9bf08d365775c1d" dependencies = [ "bytes", "deno_core", @@ -2960,9 +3011,9 @@ dependencies = [ [[package]] name = "deno_webstorage" -version = "0.109.0" +version = "0.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03f122fd89054593e11e34fedbc063d00b407ea2b26c910171de4416618140b1" +checksum = "e8487d8bb2aa022bd39003efb083eb13ca44856be55eee180db0c4b674ec2328" dependencies = [ "deno_core", "deno_web", @@ -3320,9 +3371,9 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dprint-swc-ext" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4dda8a1b920e8be367aeaad035753d21bb69b3c50515afb41ab1eefbb886b5" +checksum = "6a0a2492465344a58a37ae119de59e81fe5a2885f2711c7b5048ef0dfa14ce42" dependencies = [ "bumpalo", "num-bigint", @@ -3405,9 +3456,9 @@ dependencies = [ [[package]] name = "ecb" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17fd84ba81a904351ee27bbccb4aa2461e1cca04176a63ab4f8ca087757681a2" +checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" dependencies = [ "cipher", ] @@ -3531,9 +3582,9 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] @@ -3729,17 +3780,17 @@ checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fastwebsockets" -version = "0.3.1" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1925eb5ee48fffa504a9edce24b3b4d43e2809d1cc713a1df2b13a46e661b3c6" +checksum = "9e6185b6dc9dddc4db0dedd2e213047e93bcbf7a0fb092abc4c4e4f3195efdb4" dependencies = [ "base64 0.21.3", - "cc", "hyper 0.14.27", "pin-project", "rand 0.8.5", "sha1", "simdutf8", + "thiserror", "tokio", "utf-8", ] @@ -3813,6 +3864,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "fixt" version = "0.2.2" @@ -3832,12 +3889,13 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" dependencies = [ "crc32fast", - "miniz_oxide 0.5.4", + "libz-ng-sys", + "miniz_oxide", ] [[package]] @@ -3907,14 +3965,14 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "from_variant" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d449976075322384507443937df2f1d5577afbf4282f12a5a66ef29fa3e6307" +checksum = "03ec5dc38ee19078d84a692b1c41181ff9f94331c76cee66ff0208c770b5e54f" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -6109,15 +6167,15 @@ checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" [[package]] name = "is-macro" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7d079e129b77477a49c5c4f1cfe9ce6c2c909ef52520693e8e811a714c7b20" +checksum = "f4467ed1321b310c2625c5aa6c1b1ffc5de4d9e42668cf697a08fb033ee8265e" dependencies = [ "Inflector", - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -6714,9 +6772,9 @@ dependencies = [ [[package]] name = "lazy-regex" -version = "2.5.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff63c423c68ea6814b7da9e88ce585f793c87ddd9e78f646970891769c8235d4" +checksum = "e723bd417b2df60a0f6a2b6825f297ea04b245d4ba52b5a22cb679bdf58b05fa" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -6725,14 +6783,14 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "2.4.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edfc11b8f56ce85e207e62ea21557cfa09bb24a8f6b04ae181b086ff8611c22" +checksum = "0f0a1d9139f0ee2e862e08a9c5d0ba0470f2aa21cd1e1aa1b1562f83116c725f" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.33", "regex", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -6757,16 +6815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f404a90a744e32e8be729034fc33b90cf2a56418fbf594d69aa3c0214ad414e5" dependencies = [ "cfg-if 1.0.0", - "lexical-core 0.7.6", -] - -[[package]] -name = "lexical" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" -dependencies = [ - "lexical-core 0.8.5", + "lexical-core", ] [[package]] @@ -6782,70 +6831,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "lexical-core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" -dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-parse-integer" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-util" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "lexical-write-float" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" -dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", -] - -[[package]] -name = "lexical-write-integer" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" -dependencies = [ - "lexical-util", - "static_assertions", -] - [[package]] name = "libappindicator" version = "0.7.1" @@ -7067,6 +7052,16 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "libz-ng-sys" +version = "1.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dd9f43e75536a46ee0f92b758f6b63846e594e86638c61a9251338a65baea63" +dependencies = [ + "cmake", + "libc", +] + [[package]] name = "libz-sys" version = "1.1.12" @@ -7140,9 +7135,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ "serde", "value-bag", @@ -7436,6 +7431,15 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg 1.1.0", +] + [[package]] name = "memoffset" version = "0.9.0" @@ -7473,15 +7477,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" -[[package]] -name = "miniz_oxide" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -7829,18 +7824,6 @@ dependencies = [ "memoffset 0.6.5", ] -[[package]] -name = "nix" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - [[package]] name = "nix" version = "0.25.1" @@ -7855,13 +7838,16 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.4" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ "bitflags 1.3.2", "cfg-if 1.0.0", "libc", + "memoffset 0.7.1", + "pin-utils", + "static_assertions", ] [[package]] @@ -8731,6 +8717,16 @@ dependencies = [ "ucd-trie", ] +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.0.0", +] + [[package]] name = "phf" version = "0.8.0" @@ -8973,17 +8969,6 @@ dependencies = [ "time 0.3.23", ] -[[package]] -name = "pmutil" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3894e5d549cccbe44afecf72922f277f603cd4bb0219c8342631ef18fffbe004" -dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.33", - "syn 1.0.109", -] - [[package]] name = "pmutil" version = "0.6.1" @@ -9005,7 +8990,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -9133,6 +9118,16 @@ dependencies = [ "yansi", ] +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2 1.0.66", + "syn 1.0.109", +] + [[package]] name = "primeorder" version = "0.13.2" @@ -9215,6 +9210,60 @@ dependencies = [ "thiserror", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools 0.10.5", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2 1.0.66", + "quote 1.0.33", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -9824,7 +9873,7 @@ version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "async-compression 0.4.2", + "async-compression", "base64 0.21.3", "bytes", "encoding_rs", @@ -10153,7 +10202,7 @@ dependencies = [ [[package]] name = "rust-executor" -version = "0.6.0" +version = "0.6.1-prerelease" dependencies = [ "argon2", "base64 0.21.3", @@ -10386,7 +10435,7 @@ dependencies = [ "libc", "log", "memchr", - "nix 0.26.4", + "nix 0.26.2", "radix_trie", "scopeguard", "unicode-segmentation", @@ -10483,7 +10532,7 @@ dependencies = [ "hyper-util", "indexmap 1.9.3", "lazy_static", - "lexical 5.2.2", + "lexical", "libc", "libffi 3.2.0 (git+https://github.com/coasys/libffi-rs.git?branch=window-space-no-link)", "libloading 0.7.4", @@ -10788,9 +10837,9 @@ dependencies = [ [[package]] name = "serde_v8" -version = "0.110.0" +version = "0.127.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bafaee0eecbef6c47ad3e7e0a764e22eb35a229ff7d06b7801fcbeaa5364b8" +checksum = "cb569e75e34db7e307901dbed94a3cb5dfb2b601a90f9cb1f2ede5f779f274ca" dependencies = [ "bytes", "derive_more", @@ -11251,6 +11300,22 @@ dependencies = [ "url 2.4.1", ] +[[package]] +name = "sourcemap" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbecc42a2b6131acc3bf9a25c9fe4161dba438eb52131bba83c5d781b5b70be3" +dependencies = [ + "data-encoding", + "debugid", + "if_chain", + "rustc_version 0.2.3", + "serde", + "serde_json", + "unicode-id", + "url 2.4.1", +] + [[package]] name = "spin" version = "0.5.2" @@ -11406,15 +11471,15 @@ dependencies = [ [[package]] name = "string_enum" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0090512bdfee4b56d82480d66c0fd8a6f53f0fe0f97e075e949b252acdd482e0" +checksum = "8fa4d4f81d7c05b9161f8de839975d3326328b8ba2831164b465524cc2f55252" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -11564,9 +11629,9 @@ dependencies = [ [[package]] name = "swc_atoms" -version = "0.5.6" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d0307dc4bfd107d49c7528350c372758cfca94fb503629b9a056e6a1572860" +checksum = "9f54563d7dcba626d4acfe14ed12def7ecc28e004debe3ecd2c3ee07cc47e449" dependencies = [ "once_cell", "rustc-hash", @@ -11578,11 +11643,10 @@ dependencies = [ [[package]] name = "swc_common" -version = "0.31.12" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19c774005489d2907fb67909cf42af926e72edee1366512777c605ba2ef19c94" +checksum = "39cb7fcd56655c8ae7dcf2344f0be6cbff4d9c7cb401fe3ec8e56e1de8dfe582" dependencies = [ - "ahash 0.7.6", "ast_node", "better_scoped_tls", "cfg-if 1.0.0", @@ -11594,7 +11658,7 @@ dependencies = [ "rustc-hash", "serde", "siphasher 0.3.11", - "sourcemap", + "sourcemap 6.4.1", "string_cache", "swc_atoms", "swc_eq_ignore_macros", @@ -11606,9 +11670,9 @@ dependencies = [ [[package]] name = "swc_config" -version = "0.1.5" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c8fc2c12bb1634c7c32fc3c9b6b963ad8f034cc62c4ecddcf215dc4f6f959d" +checksum = "9ba1c7a40d38f9dd4e9a046975d3faf95af42937b34b2b963be4d8f01239584b" dependencies = [ "indexmap 1.9.3", "serde", @@ -11618,22 +11682,22 @@ dependencies = [ [[package]] name = "swc_config_macro" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dadb9998d4f5fc36ef558ed5a092579441579ee8c6fcce84a5228cca9df4004" +checksum = "e5b5aaca9a0082be4515f0fbbecc191bf5829cd25b5b9c0a2810f6a2bb0d6829" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "swc_ecma_ast" -version = "0.104.5" +version = "0.109.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5cf9dd351d0c285dcd36535267953a18995d4dda0cbe34ac9d1df61aa415b26" +checksum = "7bc2286cedd688a68f214faa1c19bb5cceab7c9c54d0cbe3273e4c1704e38f69" dependencies = [ "bitflags 2.4.0", "is-macro", @@ -11648,16 +11712,16 @@ dependencies = [ [[package]] name = "swc_ecma_codegen" -version = "0.139.17" +version = "0.144.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d1ea16bb9b7ea6f87f17325742ff256fcbd65b188af57c2bf415fe4afc945" +checksum = "8e62ba2c0ed1f119fc1a76542d007f1b2c12854d54dea15f5491363227debe11" dependencies = [ "memchr", "num-bigint", "once_cell", "rustc-hash", "serde", - "sourcemap", + "sourcemap 6.4.1", "swc_atoms", "swc_common", "swc_ecma_ast", @@ -11667,24 +11731,23 @@ dependencies = [ [[package]] name = "swc_ecma_codegen_macros" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ee0caee1018808d94ecd09490cb7affd3d504b19aa11c49238f5fc4b54901" +checksum = "dcdff076dccca6cc6a0e0b2a2c8acfb066014382bc6df98ec99e755484814384" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "swc_ecma_loader" -version = "0.43.14" +version = "0.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe45f1e5dcc1b005544ff78253b787dea5dfd5e2f712b133964cdc3545c954a4" +checksum = "e7d7c322462657ae27ac090a2c89f7e456c94416284a2f5ecf66c43a6a3c19d1" dependencies = [ - "ahash 0.7.6", "anyhow", "pathdiff", "serde", @@ -11694,13 +11757,13 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.134.12" +version = "0.139.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a3fcfe3d83dd445cbd9321882e47b467594433d9a21c4d6c37a27f534bb89e" +checksum = "3eab46cb863bc5cd61535464e07e5b74d5f792fa26a27b9f6fd4c8daca9903b7" dependencies = [ "either", - "lexical 6.1.1", "num-bigint", + "num-traits", "serde", "smallvec 1.11.0", "smartstring", @@ -11714,9 +11777,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "0.127.18" +version = "0.132.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9c33ec5369178f3a0580ab86cfe89ffb9c3fbd122aed379cfb71d469d9d61c1" +checksum = "01ffd4a8149052bfc1ec1832fcbe04f317846ce635a49ec438df33b06db27d26" dependencies = [ "better_scoped_tls", "bitflags 2.4.0", @@ -11737,9 +11800,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_classes" -version = "0.116.18" +version = "0.121.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3b0d5f362f0da97be1f1b06d7b0d8667ea70b4adeabff0dcaecb6259c09525" +checksum = "f4b7fee0e2c6f12456d2aefb2418f2f26529b995945d493e1dce35a5a22584fc" dependencies = [ "swc_atoms", "swc_common", @@ -11751,22 +11814,22 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_macros" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "984d5ac69b681fc5438f9abf82b0fda34fe04e119bc75f8213b7e01128c7c9a2" +checksum = "8188eab297da773836ef5cf2af03ee5cca7a563e1be4b146f8141452c28cc690" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "swc_ecma_transforms_proposal" -version = "0.161.22" +version = "0.166.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cdce42d44ef775bc29f5ada3678a80ff72fa17a0ef705e14f63cfd0e0155e0e" +checksum = "122fd9a69f464694edefbf9c59106b3c15e5cc8cb8575a97836e4fb79018e98f" dependencies = [ "either", "rustc-hash", @@ -11784,11 +11847,10 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_react" -version = "0.173.20" +version = "0.178.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fb9481ad4e2acba34c6fbb6d4ccc64efe9f1821675e883dcfa732d7220f4b1e" +checksum = "675b5c755b0448268830e85e59429095d3423c0ce4a850b209c6f0eeab069f63" dependencies = [ - "ahash 0.7.6", "base64 0.13.1", "dashmap 5.5.2", "indexmap 1.9.3", @@ -11809,9 +11871,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_typescript" -version = "0.177.23" +version = "0.182.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe2eea4f5b8a25c93cdaa29fb1ce4108893da88a11e61e04b7f5295b5468829" +checksum = "4eba97b1ea71739fcf278aedad4677a3cacb52288a3f3566191b70d16a889de6" dependencies = [ "serde", "swc_atoms", @@ -11825,9 +11887,9 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.117.13" +version = "0.122.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad791bbfdafcebd878584021e050964c8ab68aba7eeac9d0ee4afba4c284a629" +checksum = "11006a3398ffd4693c4d3b0a1b1a5030edbdc04228159f5301120a6178144708" dependencies = [ "indexmap 1.9.3", "num_cpus", @@ -11843,9 +11905,9 @@ dependencies = [ [[package]] name = "swc_ecma_visit" -version = "0.90.5" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce3ac941ae1d6c7e683aa375fc71fbf58df58b441f614d757fbb10554936ca2" +checksum = "0f628ec196e76e67892441e14eef2e423a738543d32bffdabfeec20c29582117" dependencies = [ "num-bigint", "swc_atoms", @@ -11857,33 +11919,33 @@ dependencies = [ [[package]] name = "swc_eq_ignore_macros" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c20468634668c2bbab581947bb8c75c97158d5a6959f4ba33df20983b20b4f6" +checksum = "05a95d367e228d52484c53336991fdcf47b6b553ef835d9159db4ba40efb0ee8" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "swc_macros_common" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e582c3e3c2269238524923781df5be49e011dbe29cf7683a2215d600a562ea6" +checksum = "7a273205ccb09b51fabe88c49f3b34c5a4631c4c00a16ae20e03111d6a42e832" dependencies = [ - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] name = "swc_visit" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f412dd4fbc58f509a04e64f5c8038333142fc139e8232f01b883db0094b3b51" +checksum = "e87c337fbb2d191bf371173dea6a957f01899adb8f189c6c31b122a6cfc98fc3" dependencies = [ "either", "swc_visit_macros", @@ -11891,16 +11953,16 @@ dependencies = [ [[package]] name = "swc_visit_macros" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cfc226380ba54a5feed2c12f3ccd33f1ae8e959160290e5d2d9b4e918b6472a" +checksum = "0f322730fb82f3930a450ac24de8c98523af7d34ab8cb2f46bcb405839891a99" dependencies = [ "Inflector", - "pmutil 0.5.3", + "pmutil", "proc-macro2 1.0.66", "quote 1.0.33", "swc_macros_common", - "syn 1.0.109", + "syn 2.0.29", ] [[package]] @@ -12669,9 +12731,9 @@ dependencies = [ [[package]] name = "tokio-metrics" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60ac6224d622f71d0b80546558eedf8ff6c2d3817517a9d3ed87ce24fccf6a6" +checksum = "d4b2fc67d5dec41db679b9b052eb572269616926040b7831e32c8a152df77b84" dependencies = [ "futures-util", "pin-project-lite", @@ -13575,9 +13637,9 @@ dependencies = [ [[package]] name = "v8" -version = "0.74.3" +version = "0.78.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eedac634b8dd39b889c5b62349cbc55913780226239166435c5cf66771792ea" +checksum = "f6c96f70e8fc6c009af99d4e8ac4f5e84655a0fc3ec6e58147933b9c99f8b43c" dependencies = [ "bitflags 1.3.2", "fslock", @@ -14189,15 +14251,6 @@ dependencies = [ "untrusted", ] -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki 0.22.0", -] - [[package]] name = "webpki-roots" version = "0.23.1" diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index 799263a27..2ff274e01 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -22,8 +22,8 @@ path = "src/main.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -deno_core = "0.199.0" -deno_runtime = "0.122.0" +deno_core = "0.218.0" +deno_runtime = "0.128.0" tokio = { version = "1.25.0", features = ["full"] } url = "2.3.1" futures = "0.3.28" From 7a115b07c276a587ea45d913aaaf503c65092597 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 15:48:03 +0530 Subject: [PATCH 10/87] patch-package added to dev dependency --- package.json | 5 ++- yarn.lock | 123 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 123 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a81540686..97b58bb0f 100644 --- a/package.json +++ b/package.json @@ -43,14 +43,15 @@ "build-all-windows": "turbo run build-all-windows", "patchpackage": "patch-package", "set-version": "node setVersion.js", - "patch-package": "^6.5.0" + "postinstall": "patch-package" }, "devDependencies": { "@changesets/cli": "^2.25.2", "eslint-config-custom": "*", "prettier": "latest", "turbo": "latest", - "readline-sync": "1.4.10" + "readline-sync": "1.4.10", + "patch-package": "^6.5.0" }, "engines": { "node": ">=16.0.0" diff --git a/yarn.lock b/yarn.lock index 3893f69e2..cfb15a44b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2964,6 +2964,79 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" +"@perspect3vism/ad4m-executor@*": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m-executor/-/ad4m-executor-0.6.0.tgz#e1ae599e7ebea06b3a4be53d782504cc93e99021" + integrity sha512-oIVXaXOHEiUyu7yZSXejI4OyZpdPdd7XfGAnSd96pReiRr/NU6gAMSwv9Lw6yz9VCW9TroBUk4VLrlLouhgjdA== + dependencies: + "@holochain/client" perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b + "@msgpack/msgpack" "3.0.0-beta2" + "@noble/secp256k1" "^1.7.0" + "@perspect3vism/ad4m" "*" + "@transmute/did-key.js" "^0.2.1-unstable.29" + "@types/json-stable-stringify" "^1.0.33" + "@types/mocha" "^10.0.0" + aloedb-node "^1.1.1" + async-mutex "^0.3.2" + get-port "5.1.1" + js-yaml "^4.1.0" + json-stable-stringify "^1.0.1" + linkedom "^0.14.26" + lodash "^4.17.21" + sha256 "^0.2.0" + tmp "^0.2.1" + uuid "*" + +"@perspect3vism/ad4m-test@*": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m-test/-/ad4m-test-0.6.0.tgz#a295bc414684b00b63c0f16815b0c63a0ec7804f" + integrity sha512-HQS9+P5pPjE7X41wqzjUiXy4VManc6br87jL4YLrXPokp2q9RqgIDUiY/OKVnk3sgSjhGTgAhrl2zK/JbLF98Q== + dependencies: + "@apollo/client" "3.7.10" + "@perspect3vism/ad4m" "*" + "@types/fs-extra" "^9.0.13" + "@types/node" "^18.0.0" + "@types/node-fetch" "^2.6.1" + "@types/unzipper" "^0.10.5" + "@types/ws" "8.5.4" + "@types/yargs" "^17.0.8" + appdata-path perspect3vism/appdata-path + chalk "4.1.2" + esm "^3.2.25" + esmify "^2.1.1" + express "4.18.2" + find-process "^1.4.7" + fs-extra "^10.0.1" + get-port "5.1.1" + glob "^7.2.0" + graphql "15.7.2" + graphql-ws "5.12.0" + node-fetch "2" + node-wget-js "^1.0.1" + subscriptions-transport-ws "^0.11.0" + tree-kill "^1.2.2" + ts-node "^10.5.0" + typescript "^4.6.2" + unzipper "^0.10.11" + uuid "^8.3.2" + wget-improved "^3.3.0" + ws "8.13.0" + yargs "^17.3.1" + +"@perspect3vism/ad4m@*": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m/-/ad4m-0.6.0.tgz#594c50189133f6a7becaa7908c146f5e42707fa3" + integrity sha512-E069bVC7WTR7eN6dB5WXN7rc+9TWbd4KkLvJVdHyJty02RxfOyFIbDAGy4C5tgmbg5wTKJI+tka8xZ9QTiXEaQ== + dependencies: + "@apollo/client" "3.7.10" + "@holochain/client" "0.16.0" + "@types/jest" "^26.0.14" + class-validator "^0.13.1" + express "4.18.2" + graphql "15.7.2" + reflect-metadata "^0.1.13" + type-graphql "1.1.1" + "@perspect3vism/rollup-plugin-dna@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@perspect3vism/rollup-plugin-dna/-/rollup-plugin-dna-0.0.2.tgz#d8a1a99677877b3f090f228c3b5937d4f0aa758b" @@ -4928,6 +5001,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + JSONStream@^1.0.3: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -10283,6 +10361,13 @@ find-yarn-workspace-root2@1.2.16: micromatch "^4.0.2" pkg-dir "^4.2.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -10922,7 +11007,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -13794,6 +13879,13 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -16274,7 +16366,7 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^7.0.0, open@^7.3.0: +open@^7.0.0, open@^7.3.0, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -16684,6 +16776,26 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +patch-package@^6.5.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -18843,7 +18955,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg== -rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -19506,6 +19618,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" From 37ca46eebd5611b32297603831ace965728c2eef Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 15:48:17 +0530 Subject: [PATCH 11/87] Remove an unused dep for rust-executor --- cli/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/package.json b/cli/package.json index 84152bddd..4bc1dc9be 100644 --- a/cli/package.json +++ b/cli/package.json @@ -29,8 +29,7 @@ "url": "https://github.com/perspect3vism/ad4m/issues" }, "devDependencies": { - "@perspect3vism/ad4m-executor": "*", - "@perspect3vism/rust-ad4m-executor": "*" + "@perspect3vism/ad4m-executor": "*" }, "dependencies": { } From 39fac59edfa81336413c1538008ef1a8ba268202 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 15:49:20 +0530 Subject: [PATCH 12/87] Patches added --- executor/patches/tweetnacl+1.0.3.patch | 23 +++++++++ .../@mattrglobal+bbs-signatures+0.5.0.patch | 20 ++++++++ patches/@peculiar+webcrypto+1.4.3.patch | 16 +++++++ patches/@stablelib+random+1.0.2.patch | 19 ++++++++ ...e+did-key-bls12381+0.2.1-unstable.42.patch | 13 +++++ ...ute+did-key-cipher+0.2.1-unstable.42.patch | 21 ++++++++ ...ute+did-key-common+0.2.1-unstable.42.patch | 13 +++++ ...te+did-key-ed25519+0.2.1-unstable.42.patch | 34 +++++++++++++ ...+did-key-secp256k1+0.2.1-unstable.42.patch | 34 +++++++++++++ ...did-key-web-crypto+0.2.1-unstable.42.patch | 13 +++++ ...ute+did-key-x25519+0.2.1-unstable.42.patch | 34 +++++++++++++ ...ansmute+did-key.js+0.2.1-unstable.42.patch | 13 +++++ ...nsmute+ld-key-pair+0.6.1-unstable.37.patch | 13 +++++ ...eb-crypto-key-pair+0.6.1-unstable.37.patch | 13 +++++ patches/bn.js+4.12.0.patch | 18 +++++++ patches/borc+2.1.2.patch | 48 +++++++++++++++++++ patches/brorand+1.1.0.patch | 18 +++++++ patches/get-port+5.1.1.patch | 11 +++++ patches/graphql+15.7.2.patch | 26 ++++++++++ patches/inherits+2.0.4.patch | 11 +++++ patches/iso-url+0.4.7.patch | 12 +++++ patches/node-gyp-build+4.6.0.patch | 14 ++++++ patches/safe-buffer+5.2.1.patch | 12 +++++ patches/safer-buffer+2.1.2.patch | 13 +++++ patches/sha256+0.2.0.patch | 10 ++++ 25 files changed, 472 insertions(+) create mode 100644 executor/patches/tweetnacl+1.0.3.patch create mode 100644 patches/@mattrglobal+bbs-signatures+0.5.0.patch create mode 100644 patches/@peculiar+webcrypto+1.4.3.patch create mode 100644 patches/@stablelib+random+1.0.2.patch create mode 100644 patches/@transmute+did-key-bls12381+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-cipher+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-common+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-ed25519+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-secp256k1+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-web-crypto+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key-x25519+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+did-key.js+0.2.1-unstable.42.patch create mode 100644 patches/@transmute+ld-key-pair+0.6.1-unstable.37.patch create mode 100644 patches/@transmute+web-crypto-key-pair+0.6.1-unstable.37.patch create mode 100644 patches/bn.js+4.12.0.patch create mode 100644 patches/borc+2.1.2.patch create mode 100644 patches/brorand+1.1.0.patch create mode 100644 patches/get-port+5.1.1.patch create mode 100644 patches/graphql+15.7.2.patch create mode 100644 patches/inherits+2.0.4.patch create mode 100644 patches/iso-url+0.4.7.patch create mode 100644 patches/node-gyp-build+4.6.0.patch create mode 100644 patches/safe-buffer+5.2.1.patch create mode 100644 patches/safer-buffer+2.1.2.patch create mode 100644 patches/sha256+0.2.0.patch diff --git a/executor/patches/tweetnacl+1.0.3.patch b/executor/patches/tweetnacl+1.0.3.patch new file mode 100644 index 000000000..fbcd94973 --- /dev/null +++ b/executor/patches/tweetnacl+1.0.3.patch @@ -0,0 +1,23 @@ +diff --git a/node_modules/tweetnacl/nacl-fast.js b/node_modules/tweetnacl/nacl-fast.js +index 7ea5fb5..81673dd 100644 +--- a/node_modules/tweetnacl/nacl-fast.js ++++ b/node_modules/tweetnacl/nacl-fast.js +@@ -1,3 +1,5 @@ ++import nodeCrypto from 'node:crypto'; ++ + (function(nacl) { + 'use strict'; + +@@ -2377,10 +2379,9 @@ nacl.setPRNG = function(fn) { + }); + } else if (typeof require !== 'undefined') { + // Node.js. +- crypto = require('crypto'); +- if (crypto && crypto.randomBytes) { ++ if (nodeCrypto && nodeCrypto.randomBytes) { + nacl.setPRNG(function(x, n) { +- var i, v = crypto.randomBytes(n); ++ var i, v = nodeCrypto.randomBytes(n); + for (i = 0; i < n; i++) x[i] = v[i]; + cleanup(v); + }); diff --git a/patches/@mattrglobal+bbs-signatures+0.5.0.patch b/patches/@mattrglobal+bbs-signatures+0.5.0.patch new file mode 100644 index 000000000..6450fd53f --- /dev/null +++ b/patches/@mattrglobal+bbs-signatures+0.5.0.patch @@ -0,0 +1,20 @@ +diff --git a/node_modules/@mattrglobal/bbs-signatures/lib/wasm_asm.js b/node_modules/@mattrglobal/bbs-signatures/lib/wasm_asm.js +index 1f61267..d9071be 100644 +--- a/node_modules/@mattrglobal/bbs-signatures/lib/wasm_asm.js ++++ b/node_modules/@mattrglobal/bbs-signatures/lib/wasm_asm.js +@@ -52,6 +52,7 @@ + // import { __wbindgen_memory } from '__wbindgen_placeholder__'; + // import { __wbindgen_closure_wrapper424 } from '__wbindgen_placeholder__'; + ++import { Buffer } from 'node:buffer' + + var scratchBuffer = new ArrayBuffer(16); + var i32ScratchView = new Int32Array(scratchBuffer); +diff --git a/node_modules/@mattrglobal/bbs-signatures/lib/wasm_wasm.js b/node_modules/@mattrglobal/bbs-signatures/lib/wasm_wasm.js +index f71603d..9944683 100644 +--- a/node_modules/@mattrglobal/bbs-signatures/lib/wasm_wasm.js ++++ b/node_modules/@mattrglobal/bbs-signatures/lib/wasm_wasm.js +@@ -1,2 +1,2 @@ +- ++import { Buffer } from 'node:buffer' + module.exports = Buffer.from('AGFzbQEAAAAB5wEhYAJ/fwBgA39/fwF/YAJ/fwF/YAN/f38AYAF/AGABfwF/YAR/f39/AGAAAX9gAX8BfmAFf39/f38AYAJ/fwF+YAAAYAN/f38BfmAGf39/f39/AGAEf39/fwF/YAJ/fgBgBX9/f39/AX9gBn9/f39/fwF/YAJ/fgF/YAd/f39/f39/AGAJf39/f39/fn5+AGADf39+AGAFf399f38AYAV/f3x/fwBgA39+fgBgBH99f38AYAR/fH9/AGAIf39/f39/f38Bf2ADf35/AX9gA398fwF/YAR/fH9/AX9gA35/fwF/YAF8AX8Cphc1GF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diaW5kZ2VuX29iamVjdF9kcm9wX3JlZgAEGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19uZXcAAhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9jYl9kcm9wAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld182OGFkYjBkNTg3NTlhNGVkAAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fbnVtYmVyX25ldwAgGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19zZXRfMmU3OWU3NDQ0NTRhZmFkZQADGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diaW5kZ2VuX29iamVjdF9jbG9uZV9yZWYABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18UX193YmluZGdlbl9pc19vYmplY3QABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18SX193YmluZGdlbl9pc19udWxsAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fF19fd2JpbmRnZW5faXNfdW5kZWZpbmVkAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJV9fd2JnX3JhbmRvbUZpbGxTeW5jX2QyYmE1MzE2MGFlYzZhYmEAAxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18mX193YmdfZ2V0UmFuZG9tVmFsdWVzX2U1N2M5Yjc1ZGRlYWQwNjUAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193Ymdfc2VsZl84NmI0YjEzMzkyYzdhZjU2AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX3JlcXVpcmVfZjU1MjFhNWI4NWFkMjU0MgABGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx1fX3diZ19jcnlwdG9fYjhjOTJlYWFjMjNkMGQ4MAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx9fX3diZ19tc0NyeXB0b185YWQ2Njc3MzIxYTA4ZGQ4AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJl9fd2JnX2dldFJhbmRvbVZhbHVlc19kZDI3ZTZiMDY1MmIzMjM2AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fLV9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9NT0RVTEVfNDUyYjQ2ODBlODYxNGM4MQAHGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxZfX3diaW5kZ2VuX2lzX2Z1bmN0aW9uAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX25leHRfZWRkYTdlMDAwM2U1ZGFmOQAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19kb25lXzAzN2QwYTE3M2FlZjE4MzQABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18cX193YmdfdmFsdWVfZTYwYmJmYjdkNTJhZjYyZgAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx9fX3diZ19pdGVyYXRvcl8wOTE5MWY4ODc4ZWE5ODc3AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld19lMTMxMTBmODFhZTM0N2NmAAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHl9fd2JnX2lzQXJyYXlfODcxOWQxMzg3YzRlMWFjYQAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19wdXNoX2I0NmVlZWM1MmQyYjAzYmIAAhhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18tX193YmdfaW5zdGFuY2VvZl9BcnJheUJ1ZmZlcl84NmYwMWMwODlhYzI2OTJmAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX3ZhbHVlc19hOGU4ZjdiNjlkNWViMTE3AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX25ld18xMTkyZDY1NDE0MDQwYWQ5AAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fG19fd2JnX2NhbGxfOGU5NTYxM2NjNjUyNDk3NwACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxtfX3diZ19jYWxsX2Q3MTNlYTAyNzRkZmM2ZDIAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfbmV4dF8yOTY2ZmE5MDk2MDFhMDc1AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fJF9fd2JnX2lzU2FmZUludGVnZXJfY2Q4MDkyOGViZTNlNjU5MQAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxpfX3diZ19uZXdfZDBjNjM2NTJhYjRkODI1YwACGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXx5fX3diZ19yZXNvbHZlXzI1Mjk1MTJjM2JiNzM5MzgABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18bX193YmdfdGhlbl80YTdhNjE0YWJiYmU2ZDgxAAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JnX2J1ZmZlcl80OTEzMWMyODNhMDY2ODZmAAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fMV9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2MwZjM4NDAxZGFhZDVhMjIAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193YmdfbmV3XzliMjk1ZDI0Y2YxZDcwNmYABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18aX193Ymdfc2V0XzNiYjk2MGE5OTc1ZjNjZDIAAxhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18dX193YmdfbGVuZ3RoXzJiMTM2NDFhOWQ5MDY2NTMABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18sX193YmdfaW5zdGFuY2VvZl9VaW50OEFycmF5X2I3MThjNWNhZjliYjM1NGQABRhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18kX193YmdfbmV3d2l0aGxlbmd0aF8zYzU3MGFlZWE5YTk1OTU0AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fH19fd2JnX3N1YmFycmF5XzRlYWViM2RlMDBjZjE5NTUAARhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18hX193YmdfYnl0ZUxlbmd0aF85ODI4Y2Q3MmY3MDRiMTM5AAUYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fGl9fd2JnX2dldF8wZTNmMjk1MGNkZjc1OGFlAAIYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fFV9fd2JpbmRnZW5fbnVtYmVyX2dldAAAGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxVfX3diaW5kZ2VuX3N0cmluZ19nZXQAABhfX3diaW5kZ2VuX3BsYWNlaG9sZGVyX18WX193YmluZGdlbl9ib29sZWFuX2dldAAFGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxdfX3diaW5kZ2VuX2RlYnVnX3N0cmluZwAAGF9fd2JpbmRnZW5fcGxhY2Vob2xkZXJfXxBfX3diaW5kZ2VuX3Rocm93AAAYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fEV9fd2JpbmRnZW5fbWVtb3J5AAcYX193YmluZGdlbl9wbGFjZWhvbGRlcl9fHV9fd2JpbmRnZW5fY2xvc3VyZV93cmFwcGVyNDI0AAED3QjbCAAPCQAAAAAAAAADAAQEBAQECQAFBAACCQkAAAADAAkFAAAAAAMAAAkAAAkNABsEBgAAAwADAAACHgAJAAAAAwAdAAIJBQQDAwkJAwMAAwEAAAABAgAAAAMJAAAAAAkOAAAAAwADAAAFBgUDAAAABQUAAAARAwAAAAACBAADAAAEAAEDCwABAAAABQMDBgMAAgEABQQDAAIAAAMDAwUDAwYAAA0ABAACChMABAACAgICAgICAgICAgICAwIDBxQCAwYADAACBgYFDQoCAgAAAwIAAAAFABAKBAADAAACBAYABgMKAAUAAgUCAQ8fAAAEAwYGBwMCAgQABgACAwAKAAwADAQAAAAACQAKAwMGBgADAwAGAgIFAAMJAwYAAQACAwUABQIDAwMAAwAEAwIDAAEAAAoKAgMDAwMDAwMDAwMDAwMDAAQGBgMHBgAAAwMACgoEAAQABAQPBQADAAAAAAAACQkDAAAAAAABAAIBAAAE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aiILNgKEASABIBZBw/uxqAVqIgw2AoABIAQgBSADIAIQ/gIgASgCUCEeIAEoAlQhBiABKAJYIQcgASgCXCEIIAEgEDYCbCABIA82AmggASAONgJkIAEgDTYCYCABIAg2AnwgASAHNgJ4IAEgBjYCdCABIB42AnAgASALNgKMASABIAw2AogBIAEgCTYChAEgASAKNgKAASAEIAUgAyACEP4CIAEoAlAhCSABKAJUIQogASgCWCELIAEoAlwhDCABKAI8IQ0gASgCOCEOIAEoAjQhDyABKAIwIRAgASAINgJsIAEgBzYCaCABIAY2AmQgASAeNgJgIAEgDDYCfCABIAs2AnggASAKNgJ0IAEgCTYCcCABIBBB9Lr5lQdqIiA2AowBIAEgD0H+4/qGeGoiEjYCiAEgASAOQaeN8N55aiIhNgKEASABIA1B9OLvjHxqIh82AoABIAQgBSADIAIQ/gIgASgCUCEeIAEoAlQhBiABKAJYIQcgASgCXCEIIAEgDDYCbCABIAs2AmggASAKNgJkIAEgCTYCYCABIAg2AnwgASAHNgJ4IAEgBjYCdCABIB42AnAgASAhNgKMASABIB82AogBIAEgIDYChAEgASASNgKAASAEIAUgAyACEP4CIAEoAlAhCSABKAJUIQogASgCWCELIAEoAlwhDCABIBE2AnwgASAVNgJ4IAEgFDYCdCABIBM2AnAgASAcNgKMASABIBs2AogBIAEgGjYChAEgASAZNgKAASAFIAMgAhD6BCABIAEoAmwgGGo2AlwgASABKAJoIBdqNgJYIAEgASgCZCAWajYCVCABIAEoAmAgEGo2AlAgASAQNgKMASABIA82AogBIAEgDjYChAEgASANNgKAASABQUBrIiAgBCACEPkEIAEgCDYCbCABIAc2AmggASAGNgJkIAEgHjYCYCABIAw2AnwgASALNgJ4IAEgCjYCdCABIAk2AnAgASABKAJMIh5BwdPtpH5qIgY2AowBIAEgASgCSEGGj/n9fmoiBzYCiAEgASABKAJEQca7hv4AaiIINgKEASABIAEoAkBBzMOyoAJqIhI2AoABIAQgBSADIAIQ/gIgASgCUCETIAEoAlQhFCABKAJYIRUgASgCXCERIAEgDDYCbCABIAs2AmggASAKNgJkIAEgCTYCYCABIBE2AnwgASAVNgJ4IAEgFDYCdCABIBM2AnAgASAINgKMASABIBI2AogBIAEgBjYChAEgASAHNgKAASAEIAUgAyACEP4CIAEoAlAhBiABKAJUIQcgASgCWCEIIAEoAlwhCSABIBw2AnwgASAbNgJ4IAEgGjYCdCABIBk2AnAgASAdNgKMASABIBg2AogBIAEgFzYChAEgASAWNgKAASAFIAMgAhD6BCABIAEoAmwgD2o2AlwgASABKAJoIA5qNgJYIAEgASgCZCANajYCVCABIAEoAmAgHmo2AlAgAUGIAWoiHiABKQNINwMAIAEgASkDQDcDgAEgAyAEIAIQ+QQgASgCcCEZIAEoAnQhGiABKAJ4IRsgASgCfCEcIAEgETYCbCABIBU2AmggASAUNgJkIAEgEzYCYCABIAk2AnwgASAINgJ4IAEgBzYCdCABIAY2AnAgASAcQe/YpO8CaiIKNgKMASABIBtBqonS0wRqIgs2AogBIAEgGkHc08LlBWoiDDYChAEgASAZQdqR5rcHaiISNgKAASAEIAUgAyACEP4CIAEoAlAhEyABKAJUIRQgASgCWCEVIAEoAlwhESABIAk2AmwgASAINgJoIAEgBzYCZCABIAY2AmAgASARNgJ8IAEgFTYCeCABIBQ2AnQgASATNgJwIAEgDDYCjAEgASASNgKIASABIAo2AoQBIAEgCzYCgAEgBCAFIAMgAhD+AiABKAJQIQYgASgCVCEHIAEoAlghCCABKAJcIQkgASAdNgJ8IAEgGDYCeCABIBc2AnQgASAWNgJwIAEgEDYCjAEgASAPNgKIASABIA42AoQBIAEgDTYCgAEgBSADIAIQ+gQgASABKAJsIAEoAkhqNgJcIAEgASgCaCABKAJEajYCWCABIAEoAmQgASgCQGo2AlQgASABKAJgIBxqNgJQIAEgHDYCjAEgASAbNgKIASABIBo2AoQBIAEgGTYCgAEgAyAEIAIQ+QQgASgCcCEWIAEoAnQhFyABKAJ4IRggASgCfCEdIAEgETYCbCABIBU2AmggASAUNgJkIAEgEzYCYCABIAk2AnwgASAINgJ4IAEgBzYCdCABIAY2AnAgASAdQdKi+cF5aiIKNgKMASABIBhB7YzHwXpqIgs2AogBIAEgF0HIz4yAe2oiDDYChAEgASAWQcf/5fp7aiISNgKAASAEIAUgAyACEP4CIAEoAlAhEyABKAJUIRQgASgCWCEVIAEoAlwhESABIAk2AmwgASAINgJoIAEgBzYCZCABIAY2AmAgASARNgJ8IAEgFTYCeCABIBQ2AnQgASATNgJwIAEgDDYCjAEgASASNgKIASABIAo2AoQBIAEgCzYCgAEgBCAFIAMgAhD+AiABKAJQIQYgASgCVCEHIAEoAlghCCABKAJcIQkgASAQNgJ8IAEgDzYCeCABIA42AnQgASANNgJwIB4gASkDSDcDACABIAEpA0A3A4ABIAUgAyACEPoEIAEgASgCbCAbajYCXCABIAEoAmggGmo2AlggASABKAJkIBlqNgJUIAEgASgCYCAdajYCUCABIB02AowBIAEgGDYCiAEgASAXNgKEASABIBY2AoABIAMgBCACEPkEIAEoAnAhDSABKAJ0IQ4gASgCeCEPIAEoAnwhECABIBE2AmwgASAVNgJoIAEgFDYCZCABIBM2AmAgASAJNgJ8IAEgCDYCeCABIAc2AnQgASAGNgJwIAEgEEHzl4C3fGoiEzYCjAEgASAPQceinq19aiIUNgKIASABIA5B0capNmoiFTYChAEgASANQefSpKEBaiIRNgKAASAEIAUgAyACEP4CIAEoAlAhCiABKAJUIQsgASgCWCEMIAEoAlwhEiABIAk2AmwgASAINgJoIAEgBzYCZCABIAY2AmAgASASNgJ8IAEgDDYCeCABIAs2AnQgASAKNgJwIAEgFTYCjAEgASARNgKIASABIBM2AoQBIAEgFDYCgAEgBCAFIAMgAhD+AiABKAJQIQYgASgCVCEHIAEoAlghCCABKAJcIQkgAUH4AGoiISABKQNINwMAIAEgASkDQDcDcCABIBw2AowBIAEgGzYCiAEgASAaNgKEASABIBk2AoABIAUgAyACEPoEIAEgASgCbCAYajYCXCABIAEoAmggF2o2AlggASABKAJkIBZqNgJUIAEgASgCYCAQajYCUCABIBA2AowBIAEgDzYCiAEgASAONgKEASABIA02AoABIAMgBCACEPkEIAEoAnAhEyABKAJ0IRQgASgCeCEVIAEoAnwhESABIBI2AmwgASAMNgJoIAEgCzYCZCABIAo2AmAgASAJNgJ8IAEgCDYCeCABIAc2AnQgASAGNgJwIAEgEUGFldy9AmoiHzYCjAEgASAVQbjC7PACaiIiNgKIASABIBRB/Nux6QRqIiM2AoQBIAEgE0GTmuCZBWoiJDYCgAEgBCAFIAMgAhD+AiABKAJQIQogASgCVCELIAEoAlghDCABKAJcIRIgASAJNgJsIAEgCDYCaCABIAc2AmQgASAGNgJgIAEgEjYCfCABIAw2AnggASALNgJ0IAEgCjYCcCABICM2AowBIAEgJDYCiAEgASAfNgKEASABICI2AoABIAQgBSADIAIQ/gIgASgCUCEGIAEoAlQhByABKAJYIQggASgCXCEJIAEgHDYCfCABIBs2AnggASAaNgJ0IAEgGTYCcCABIB02AowBIAEgGDYCiAEgASAXNgKEASABIBY2AoABIAUgAyACEPoEIAEgASgCbCAPajYCXCABIAEoAmggDmo2AlggASABKAJkIA1qNgJUIAEgASgCYCARajYCUCABIBE2AowBIAEgFTYCiAEgASAUNgKEASABIBM2AoABICAgBCACEPkEIAEgEjYCbCABIAw2AmggASALNgJkIAEgCjYCYCABIAk2AnwgASAINgJ4IAEgBzYCdCABIAY2AnAgASABKAJMIhlB1OapqAZqIho2AowBIAEgASgCSCIfQbuVqLMHaiIbNgKIASABIAEoAkQiIkGukouOeGoiHDYChAEgASABKAJAIiNBhdnIk3lqIiQ2AoABIAQgBSADIAIQ/gIgASgCUCEKIAEoAlQhCyABKAJYIQwgASgCXCESIAEgCTYCbCABIAg2AmggASAHNgJkIAEgBjYCYCABIBI2AnwgASAMNgJ4IAEgCzYCdCABIAo2AnAgASAcNgKMASABICQ2AogBIAEgGjYChAEgASAbNgKAASAEIAUgAyACEP4CIAEoAlAhBiABKAJUIQcgASgCWCEIIAEoAlwhCSABIB02AnwgASAYNgJ4IAEgFzYCdCABIBY2AnAgASAQNgKMASABIA82AogBIAEgDjYChAEgASANNgKAASAFIAMgAhD6BCABIAEoAmwgFWo2AlwgASABKAJoIBRqNgJYIAEgASgCZCATajYCVCABIAEoAmAgGWo2AlAgHiABKQNINwMAIAEgASkDQDcDgAEgAyAEIAIQ+QQgASgCcCEZIAEoAnQhGiABKAJ4IRsgASgCfCEcIAEgEjYCbCABIAw2AmggASALNgJkIAEgCjYCYCABIAk2AnwgASAINgJ4IAEgBzYCdCABIAY2AnAgASAcQaHR/5V6aiIKNgKMASABIBtBy8zpwHpqIgs2AogBIAEgGkHwlq6SfGoiDDYChAEgASAZQaOjsbt8aiISNgKAASAEIAUgAyACEP4CIAEoAlAhFiABKAJUIRcgASgCWCEYIAEoAlwhHSABIAk2AmwgASAINgJoIAEgBzYCZCABIAY2AmAgASAdNgJ8IAEgGDYCeCABIBc2AnQgASAWNgJwIAEgDDYCjAEgASASNgKIASABIAo2AoQBIAEgCzYCgAEgBCAFIAMgAhD+AiABKAJQIQYgASgCVCEHIAEoAlghCCABKAJcIQkgASAQNgJ8IAEgDzYCeCABIA42AnQgASANNgJwIAEgETYCjAEgASAVNgKIASABIBQ2AoQBIAEgEzYCgAEgBSADIAIQ+gQgASABKAJsIB9qNgJcIAEgASgCaCAiajYCWCABIAEoAmQgI2o2AlQgASABKAJgIBxqNgJQIAEgHDYCjAEgASAbNgKIASABIBo2AoQBIAEgGTYCgAEgAyAEIAIQ+QQgASgCcCENIAEoAnQhDiABKAJ4IQ8gASgCfCEQIAEgHTYCbCABIBg2AmggASAXNgJkIAEgFjYCYCABIAk2AnwgASAINgJ4IAEgBzYCdCABIAY2AnAgASAQQZnQy4x9aiIWNgKMASABIA9BpIzktH1qIhc2AogBIAEgDkGF67igf2oiGDYChAEgASANQfDAqoMBaiIdNgKAASAEIAUgAyACEP4CIAEoAlAhCiABKAJUIQsgASgCWCEMIAEoAlwhEiABIAk2AmwgASAINgJoIAEgBzYCZCABIAY2AmAgASASNgJ8IAEgDDYCeCABIAs2AnQgASAKNgJwIAEgGDYCjAEgASAdNgKIASABIBY2AoQBIAEgFzYCgAEgBCAFIAMgAhD+AiABKAJQIQYgASgCVCEHIAEoAlghCCABKAJcIQkgASARNgJ8IAEgFTYCeCABIBQ2AnQgASATNgJwIB4gASkDSDcDACABIAEpA0A3A4ABIAUgAyACEPoEIAEgASgCbCAbajYCXCABIAEoAmggGmo2AlggASABKAJkIBlqNgJUIAEgASgCYCAQajYCUCABIBA2AowBIAEgDzYCiAEgASAONgKEASABIA02AoABIAMgBCACEPkEIAEoAnAhFiABKAJ0IRcgASgCeCEYIAEoAnwhHSABIBI2AmwgASAMNgJoIAEgCzYCZCABIAo2AmAgASAJNgJ8IAEgCDYCeCABIAc2AnQgASAGNgJwIAEgHUGWgpPNAWoiEzYCjAEgASAYQYjY3fEBaiIUNgKIASABIBdBzO6hugJqIhU2AoQBIAEgFkG1+cKlA2oiETYCgAEgBCAFIAMgAhD+AiABKAJQIQogASgCVCELIAEoAlghDCABKAJcIRIgASAJNgJsIAEgCDYCaCABIAc2AmQgASAGNgJgIAEgEjYCfCABIAw2AnggASALNgJ0IAEgCjYCcCABIBU2AowBIAEgETYCiAEgASATNgKEASABIBQ2AoABIAQgBSADIAIQ/gIgASgCUCEGIAEoAlQhByABKAJYIQggASgCXCEJICEgASkDSDcDACABIAEpA0A3A3AgASAcNgKMASABIBs2AogBIAEgGjYChAEgASAZNgKAASAFIAMgAhD6BCABIAEoAmwgD2o2AlwgASABKAJoIA5qNgJYIAEgASgCZCANajYCVCABIAEoAmAgHWo2AlAgASAdNgKMASABIBg2AogBIAEgFzYChAEgASAWNgKAASADIAQgAhD5BCABKAJwIRMgASgCdCEUIAEoAnghFSABKAJ8IREgASASNgJsIAEgDDYCaCABIAs2AmQgASAKNgJgIAEgCTYCfCABIAg2AnggASAHNgJ0IAEgBjYCcCABIBFBs5nwyANqIiE2AowBIAEgFUHK1OL2BGoiHzYCiAEgASAUQc+U89wFaiIiNgKEASABIBNB89+5wQZqIiM2AoABIAQgBSADIAIQ/gIgASgCUCEKIAEoAlQhCyABKAJYIQwgASgCXCESIAEgCTYCbCABIAg2AmggASAHNgJkIAEgBjYCYCABIBI2AnwgASAMNgJ4IAEgCzYCdCABIAo2AnAgASAiNgKMASABICM2AogBIAEgITYChAEgASAfNgKAASAEIAUgAyACEP4CIAEoAlAhBiABKAJUIQcgASgCWCEIIAEoAlwhCSABIBw2AnwgASAbNgJ4IAEgGjYCdCABIBk2AnAgASAQNgKMASABIA82AogBIAEgDjYChAEgASANNgKAASAFIAMgAhD6BCABIAEoAmwgGGo2AlwgASABKAJoIBdqNgJYIAEgASgCZCAWajYCVCABIAEoAmAgEWo2AlAgASARNgKMASABIBU2AogBIAEgFDYChAEgASAT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AmopAwAgAikDsAIiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAWIAhUrXx8IgggAikD4AV8IhZ8Iht8Ihx8Ih18IhMgAikDsAF8IhQgAkHIAWopAwAgAikDwAEiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQUBrIARC///Piuv//9UeELUFIAJBMGogBEKk7MO1j9S0mOcAELUFIAJBIGogBEK/pZScz/DSu+QAELUFIAJBEGogBELX2a6a5PbpjcsAELUFIAIgBEKazf/Lo73EgBoQtQUgACACQdgAaikDACACKQNQIgQgB3wgBFStfCIeIAIpA0B8IgQgByAUVK0gAkG4AWopAwAgFCATVK18fCIUIAIpA6ABfCIHIBMgEVStIAJBmAJqKQMAIBEgGVStfHwiGSACKQOAAnwiESAdIA5UrSACQfgCaikDACAOIBpUrXx8IhogAikD4AJ8Ig4gHCAKVK0gAkHYA2opAwAgCiAVVK18fCIVIAIpA8ADfCIKIAJBmAVqKQMAIBAgGFStfCIYIAIpA7AIfCITIAsgElStIAJB6AdqKQMAIBIgEFStfHx8IhAgAikD8Ad8IhIgCSAPVK0gAkGoB2opAwAgDyAL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BXwiEHwiE3wiCyACKQOQA3wiDiACQagDaikDACACKQOgAyIEIAd8IARUrXx8IgdC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAJBoAJqIARC///Piuv//9UeELUFIAJBkAJqIARCpOzDtY/UtJjnABC1BSACQYACaiAEQr+llJzP8NK75AAQtQUgAkHwAWogBELX2a6a5PbpjcsAELUFIAJB4AFqIARCms3/y6O9xIAaELUFIAJBwAFqIAcgDlStIAJBmANqKQMAIA4gC1StfHwiFCACKQOAA3wiDiALIApUrSACQfgDaikDACAKIBFUrXx8IhUgAikD4AN8IgogEyAFVK0gAkHIAmopAwAgBSASVK18fCISIAIpA9ABfCIFIAJB+ARqKQMAIAkgD1StfCITIAIpA4AFfCILIAIpA5AHfCIPIAYgDFStIAJByAZqKQMAIAwgCVStfHx8IgkgAikD0AZ8IgwgCCANVK0gAkGIBmopAwAgDSAGVK18fHwiBiACKQOQBnwiDSACQcgFaikDACAQIAhUrXx8IgggAikD0AV8IhZ8Ihd8Ihh8IhAgAikDoAJ8IhEgAkG4AmopAwAgAikDsAIiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAW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AikDsAIiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAWIAhUrXx8IgggAikD4AV8IhZ8Iht8Ihx8Ih18IhMgAikDsAF8IhQgAkHIAWopAwAgAikDwAEiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQUBrIARC///Piuv//9UeELUFIAJBMGogBEKk7MO1j9S0mOcAELUFIAJBIGogBEK/pZScz/DSu+QAELUFIAJBEGogBELX2a6a5PbpjcsAELUFIAIgBEKazf/Lo73EgBoQtQUgACACQdgAaikDACACKQNQIgQgB3wgBFStfCIeIAIpA0B8IgQgByAUVK0gAkG4AWopAwAgFCATVK18fCIUIAIpA6ABfCIHIBMgEVStIAJBmAJqKQMAIBEgGVStfHwiGSACKQOAAnwiESAdIA5UrSACQfgCaikDACAOIBpUrXx8IhogAikD4AJ8Ig4gHCAKVK0gAkHYA2opAwAgCiAVVK18fCIVIAIpA8ADfCIKIAJBmAVqKQMAIBAgGFStfCIYIAIpA7AIfCITIAsgElStIAJB6AdqKQMAIBIgEFStfHx8IhAgAikD8Ad8IhIgCSAPVK0gAkGoB2opAwAgDyALVK18fHwi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E3wiCyACKQOQA3wiDiACQagDaikDACACKQOgAyIEIAd8IARUrXx8IgdC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAJBoAJqIARC///Piuv//9UeELUFIAJBkAJqIARCpOzDtY/UtJjnABC1BSACQYACaiAEQr+llJzP8NK75AAQtQUgAkHwAWogBELX2a6a5PbpjcsAELUFIAJB4AFqIARCms3/y6O9xIAaELUFIAJBwAFqIAcgDlStIAJBmANqKQMAIA4gC1StfHwiFCACKQOAA3wiDiALIApUrSACQfgDaikDACAKIBFUrXx8IhUgAikD4AN8IgogEyAFVK0gAkHIAmopAwAgBSASVK18fCISIAIpA9ABfCIFIAJB+ARqKQMAIAkgD1StfCITIAIpA4AFfCILIAIpA5AHfCIPIAYgDFStIAJByAZqKQMAIAwgCVStfHx8IgkgAikD0AZ8IgwgCCANVK0gAkGIBmopAwAgDSAGVK18fHwiBiACKQOQBnwiDSACQcgFaikDACAQIAhUrXx8IgggAikD0AV8IhZ8Ihd8Ihh8IhAgAikDoAJ8IhEgAkG4AmopAwAgAikDsAIiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAWIAhUrXx8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BCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAWIAhUrXx8IgggAikD4AV8IhZ8Iht8Ihx8Ih18IhMgAikDsAF8IhQgAkHIAWopAwAgAikDwAEiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQUBrIARC///Piuv//9UeELUFIAJBMGogBEKk7MO1j9S0mOcAELUFIAJBIGogBEK/pZScz/DSu+QAELUFIAJBEGogBELX2a6a5PbpjcsAELUFIAIgBEKazf/Lo73EgBoQtQUgACACQdgAaikDACACKQNQIgQgB3wgBFStfCIeIAIpA0B8IgQgByAUVK0gAkG4AWopAwAgFCATVK18fCIUIAIpA6ABfCIHIBMgEVStIAJBmAJqKQMAIBEgGVStfHwiGSACKQOAAnwiESAdIA5UrSACQfgCaikDACAOIBpUrXx8IhogAikD4AJ8Ig4gHCAKVK0gAkHYA2opAwAgCiAVVK18fCIVIAIpA8ADfCIKIAJBmAVqKQMAIBAgGFStfCIYIAIpA7AIfCITIAsgElStIAJB6AdqKQMAIBIgEFStfHx8IhAgAikD8Ad8IhIgCSAPVK0gAkGoB2opAwAgDyALVK18fHwiCyACKQOw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KQOQA3wiDiACQagDaikDACACKQOgAyIEIAd8IARUrXx8IgdC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAJBoAJqIARC///Piuv//9UeELUFIAJBkAJqIARCpOzDtY/UtJjnABC1BSACQYACaiAEQr+llJzP8NK75AAQtQUgAkHwAWogBELX2a6a5PbpjcsAELUFIAJB4AFqIARCms3/y6O9xIAaELUFIAJBwAFqIAcgDlStIAJBmANqKQMAIA4gC1StfHwiFCACKQOAA3wiDiALIApUrSACQfgDaikDACAKIBFUrXx8IhUgAikD4AN8IgogEyAFVK0gAkHIAmopAwAgBSASVK18fCISIAIpA9ABfCIFIAJB+ARqKQMAIAkgD1StfCITIAIpA4AFfCILIAIpA5AHfCIPIAYgDFStIAJByAZqKQMAIAwgCVStfHx8IgkgAikD0AZ8IgwgCCANVK0gAkGIBmopAwAgDSAGVK18fHwiBiACKQOQBnwiDSACQcgFaikDACAQIAhUrXx8IgggAikD0AV8IhZ8Ihd8Ihh8IhAgAikDoAJ8IhEgAkG4AmopAwAgAikDsAIiBCAHfCAEVK18fCIHQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSACQbABaiAEQv//z4rr///VHhC1BSACQaABaiAEQqTsw7WP1LSY5wAQtQUgAkGQAWogBEK/pZScz/DSu+QAELUFIAJBgAFqIARC19mumuT26Y3LABC1BSACQfAAaiAEQprN/8ujvcSAGhC1BSACQdAAaiAHIBFUrSACQagCaikDACARIBBUrXx8IhkgAikDkAJ8IhEgECAOVK0gAkGIA2opAwAgDiAUVK18fCIaIAIpA/ACfCIOIBggClStIAJB6ANqKQMAIAogFVStfHwiFSACKQPQA3wiCiAXIAVUrSACQdgBaikDACAFIBJUrXx8IhcgAikDYHwiBSACQYgFaikDACALIBNUrXwiGCACKQOQBXwiECACKQPgB3wiEiAJIA9UrSACQZgHaikDACAPIAtUrXx8fCILIAIpA6AHfCIPIAYgDFStIAJB2AZqKQMAIAwgCVStfHx8IgkgAikD4AZ8IgwgCCANVK0gAkGYBmopAwAgDSAGVK18fHwiBiACKQOgBnwiDSACQdgFaikDACAWIAhUrXx8IgggAikD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ARBDQSghAAJAA0AgAEF4Rg0BIAJBoAJqIABqKQMAIgogACABaikDACILVA0BIABBeGohACAKIAtYDQALQgAhCkEAIQADQCAAIAFqIgUpAwAiDCAKfCIKIABBwMzBAGopAwB8IQsgBSALNwMAIAogDFStIAsgClStfCEKIABBCGoiAEEwRw0ACwtCACEKQQAhAANAIAAgAWoiBSkDACIMIAJBoAJqIABqKQMAIg19IQsgBSALIAp9NwMAIAwgDVStIAsgClStfEIBUa0hCiAAQQhqIgBBMEcNAAtBKCEAAkADQCAAQXhGDQEgAkGAA2ogAGopAwAiCiAAIAFqKQMAIgtUDQEgAEF4aiEAIAogC1gNAAtCACEKQQAhAANAIAAgAWoiBSkDACIMIAp8IgogAEHAzMEAaikDAHwhCyAFIAs3AwAgCiAMVK0gCyAKVK18IQogAEEIaiIAQTBHDQALC0IAIQpBACEAA0AgACABaiIFKQMAIgwgAkGAA2ogAGopAwAiDX0hCyAFIAsgCn03AwAgDCANVK0gCyAKVK18QgFRrSEKIABBCGoiAEEwRw0AC0EoIQACQANAIABBeEYNASACQYADaiAAaikDACIKIAAgAWopAwAiC1QNASAAQXhqIQAgCiALWA0AC0IAIQpBACEAA0AgACABaiIFKQMAIgwgCnwiCiAAQcDMwQBqKQMAfCELIAUgCzcDACAKIAxUrSALIApUrXwhCiAAQQhqIgBBMEcNAAsLQgAhCkEAIQADQCAAIAFqIgUpAwAiDCACQYADaiAAaikDACINfSELIAUgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAEEIaiIAQTBHDQALIAJBoAJqIAcQO0IAIQpBACEAA0AgAkGgAmogAGoiBSkDACELIAUgC0IBhiAKhDcDACALQj+IIQogAEEIaiIAQTBHDQALQSghAAJAA0AgAEF4RwRAIAJBoAJqIABqKQMAIgogAEHAzMEAaikDACILVA0CIABBeGohACAKIAtYDQELC0IAIQpBACEAA0AgAkGgAmogAGoiBSkDACIMIABBwMzBAGopAwAiDX0hCyAFIAsgCn03AwAgDCANVK0gCyAKVK18QgFRrSEKIABBCGoiAEEwRw0ACwsgByACQYADakEwEKIHQVAhAAJAA0AgAEUNASADQXhqIgMpAwAiCiAEQXhqIgQpAwAiC1QNASAAQQhqIQAgCiALWA0ACyABQTBqIQNCACEKQQAhAANAIAAgA2oiBCkDACIMIAp8IgogAEHAzMEAaikDAHwhCyAEIAs3AwAgCiAMVK0gCyAKVK18IQogAEEIaiIAQTBHDQALC0IAIQpBACEAA0AgACABaiIDQTBqIgQpAwAhCyAEIAsgAykDACIMfSINIAp9NwMAIAsgDFStIA0gClStfEIBUa0hCiAAQQhqIgBBMEcNAAsgAkHQAmoQOyABQdgAaiEDIAJByAJqIQRBACEAAkADQCAAQVBGDQEgACAEaikDACIKIAAgA2opAwAiC1QNASAAQXhqIQAgCiALWA0ACyABQTBqIQNCACEKQQAhAANAIAAgA2oiBCkDACIMIAp8IgogAEHAzMEAaikDAHwhCyAEIAs3AwAgCiAMVK0gCyAKVK18IQogAEEIaiIAQTBHDQALCyABQTBqIQNCACEKQQAhAANAIAAgA2oiBCkDACIMIAJBoAJqIABqKQMAIg19IQsgBCALIAp9NwMAIAwgDVStIAsgClStfEIBUa0hCiAAQQhqIgBBMEcNAAsgAUHgAGohA0IAIQpBACEAA0AgACADaiIEKQMAIgwgCnwiCiACQZABaiAAaikDAHwhCyAEIAs3AwAgCiAMVK0gCyAKVK18IQogAEEIaiIAQTBHDQALIAFBiAFqIQNBACEAAkADQCAAQVBHBEAgACADaikDACIKIABB6MzBAGopAwAiC1QNAiAAQXhqIQAgCiALWA0BCwsgAUHgAGohA0IAIQpBACEAA0AgACADaiIEKQMAIgwgAEHAzMEAaikDACINfSELIAQgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAEEIaiIAQTBHDQALCyAGEEMgAUGIAWohBiACQShqIQNBACEAAkADQCAAQVBGDQEgACADaikDACIKIAAgBmopAwAiC1QNASAAQXhqIQAgCiALWA0ACyABQeAAaiEGQgAhCkEAIQADQCAAIAZqIgMpAwAiDCAKfCIKIABBwMzBAGopAwB8IQsgAyALNwMAIAogDFStIAsgClStfCEKIABBCGoiAEEwRw0ACwsgAUHgAGohBkIAIQpBACEAA0AgACAGaiIDKQMAIgwgACACaikDACINfSELIAMgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAEEIaiIAQTBHDQALIAFBiAFqIQYgAkHoAWohA0EAIQACQANAIABBUEYNASAAIANqKQMAIgogACAGaikDACILVA0BIABBeGohACAKIAtYDQALIAFB4ABqIQZCACEKQQAhAANAIAAgBmoiAykDACIMIAp8IgogAEHAzMEAaikDAHwhCyADIAs3AwAgCiAMVK0gCyAKVK18IQogAEEIaiIAQTBHDQALCyABQeAAaiEAQgAhCkEAIQEDQCAAIAFqIgYpAwAiDCACQcABaiABaikDACINfSELIAYgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAUEIaiIBQTBHDQALDAILIAAQSQwBCyAAIAFBMBCiB0EwaiABQTBqQTAQogcaIAZBkMzBAEEwEKIHGgsgCEGwA2okAAvqGgIDfxl+IwBBkAdrIgEkACABQcAEaiAAKQMIIgQgACkDACIGELUFIAFB0ARqIAApAxAiByAGELUFIAFB4ARqIAApAxgiBSAGELUFIAFB8ARqIAApAyAiCCAGELUFIAFBgAVqIAApAygiCSAGELUFIAFBoAVqIAcgBBC1BSABQbAFaiAFIAQQtQUgAUHABWogCCAEELUFIAFB0AVqIAkgBBC1BSABQfAFaiAFIAcQtQUgAUGABmogCCAHELUFIAFBkAZqIAkgBxC1BSABQbAGaiAIIAUQtQUgAUHABmogCSAFELUFIAFB4AZqIAkgCBC1BSABQZAFaiAGIAYQtQUgAUHgBWogBCAEELUFIAFBoAZqIAcgBxC1BSABQdAGaiAFIAUQtQUgAUHwBmogCCAIELUFIAFBgAdqIAkgCRC1BSABQbAEaiABKQOQBSIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQaAEaiAEQv//z4rr///VHhC1BSABQZAEaiAEQqTsw7WP1LSY5wAQtQUgAUGABGogBEK/pZScz/DSu+QAELUFIAFB8ANqIARC19mumuT26Y3LABC1BSABQeADaiAEQprN/8ujvcSAGhC1BSABQdADaiABQZgFaikDACIIIAEpA8AEIglCAYZ8IgYgASkDoAR8IgcgAUG4BGopAwAgASkDsAQiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQcADaiAEQv//z4rr///VHhC1BSABQdACaiAEQqTsw7WP1LSY5wAQtQUgAUHgAWogBEK/pZScz/DSu+QAELUFIAFB8ABqIARC19mumuT26Y3LABC1BSABIARCms3/y6O9xIAaELUFIAFBsANqIAUgB1StIAFBqARqKQMAIAcgBlStfHwiDCABKQOQBHwiByAGIAhUrSILIAEpA+AFfCIGIAEpA9AEIg0gAUHIBGopAwB8IghCAYYgCUI/iIR8Ig58IgkgASkDwAN8IgogAUHYA2opAwAgASkD0AMiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQaADaiAEQv//z4rr///VHhC1BSABQZADaiAEQqTsw7WP1LSY5wAQtQUgAUGAA2ogBEK/pZScz/DSu+QAELUFIAFB8AJqIARC19mumuT26Y3LABC1BSABQeACaiAEQprN/8ujvcSAGhC1BSABQcACaiABKQOgAyIPIAkgB1StIAFBmARqKQMAIAcgDFStfHwiECABKQOABHwiByAOIAZUrSABQegFaikDACAGIAtUrXx8Ig4gAUHYBGopAwAgCCANVK18Ig0gASkD4AR8IgYgASkDoAV8IgxCAYYgCEI/iIR8IhF8IgggASkD0AJ8IgsgBSAKVK0gAUHIA2opAwAgCiAJVK18fHwiCnwiCSABQbgDaikDACABKQOwAyIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBsAJqIARC///Piuv//9UeELUFIAFBoAJqIARCpOzDtY/UtJjnABC1BSABQZACaiAEQr+llJzP8NK75AAQtQUgAUGAAmogBELX2a6a5PbpjcsAELUFIAFB8AFqIARCms3/y6O9xIAaELUFIAFB0AFqIAEpA7ACIhMgCiALVK0gAUHYAmopAwAgCyAIVK18fCIUIAEpA+ABfCIKIAggB1StIAFBiARqKQMAIAcgEFStfHwiECABKQPwA3wiByARIA5UrSIRIAEpA6AGfCIIIAFB6ARqKQMAIAYgDVStfCISIAEpA/AEfCILIAEpA7AFfCINIAFBqAVqKQMAIAwgBlStfHwiBkIBhiAMQj+IhHwiFXwiFnwiDCABKQOQA3wiDiAFIAlUrSABQagDaikDACAJIA9UrXx8fCIXfCIJIAFByAJqKQMAIAEpA8ACIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUHAAWogBEL//8+K6///1R4QtQUgAUGwAWogBEKk7MO1j9S0mOcAELUFIAFBoAFqIARCv6WUnM/w0rvkABC1BSABQZABaiAEQtfZrprk9umNywAQtQUgAUGAAWogBEKazf/Lo73EgBoQtQUgAUHgAGogDCAKVK0gAUHoAWopAwAgCiAUVK18fCIUIAEpA3B8IgogFiAHVK0gAUH4A2opAwAgByAQVK18fCIWIAEpA+ADfCIHIBUgCFStIAFBqAZqKQMAIAggEVStfHwiECABQfgEaikDACALIBJUrXwiESABKQOABXwiCCABKQPABXwiDyAGIA1UrSABQbgFaikDACANIAtUrXx8fCILIAEpA/AFfCINQgGGIAZCP4iEfCISfCIVfCIYIBcgDlStIAFBmANqKQMAIA4gDFStfHwiFyABKQOAA3wiBnwiDCABKQOgAnwiDiAFIAlUrSABQbgCaikDACAJIBNUrXx8fCIZIAEpA8ABIhp8IgkgAUHYAWopAwAgASkD0AEiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQdAAaiAEQv//z4rr///VHhC1BSABQUBrIARCpOzDtY/UtJjnABC1BSABQTBqIARCv6WUnM/w0rvkABC1BSABQSBqIARC19mumuT26Y3LABC1BSABQRBqIARCms3/y6O9xIAaELUFIAAgASkDUCIbIBIgEFStIhIgASkD0AZ8IgQgAUGIBWopAwAgCCARVK18IhwgASkD0AV8IhAgCyAPVK0gAUHIBWopAwAgDyAIVK18fHwiCCABKQOABnwiDyABQfgFaikDACANIAtUrXx8IgtCAYYgDUI/iIR8Ig0gFSAHVK0gAUHoA2opAwAgByAWVK18fHwiByABKQMAfCIRIBggClStIAFB+ABqKQMAIAogFFStfHx8IgogASkD8AJ8IhMgDCAGVK0gAUGIA2opAwAgBiAXVK18fHwiBiABKQOQAnwiFCAZIA5UrSABQagCaikDACAOIAxUrXx8fCIMIAEpA7ABfCIOIAUgCVStIAFByAFqKQMAIAkgGlStfHx8IhV8IgkgAUHoAGopAwAgBSABKQNgIgV8IAVUrXx8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KQMAfCIIQgGGIAlCP4iEfCIOfCIJIAEpA8ADfCIKIAFB2ANqKQMAIAEpA9ADIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUGgA2ogBEL//8+K6///1R4QtQUgAUGQA2ogBEKk7MO1j9S0mOcAELUFIAFBgANqIARCv6WUnM/w0rvkABC1BSABQfACaiAEQtfZrprk9umNywAQtQUgAUHgAmogBEKazf/Lo73EgBoQtQUgAUHAAmogASkDoAMiDyAJIAdUrSABQZgEaikDACAHIAxUrXx8IhAgASkDgAR8IgcgDiAGVK0gAUHoBWopAwAgBiALVK18fCIOIAFB2ARqKQMAIAggDVStfCINIAEpA+AEfCIGIAEpA6AFfCIMQgGGIAhCP4iEfCIRfCIIIAEpA9ACfCILIAUgClStIAFByANqKQMAIAogCVStfHx8Igp8IgkgAUG4A2opAwAgASkDsAMiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQbACaiAEQv//z4rr///VHhC1BSABQaACaiAEQqTsw7WP1LSY5wAQtQUgAUGQAmogBEK/pZScz/DSu+QAELUFIAFBgAJqIARC19mumuT26Y3LABC1BSABQfABaiAEQprN/8ujvcSAGhC1BSABQdABaiABKQOwAiITIAogC1StIAFB2AJqKQMAIAsgCFStfHwiFCABKQPgAXwiCiAIIAdUrSABQYgEaikDACAHIBBUrXx8IhAgASkD8AN8IgcgESAOVK0iESABKQOgBnwiCCABQegEaikDACAGIA1UrXwiEiABKQPwBHwiCyABKQOwBXwiDSABQagFaikDACAMIAZUrXx8IgZCAYYgDEI/iIR8IhV8IhZ8IgwgASkDkAN8Ig4gBSAJVK0gAUGoA2opAwAgCSAPVK18fHwiF3wiCSABQcgCaikDACABKQPAAiIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBwAFqIARC///Piuv//9UeELUFIAFBsAFqIARCpOzDtY/UtJjnABC1BSABQaABaiAEQr+llJzP8NK75AAQtQUgAUGQAWogBELX2a6a5PbpjcsAELUFIAFBgAFqIARCms3/y6O9xIAaELUFIAFB4ABq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GX4jAEGQB2siASQAIAFBwARqIAApAwgiBCAAKQMAIgYQtQUgAUHQBGogACkDECIHIAYQtQUgAUHgBGogACkDGCIFIAYQtQUgAUHwBGogACkDICIIIAYQtQUgAUGABWogACkDKCIJIAYQtQUgAUGgBWogByAEELUFIAFBsAVqIAUgBBC1BSABQcAFaiAIIAQQtQUgAUHQBWogCSAEELUFIAFB8AVqIAUgBxC1BSABQYAGaiAIIAcQtQUgAUGQBmogCSAHELUFIAFBsAZqIAggBRC1BSABQcAGaiAJIAUQtQUgAUHgBmogCSAIELUFIAFBkAVqIAYgBhC1BSABQeAFaiAEIAQQtQUgAUGgBmogByAHELUFIAFB0AZqIAUgBRC1BSABQfAGaiAIIAgQtQUgAUGAB2ogCSAJELUFIAFBsARqIAEpA5AFIgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBoARqIARC///Piuv//9UeELUFIAFBkARqIARCpOzDtY/UtJjnABC1BSABQYAEaiAEQr+llJzP8NK75AAQtQUgAUHwA2ogBELX2a6a5PbpjcsAELUFIAFB4ANqIARCms3/y6O9xIAaELUFIAFB0ANqIAFBmAVqKQMAIgggASkDwAQiCUIBhnwiBiABKQOgBHwiByABQbgEaikDACABKQOwBCIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBwANqIARC///Piuv//9UeELUFIAFB0AJqIARCpOzDtY/UtJjnABC1BSABQeABaiAEQr+llJzP8NK75AAQtQUgAUHwAGogBELX2a6a5PbpjcsAELUFIAEgBEKazf/Lo73EgBoQtQUgAUGwA2ogBSAHVK0gAUGoBGopAwAgByAGVK18fCIMIAEpA5AEfCIHIAYgCFStIgsgASkD4AV8IgYgASkD0AQiDSABQcgEaikDAHwiCEIBhiAJQj+IhHwiDnwiCSABKQPAA3wiCiABQdgDaikDACABKQPQAyIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBoANqIARC///Piuv//9UeELUFIAFBkANqIARCpOzDtY/UtJjnABC1BSABQYADaiAEQr+llJzP8NK75AAQtQUgAUHwAmogBELX2a6a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aiAFIAcQtQUgAUGABmogCCAHELUFIAFBkAZqIAkgBxC1BSABQbAGaiAIIAUQtQUgAUHABmogCSAFELUFIAFB4AZqIAkgCBC1BSABQZAFaiAGIAYQtQUgAUHgBWogBCAEELUFIAFBoAZqIAcgBxC1BSABQdAGaiAFIAUQtQUgAUHwBmogCCAIELUFIAFBgAdqIAkgCRC1BSABQbAEaiABKQOQBSIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQaAEaiAEQv//z4rr///VHhC1BSABQZAEaiAEQqTsw7WP1LSY5wAQtQUgAUGABGogBEK/pZScz/DSu+QAELUFIAFB8ANqIARC19mumuT26Y3LABC1BSABQeADaiAEQprN/8ujvcSAGhC1BSABQdADaiABQZgFaikDACIIIAEpA8AEIglCAYZ8IgYgASkDoAR8IgcgAUG4BGopAwAgASkDsAQiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQcADaiAEQv//z4rr///VHhC1BSABQdACaiAEQqTsw7WP1LSY5wAQtQUgAUHgAWogBEK/pZScz/DSu+QAELUFIAFB8ABqIARC19mumuT26Y3LABC1BSABIARCms3/y6O9xIAaELUFIAFBsANqIAUgB1StIAFBqARqKQMAIAcgBlStfHwiDCABKQOQBHwiByAGIAhUrSILIAEpA+AFfCIGIAEpA9AEIg0gAUHIBGopAwB8IghCAYYgCUI/iIR8Ig58IgkgASkDwAN8IgogAUHYA2opAwAgASkD0AMiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQaADaiAEQv//z4rr///VHhC1BSABQZADaiAEQqTsw7WP1LSY5wAQtQUgAUGAA2ogBEK/pZScz/DSu+QAELUFIAFB8AJqIARC19mumuT26Y3LABC1BSABQeACaiAEQprN/8ujvcSAGhC1BSABQcACaiABKQOgAyIPIAkgB1StIAFBmARqKQMAIAcgDFStfHwiECABKQOABHwiByAOIAZUrSABQegFaikDACAGIAtUrXx8Ig4gAUHYBGopAwAgCCANVK18Ig0gASkD4AR8IgYgASkDoAV8IgxCAYYgCEI/iIR8IhF8IgggASkD0AJ8IgsgBSAKVK0gAUHIA2opAwAgCiAJVK18fHwiCnwiCSABQbgDaikDACABKQOwAyIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBsAJqIARC///Piuv//9UeELUFIAFBoAJqIARCpOzDtY/UtJjnABC1BSABQZACaiAEQr+llJzP8NK75AAQtQUgAUGAAmogBELX2a6a5PbpjcsAELUFIAFB8AFqIARCms3/y6O9xIAaELUFIAFB0AFqIAEpA7ACIhMgCiALVK0gAUHYAmopAwAgCyAIVK18fCIUIAEpA+ABfCIKIAggB1StIAFBiARqKQMAIAcgEFStfHwiECABKQPwA3wiByARIA5UrSIRIAEpA6AGfCIIIAFB6ARqKQMAIAYgDVStfCISIAEpA/AEfCILIAEpA7AFfCINIAFBqAVqKQMAIAwgBlStfHwiBkIBhiAMQj+IhHwiFXwiFnwiDCABKQOQA3wiDiAFIAlUrSABQagDaikDACAJIA9UrXx8fCIXfCIJIAFByAJqKQMAIAEpA8ACIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUHAAWogBEL//8+K6///1R4QtQUgAUGwAWogBEKk7MO1j9S0mOcAELUFIAFBoAFqIARCv6WUnM/w0rvkABC1BSABQZABaiAEQtfZrprk9umNywAQtQUgAUGAAWogBEKazf/Lo73EgBoQtQUgAUHgAGogDCAKVK0gAUHoAWopAwAgCiAUVK18fCIUIAEpA3B8IgogFiAHVK0gAUH4A2opAwAgByAQVK18fCIWIAEpA+ADfCIHIBUgCFStIAFBqAZqKQMAIAggEVStfHwiECABQfgEaikDACALIBJUrXwiESABKQOABXwiCCABKQPABXwiDyAGIA1UrSABQbgFaikDACANIAtUrXx8fCILIAEpA/AFfCINQgGGIAZCP4iEfCISfCIVfCIYIBcgDlStIAFBmANqKQMAIA4gDFStfHwiFyABKQOAA3wiBnwiDCABKQOgAnwiDiAFIAlUrSABQbgCaikDACAJIBNUrXx8fCIZIAEpA8ABIhp8IgkgAUHYAWopAwAgASkD0AEiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQdAAaiAE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BUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUGgBGogBEL//8+K6///1R4QtQUgAUGQBGogBEKk7MO1j9S0mOcAELUFIAFBgARqIARCv6WUnM/w0rvkABC1BSABQfADaiAEQtfZrprk9umNywAQtQUgAUHgA2ogBEKazf/Lo73EgBoQtQUgAUHQA2ogAUGYBWopAwAiCCABKQPABCIJQgGGfCIGIAEpA6AEfCIHIAFBuARqKQMAIAEpA7AEIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUHAA2ogBEL//8+K6///1R4QtQUgAUHQAmogBEKk7MO1j9S0mOcAELUFIAFB4AFqIARCv6WUnM/w0rvkABC1BSABQfAAaiAEQtfZrprk9umNywAQtQUgASAEQprN/8ujvcSAGhC1BSABQbADaiAFIAdUrSABQagEaikDACAHIAZUrXx8IgwgASkDkAR8IgcgBiAIVK0iCyABKQPgBXwiBiABKQPQBCINIAFByARqKQMAfCIIQgGGIAlCP4iEfCIOfCIJIAEpA8ADfCIKIAFB2ANqKQMAIAEpA9ADIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUGgA2ogBEL//8+K6///1R4QtQUgAUGQA2ogBEKk7MO1j9S0mOcAELUFIAFBgANqIARCv6WUnM/w0rvkABC1BSABQfACaiAEQtfZrprk9umNywAQtQUgAUHgAmogBEKazf/Lo73EgBoQtQUgAUHAAmogASkDoAMiDyAJIAdUrSABQZgEaikDACAHIAxUrXx8IhAgASkDgAR8IgcgDiAGVK0gAUHoBWopAwAgBiALVK18fCIOIAFB2ARqKQMAIAggDVStfCINIAEpA+AEfCIGIAEpA6AFfCIMQgGGIAhCP4iEfCIRfCIIIAEpA9ACfCILIAUgClStIAFByANqKQMAIAogCVStfHx8Igp8IgkgAUG4A2opAwAgASkDsAMiBCAFfCAEVK18fCIFQv3/8//P///5iX9+IgRCq9X+////v/+5fxC1BSABQbACaiAEQv//z4rr///VHhC1BSABQaACaiAEQqTsw7WP1LSY5wAQtQUgAUGQAmogBEK/pZScz/DSu+QAELUFIAFBgAJqIARC19mumuT26Y3LABC1BSABQfABaiAEQprN/8ujvcSAGhC1BSABQdABaiABKQOwAiITIAogC1StIAFB2AJqKQMAIAsgCFStfHwiFCABKQPgAXwiCiAIIAdUrSABQYgEaikDACAHIBBUrXx8IhAgASkD8AN8IgcgESAOVK0iESABKQOgBnwiCCABQegEaikDACAGIA1UrXwiEiABKQPwBHwiCyABKQOwBXwiDSABQagFaikDACAMIAZUrXx8IgZCAYYgDEI/iIR8IhV8IhZ8IgwgASkDkAN8Ig4gBSAJVK0gAUGoA2opAwAgCSAPVK18fHwiF3wiCSABQcgCaikDACABKQPAAiIEIAV8IARUrXx8IgVC/f/z/8////mJf34iBEKr1f7///+//7l/ELUFIAFBwAFqIARC///Piuv//9UeELUFIAFBsAFqIARCpOzDtY/UtJjnABC1BSABQaABaiAEQr+llJzP8NK75AAQtQUgAUGQAWogBELX2a6a5PbpjcsAELUFIAFBgAFqIARCms3/y6O9xIAaELUFIAFB4ABqIAwgClStIAFB6AFqKQMAIAogFFStfHwiFCABKQNwfCIKIBYgB1StIAFB+ANqKQMAIAcgEFStfHwiFiABKQPgA3wiByAVIAhUrSABQagGaikDACAIIBFUrXx8IhAgAUH4BGopAwAgCyASVK18IhEgASkDgAV8IgggASkDwAV8Ig8gBiANVK0gAUG4BWopAwAgDSALVK18fHwiCyABKQPwBXwiDUIBhiAGQj+IhHwiEnwiFXwiGCAXIA5UrSABQZgDaikDACAOIAxUrXx8IhcgASkDgAN8IgZ8IgwgASkDoAJ8Ig4gBSAJVK0gAUG4AmopAwAgCSATVK18fHwiGSABKQPAASIafCIJIAFB2AFqKQMAIAEpA9ABIgQgBXwgBFStfHwiBUL9//P/z///+Yl/fiIEQqvV/v///7//uX8QtQUgAUHQAGogBEL//8+K6///1R4QtQUgAUFAayAEQqTsw7WP1LSY5wAQtQUgAUEwaiAEQr+llJzP8NK75AAQtQUgAUEgaiAEQtfZrprk9umNywAQtQUgAUEQaiAEQprN/8ujvcSAGhC1BSAAIAEpA1AiGyASIBBUrSISIAEpA9AGfCIEIAFBiAVqKQMAIAggEVStfCIcIAEpA9AFfCIQIAsgD1StIAFByAVqKQMA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aikDACIMVA0CIAJBeGohAiALIAxYDQELC0IAIQtBACECA0AgA0HQAmogAmoiBCkDACINIAJBwMzBAGopAwAiDn0hDCAEIAwgC303AwAgDSAOVK0gDCALVK18QgFRrSELIAJBCGoiAkEwRw0ACwsgA0HQAmoiAhBDIANBgANqIgQgA0GgAmpBMBCiBxogBCACEDsgA0GwA2ogA0HwAWpBMBCiBxpBKCECAkADQCACQXhGDQEgA0HAAWogAmopAwAiCyADQbADaiACaikDACIMVA0BIAJBeGohAiALIAxYDQALQgAhC0EAIQIDQCADQbADaiACaiIEKQMAIg0gC3wiCyACQcDMwQBqKQMAfCEMIAQgDDcDACALIA1UrSAMIAtUrXwhCyACQQhqIgJBMEcNAAsLQgAhC0EAIQIDQCADQbADaiACaiIEKQMAIg0gA0HAAWogAmopAwAiDn0hDCAEIAwgC303AwAgDSAOVK0gDCALVK18QgFRrSELIAJBCGoiAkEwRw0AC0IAIQtBACECA0AgA0GwA2ogAmoiBCkDACEMIAQgDEIBhiALhDcDACAMQj+IIQsgAkEIaiICQTBHDQALQSghAgJAA0AgAkF4RwRAIANBsANqIAJqKQMAIgsgAkHAzMEAaikDACIMVA0CIAJBeGohAiALIAxYDQELC0IAIQtBACECA0AgA0GwA2ogAmoiBCkDACINIAJBwMzBAGopAwAiDn0hDCAEIAwgC303AwAgDSAOVK0gDCALVK18QgFRrSELIAJBCGoiAkEwRw0ACwsgA0HgA2oiAiADQeAAakEwEKIHGiACIANB0AJqEDsgACADQbADakEwEKIHIgIQQyACQTBqIQRBKCEAAkADQCAAQXhGDQEgA0GAA2ogAGopAwAiCyAAIAJqKQMAIgxUDQEgAEF4aiEAIAsgDFgNAAtCACELQQAhAANAIAAgAmoiBSkDACINIAt8IgsgAEHAzMEAaikDAHwhDCAFIAw3AwAgCyANVK0gDCALVK18IQsgAEEIaiIAQTBHDQALC0IAIQtBACEAA0AgACACaiIFKQMAIg0gA0GAA2ogAGopAwAiDn0hDCAFIAwgC303AwAgDSAOVK0gDCALVK18QgFRrSELIABBCGoiAEEwRw0AC0EoIQACQANAIABBeEYNASADQeADaiAAaikDACILIAAgAmop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QcAIaiIBIAJBiANqQTAQogcaIAJByAFqIAEQvANBASEBAn8gAigCyAFBAUYEQCACQdgHaiACQdQBaigCADYCACACIAIpAswBNwPQB0ERIQtB8JnBAAwBCyACQdgHaiACQeABaigCADYCACACQcgIaiACQewBaikCADcDACACQdAIaiACQfQBaikCADcDACACQdgIaiACQfwBaigCADYCACACIAJB2AFqKQMANwPQByACIAJB5AFqKQIANwPACCACQdQBaigCACELQQAhASACQdABaigCAAshBiACQegGaiIHIAJB2AdqKAIANgIAIAJByAZqIgQgAkHICGopAwA3AwAgAkHQBmoiAyACQdAIaikDADcDACACQdgGaiIIIAJB2AhqKAIANgIAIAIgAikD0Ac3A+AGIAIgAikDwAg3A8AGIAENBSACQagHaiAHKAIANgIAIAJBiAhqIAQpAwA3AwAgAkGQCGogAykDADcDACACQZgIaiAIKAIANgIAIAIgAikD4AY3A6AHIAIgAikDwAY3A4AIIAJBwAhqIgEgAkG4A2pBMBCiBxogAkHIAWogARC8A0EBIQECfyACKALIAUEBRgRAIAJB2AdqIAJB1AFqKAIANgIAIAIgAikCzAE3A9AHQYGawQAhCEERDAELIAJB2AdqIAJB4AFqKAIANgIAIAJByAhqIAJB7AFqKQIANwMAIAJB0AhqIAJB9AFqKQIANwMAIAJB2AhqIAJB/AFqKAIANgIAIAIgAkHYAWopAwA3A9AHIAIgAkHkAWopAgA3A8AIIAJB0AFqKAIAIQhBACEBIAJB1AFqKAIACyEHIAJBmAdqIgQgAkHYB2ooAgA2AgAgAkH4BmoiAyACQcgIaikDADcDACACQYAHaiIJIAJB0AhqKQMANwMAIAJBiAdqIgUgAkHYCGooAgA2AgAgAiACKQPQBzcDkAcgAiACKQPACDcD8AYgAQ0GIAJBiAZqIAQoAgA2AgAgAkHoBWogAykDADcDACACQfAFaiAJKQMANwMAIAJB+AVqIAUoAgA2AgAgAkG4BmogAkGoB2ooAgA2AgAgAkGoBmogAkGYCGooAgA2AgAgAkGgBmogAkGQCGopAwA3AwAgAkGYBmogAkGICGopAwA3AwAgAiACKQOQBzcDgAYgAiACKQPwBjcD4AUgAiACKQOgBzcDsAYgAiACKQOACDcDkAYgAkHACGoiASACQegDakEwEKIHGiACQcgBaiABELwDQQEhAQJ/IAIoAsgBQQFGBEAgAkGICGogAkHUAWooAgA2AgAgAiACKQLMATcDgAhBkprBACEJQREMAQsgAkGICGogAkHgAWooAgA2AgAgAkHICGogAkHsAWopAgA3AwAgAkHQCGogAkH0AWopAgA3AwAgAkHYCGogAkH8AWooAgA2AgAgAiACQdgBaikDADcDgAggAiACQeQBaikCADcDwAggAkHQAWooAgAhCUEAIQEgAkHUAWooAgALIQQgAkH4B2oiAyACQYgIaigCADYCACACQdgHaiIFIAJByAhqKQMANwMAIAJB4AdqIgogAkHQCGopAwA3AwAgAkHoB2oiDCACQdgIaigCADYCACACIAIpA4AINwPwByACIAIpA8AINwPQByABDQcgAkHIB2ogAygCADYCACACQagHaiAFKQMANwMAIAJBsAdqIAopAwA3AwAgAkG4B2ogDCgCADYCACACIAIpA/AHNwPAByACIAIpA9AHNwOgByACQcAIaiIBIAJBmARqQTAQogcaIAJByAFqIAEQvANBASEBAn8gAigCyAFBAUYEQCACQbgIaiACQdQBaigCADYCACACIAIpAswBNwOwCEGjmsEAIQVBEQwBCyACQbgIaiACQeABaigCADYCACACQcgIaiACQewBaikCADcDACACQdAIaiACQfQBaikCADcDACACQdgIaiACQfwBaigCADYCACACIAJB2AFqKQMANwOwCCACIAJB5AFqKQIANwPACCACQdABaigCACEFQQAhASACQdQBaigCAAshAyACQagIaiIKIAJBuAhqKAIANgIAIAJBiAhqIgwgAkHICGopAwA3AwAgAkGQCGoiDSACQdAIaikDADcDACACQZgIaiIOIAJB2AhqKAIANgIAIAIgAikDsAg3A6AIIAIgAikDwAg3A4AIIAFFBEAgAkH4BGoiASACQcgHaigCADYCACACQdgEaiIPIAJBqAdqKQMANwMAIAJB4ARqIhAgAkGwB2opAwA3AwAgAkHoBGoiESACQbgHaigCADYCACACQdgFaiISIAJBuAZqKAIANgIAIAIgAikDwAc3A/AEIAIgAikDoAc3A9AEIAIgAikDsAY3A9AFIAJByAVqIhMgAkGoBmooAgA2AgAgAkHABWoiFCACQaAGaikDADcDACACQbgFaiIVIAJBmAZqKQMANwMAIAIgAikDkAY3A7AFIAJBqAVqIhYgAkGIBmooAgA2AgAgAiACKQOABjcDoAUgAkGYBWoiFyACQfgFaigCADYCACACQZAFaiIYIAJB8AVqKQMANwMAIAJBiAVqIhkgAkHoBWopAwA3AwAgAiACKQPgBTcDgAUgAEEMaiALNgIAIABBCGogBjYCACAAQRBqIAIpA9AFNwMAIABBGGogEigCADYCACAAQTxqIAc2AgAgAEE4aiAINgIAIABBHGogAikDsAU3AgAgAEEkaiAVKQMANwIAIABBLGogFCkDADcCACAAQTRqIBMoAgA2AgAgAEFAayACKQOgBTcDACAAQcgAaiAWKAIANgIAIABB5ABqIBcoAgA2AgAgAEHcAGogGCkDADcCACAAQdQAaiAZKQMANwIAIABBzABqIAIpA4AFNwIAIABB7ABqIAQ2AgAgAEHoAGogCTYCACAAQfgAaiABKAIANgIAIABB8ABqIAIpA/AENwMAIABBlAFqIBEoAgA2AgAgAEGMAWogECkDADcCACAAQYQBaiAPKQMANwIAIABB/ABqIAIpA9AENwIAIABBnAFqIAM2AgAgAEGYAWogBTYCACAAQagBaiAKKAIANgIAIABBoAFqIAIpA6AINwIAIABBxAFqIA4oAgA2AgAgAEG8AWogDSkDADcCACAAQbQBaiAMKQMANwIAIABBrAFqIAIpA4AINwIAIABByAFqQQA6AAAgAEHMAWogAkHMBGooAAA2AAAgAEHJAWogAigAyQQ2AAAgAEEANgIADAkLIABCgYCAgCA3AwAgAEEMaiADNgIAIABBCGogBTYCACAAQRBqIAIpA6AINwIAIABBGGogCigCADYCAAwICyAAQoGAgIAwNwMADAcLIAIgAToAyAEgAiAaQjiIPADPASACIBpCKIg9AM0BIAIgGkIIiD4AyQFBi5jBAEErIAJByAFqQbiYwQBBsJnBABC9BQALIAIgAToAyAEgAiAaQjiIPADPASACIBpCKIg9AM0BIAIgGkIIiD4AyQFBi5jBAEErIAJByAFqQbiYwQBBwJnBABC9BQALIAIgAToAyAEgAiAaQjiIPADPASACIBpCKIg9AM0BIAIgGkIIiD4AyQFBi5jBAEErIAJByAFqQbiYwQBB0JnBABC9BQALIAIgAToAyAEgAiAaQjiIPADPASACIBpCKIg9AM0BIAIgGkIIiD4AyQFBi5jBAEErIAJByAFqQbiYwQBB4JnBABC9BQALIABCgYCAgCA3AwAgAEEMaiALNgIAIABBCGogBjYCACAAQRBqIAIpA+AGNwIAIABBGGogBygCADYCAAwCCyAAQoGAgIAgNwMAIABBDGogBzYCACAAQQhqIAg2AgAgAEEQaiACKQOQBzcCACAAQRhqIAQoAgA2AgAMAQsgAEKBgICAIDcDACAAQQxqIAQ2AgAgAEEIaiAJNgIAIABBEGogAikD8Ac3AgAgAEEYaiADKAIANgIACyACQaAJaiQAC+MaAhJ/AX4jAEEwayILJAAgC0EoaiESIAAoAgghEyAAKAIEIQwgACgCACENAkACQAJAAkADQCAQIBNGDQMgECEKIA0hBwJAAkACQAJAAkACQCAMRQ0AIAcgDGohDSAKQQFqIRAgDEF/aiEIQQAhAANAAkAgACAHaiIJLAAAIgJBf0oEQCACQf8BcSECDAELQQAhAyANIQYgACAIRwRAIAlBAmohBiAJQQFqLQAAQT9xIQMLIAJBH3EhBCACQf8BcSIFQd8BTQRAIARBBnQgA3IhAgwBCwJ/IAYgDUYEQCANIQJBAAwBCyAGQQFqIQIgBi0AAEE/cQsgA0EGdHIhAyAFQfABSQRAIARBDHQgA3IhAgwBCyACIA1GBH9BAAUgAi0AAEE/cQsgBEESdEGAgPAAcSADQQZ0cnIiAkGAgMQARg0CCwJAIAJBUGpBCk8EQCAMIABrIQIgAARAIAwgAkkNBSAJLAAAQb9/TA0FCyAHIAAQyQMiFEIBg1BFDQUgDCAUQiCIIhSnIgZrIQ4CQCAGQQAgACAORxtFBEAgBiAHaiAAaiENDAELIAIgBk0NByAGIAdqIABqIg0sAABBv39MDQcLIAlBAWohBSABLQAAQQRxQQJ2IAZFIBAgE0dyDQgNAQwICyAAIAhGDQIgCUEBaiwAAEG/f0wNBiAAQQFqIQAMAQsLIAktAABB6ABHDQUgBkEBRg0JIAUiAiwAACIIQUBIBEAgCSAUpyIAQQEgAEGMjMEAEHgACwNAIAJBAWohAwJAAkAgCEEYdEEYdUF/TARAAn8gAyANRgRAIA0hA0EADAELIAJBAmohAyACLQABQT9xCyECIAhBH3EhDyAIQf8BcSIIQd8BSw0BIA9BBnQgAnIhCCADIQIMAgsgCEH/AXEhCCADIQIMAQsCfyADIA1GBEAgDSEMQQAMAQsgA0EBaiEMIAMtAABBP3ELIAJBBnRyIQQgCEHwAUkEQCAPQQx0IARyIQggDCECDAELQQAhA0EAIQggDCANIgJHBEAgDC0AAEE/cSEIIAxBAWohAgsgD0ESdEGAgPAAcSAEQQZ0ciAIciIIQYCAxABGDQwLIAhBUGpBCk8EQEGpfyEDIAhBn39qQRpPBEBBSSEDIAhBv39qQRlLDQgLIAMgCGpBD0sNBwsgAiANRg0KIAItAAAhCAwACwALQaiJwQBBK0GcjMEAEIAHAAsgByAMQQAgAEG8jMEAEHgACyALIBRCCIg8ABBB04nBAEErIAtBEGpBgIrBAEHMjMEAEL0FAAsgCSACIBSnIAJB3IzBABB4AAsgCSAMIABrIgBBASAAQayMwQAQeAALIAoEQCABKAIYQeyMwQBBAiABQRxqKAIAKAIMEQEADQMLAkAgBkECSQ0AQe6MwQAgB2sgAEcEQCAJLwAAQd/IAEcNAQsgBSwAAEG/f0wNAiAGQX9qIQYgCUEBaiEJCyAOIABrIQwDQCAJIQcCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAGIgQEQCAHLQAAQS5GDQ0gBy0AAEEkRg0BCyAEIAdqIQZBACEFIAchAANAIAUhCiAAIAZGDQsgAEEBaiEJAkACQCAALAAAIgVBf0wEQAJ/IAYgCUYEQEEAIQMgBgwBCyAALQABQT9xIQMgAEECaiIJCyECIAVBH3EhDiAFQf8BcSIIQd8BSw0BIA5BBnQgA3IhAgwCCyAFQf8BcSECDAELAn8gAiAGRgRAQQAhBSAGDAELIAItAABBP3EhBSACQQFqIgkLIQIgA0EGdCAFciEDIAhB8AFJBEAgDkEMdCADciECDAELIAIgBkYEf0EABSACQQFqIQkgAi0AAEE/cQsgDkESdEGAgPAAcSADQQZ0cnIiAkGAgMQARg0MCyACQSRHBEAgCiAAayAJaiEFIAkhACACQS5HDQELCyAKRSAEIApGcg0BIAQgCksEQCAHIApqIgAsAABBv39KDQMLIAcgBEEAIApBjI7BABB4AAsgBEEBRwRAIAcsAAFBv39MDQQLIAtBJDYCKCALQqSAgIAQNwMgQQAhBSALQQA2AhggCyAEQX9qIgA2AhwgCyAANgIUQQEhAyALIAdBAWoiAjYCECACIQkgACEGA0AgBSAJaiEIIAMgC2pBJ2otAAAhCgJAAkACQCAAQQdNBEAgAEUNASAGIAVrIQlBACEAA0AgACAIai0AACAKRg0EIAkgAEEBaiIARw0ACwwBCyALQQhqIAogCCAAEJMCIAsoAghBAUYNASALKAIcIQYLIAsgBjYCGAwMCyALKAIMIQAgCygCJCEDIAsoAhghBQsgCyAAIAVqQQFqIgU2AhgCQAJAIAUgA0kEQCALKAIUIQAMAQsgCygCFCIAIAVJDQAgA0EFTw0HIAUgA2siCiALKAIQaiIGIBJGDQEgBiASIAMQ1gZFDQELIAsoAhwiBiAFSSAAIAZJcg0LIAYgBWshACALKAIQIQkMAQsLIApBf0cEQCAKQQFqIQACQCAEDgIJCAALIAIsAABBv39KDQcMCAtB1KnCAEEqQcSNwQAQgAcACyABKAIYIAcgCiABQRxqKAIAKAIMEQEARQ0BDA4LIAEoAhggByAKIAFBHGooAgAoAgwRAQANDSAALAAAQb9/TA0DCyAHIApqIQkgBCAKayEGDAkLIAcgBEEBIARBtI3BABB4AAsgA0EEQeCKwQAQ6gUACyAHIAQgCiAEQZyOwQAQeAALIAAgBEcEQCAAIARPDQEgACAHaiwAAEG/f0wNAQsgCkECaiIARSAAIARGcg0BIAQgAEsEQCAAIAdqLAAAQb9/Sg0CCyAHIAQgACAEQdSNwQAQeAALIAcgBEEBIABBxI3BABB4AAsgBCAAayEGIAAgB2ohCQJAAkACQAJAAkACQCAKDgMGAQADC0HmjcEAIQAgAkHkjcEARg0BIAIvAABB06ABRg0BQemNwQAhACACQeeNwQBGDQEgAi8AAEHCoAFGDQFB7I3BACEAIAJB6o3BAEYNASACLwAAQdKMAUYNAUHvjcEAIQAgAkHtjcEARg0BIAIvAABBzKgBRg0BQfKNwQAhACACQfCNwQBGDQEgAi8AAEHHqAFGDQFB9Y3BACEAIAJB843BAEYNASACLwAAQcygAUYNAUH4jcEAIQAgAkH2jcEARg0BIAIvAABB0qABRg0BIAItAABB9QBGDQMMBQtB+o3BACEAIAJB+Y3BAEYNACACLQAAIgJBwwBGDQAgAkH1AEYNAwwEC0EBIQMgASgCGCAAQQEgAUEcaigCACgCDBEBAEUNBgwLCyACLQAAQfUARw0CIApBAUYNAQsgBywAAkG/f0wNAgsgCkF/aiIOIAdBAmoiCGohAyAIIQACQANAIAAgA0YEQEEAIQUMAgsgAEEBaiEFAkAgACwAACICQX9KBEAgAkH/AXEhAiAFIQAMAQsCfyADIAVGBEAgAyEFQQAMAQsgAEECaiEFIAAtAAFBP3ELIQAgAkEfcSERIAJB/wFxIgJB3wFNBEAgEUEGdCAAciECIAUhAAwBCwJ/IAMgBUYEQCADIQpBAAwBCyAFQQFqIQogBS0AAEE/cQsgAEEGdHIhDyACQfABSQRAIBFBDHQgD3IhAiAKIQAMAQtBACEFQQAhAiAKIAMiAEcEQCAKLQAAQT9xIQIgCkEBaiEACyARQRJ0QYCA8ABxIA9BBnRyIAJyIgJBgIDEAEYNAgsgAkFQakEKSSACQZ9/akEGSXINAAtBASEFCyAIIA4Q3AEiFKdBAXENAEGAgMQAQYCAxAAgFEIgiKciACAAQYBwcUGAsANGGyAAQf//wwBLGyIAQYCAxABGIAVyDQAgCyAANgIQIABBgX9qQSFJQQEgAEEgTxsNACALQRBqIAEQqgJFDQMMBgsgASgCGCAHIAQgAUEcaigCACgCDBEBAEUNAwwFCyACIApBASAKQfyNwQAQeAALIAdBAWohCQJAIARBAUcEQCAJLAAAIgNBv39KBEACfyADQf8BcSADQX9KDQAaQQAhCCAEIAdqIgAhAiAEQQJHBEAgBy0AAkE/cSEIIAdBA2ohAgsgA0EfcSIGQQZ0IAhyIANB/wFxIgVB3wFNDQAaAn8gACACRgRAIAAhA0EADAELIAJBAWohAyACLQAAQT9xCyAIQQZ0ciICIAZBDHRyIAVB8AFJDQAaIAAgA0YEf0EABSADLQAAQT9xCyAGQRJ0QYCA8ABxIAJBBnRycgtBLkcEQEEBIQMgASgCGEGQjcEAQQEgAUEcaigCACgCDBEBAA0JIARBf2ohBiAJLAAAQb9/Sg0EIAcgBEEBIARBlI3BABB4AAsgASgCGEHsjMEAQQIgAUEcaigCACgCDBEBAA0GIAdBAmohCSAEQQJHBEAgCSwAAEG/f0wNAwsgBEF+aiEGDAMLIAcgBEEBIARBgI3BABB4AAtBACEGQQEhAyABKAIYQZCNwQBBASABQRxqKAIAKAIMEQEARQ0BDAYLCwsgByAEQQIgBEGkjcEAEHgACyAJIBSnIgBBASAAQfCMwQAQeAALQQEhAwwBC0EAIQMLIAtBMGokACADC50XAg1/IX4jAEGgBmsiBSQAIAFBkAFqIQ8CQAJAAkAgAUGYAWooAgAiBiAERgRAIAVBqARqIAQQrwUgBUEANgK4BCAFIAUpA6gENwOwBCAFQaAEaiIGIAEoApgBNgIEIAZBADYCACAFKAKgBCIIIAUoAqQEIhBJBEAgCCAEIAggBEsbIQ0gBUGIBWohCyAFQeAEaiEOA0AgBUHYBGogAkEYaikDADcDACAFQdAEaiACQRBqKQMANwMAIAVByARqIAJBCGopAwA3AwAgBSACKQMANwPABCAIIA1GDQQgBUGIAmogCEEFdCIMIANqIgYpAwAiEiAFKQPABCITELUFIAVBmAJqIAYpAwgiFSATELUFIAVBqAJqIAYpAxAiFCATELUFIAVBuAJqIAYpAxgiFiATELUFIAVByAJqIAUpA8gEIhMgEhC1BSAFQdgCaiATIBUQtQUgBUHoAmogEyAUELUFIAVB+AJqIBMgFhC1BSAFQYgDaiAFKQPQBCITIBIQtQUgBUGYA2ogEyAVELUFIAVBqANqIBMgFBC1BSAFQbgDaiATIBYQtQUgBUHIA2ogBSkD2AQiEyASELUFIAVB2ANqIBMgFRC1BSAFQegDaiATIBQQtQUgBUH4A2ogEyAWELUFIAVB+AFqIAUpA4gCIhRC/////29+IhJCgYCAgHAQtQUgBUHoAWogEkL+t/n/r4Dp3tMAELUFIAVBmAFqIBJChbCHzYCB9pwzELUFIAVByABqIBJCyPr1zLLq6fbzABC1BSAFQdgBaiAFKQPIAiIXIAUpA5gCIhYgBUGQAmopAwB8Ihh8IhMgBSkD6AF8IhUgBUGAAmopAwAgBSkD+AEiEiAUfCASVK18fCIUQv////9vfiISQoGAgIBwELUFIAVByAFqIBJC/rf5/6+A6d7TABC1BSAFQbgBaiASQoWwh82AgfacMxC1BSAFQagBaiASQsj69cyy6un28wAQtQUgBUGIAWogFCAVVK0gBUHwAWopAwAgFSATVK18fCIZIAUpA5gBfCIVIAVBoAJqKQMAIBggFlStfCIbIAUpA6gCfCIWIAUpA9gCfCIYIAVB0AJqKQMAIBMgF1StfHwiEyAFKQOIA3wiHHwiFyAFKQPIAXwiGiAFQeABaikDACAFKQPYASISIBR8IBJUrXx8IhRC/////29+IhJCgYCAgHAQtQUgBUH4AGogEkL+t/n/r4Dp3tMAELUFIAVB6ABqIBJChbCHzYCB9pwzELUFIAVB2ABqIBJCyPr1zLLq6fbzABC1BSAFQThqIBcgFVStIAVBoAFqKQMAIBUgGVStfHwiHSAFKQNIfCIVIAVBsAJqKQMAIBYgG1StfCIeIAUpA7gCfCIZIAUpA+gCfCIbIBMgGFStIAVB4AJqKQMAIBggFlStfHx8IhYgBSkDmAN8IhggBUGQA2opAwAgHCATVK18fCITIAUpA8gDfCIffCIgIBQgGlStIAVB0AFqKQMAIBogF1StfHwiISAFKQO4AXwiF3wiGiAFKQN4fCIcIAVBkAFqKQMAIAUpA4gBIhIgFHwgElStfHwiFEL/////b34iEkKBgICAcBC1BSAFQShqIBJC/rf5/6+A6d7TABC1BSAFQRhqIBJChbCHzYCB9pwzELUFIAVBCGogEkLI+vXMsurp9vMAELUFIAVBsAFqKQMAISIgBUHgA2opAwAhIyAFQbADaikDACEkIAVBgANqKQMAISUgBSkDuAMhJiAFKQPoAyEnIAUpA1ghKCAFQeAAaikDACEpIAVB8ABqKQMAISogBUHwA2opAwAhKyAFQcADaikDACEsIAUpA/gDIS0gBSkDCCEuIAVBEGopAwAhLyAFKQMYITAgBUEgaikDACExIAUgBSkDKCIyIBogF1StIAVBwAFqKQMAIBcgIVStfHwiISAFKQOoAXwiEiAFQcACaikDACAZIB5UrXwiHiAFKQP4AnwiFyAWIBtUrSAFQfACaikDACAbIBlUrXx8fCIZIAUpA6gDfCIbIBMgGFStIAVBoANqKQMAIBggFlStfHx8IhYgBSkD2AN8IhggBUHQA2opAwAgHyATVK18fCITICAgFVStIAVB0ABqKQMAIBUgHVStfHx8Ih98IhUgBSkDaHwiHSAUIBxUrSAFQYABaikDACAcIBpUrXx8fCIcfCIaIAVBQGspAwAgFCAFKQM4IhR8IBRUrXx8IiA3A8AEIAUgHyATVK0iHyAZIBdUrSAXIB5UrSAlfHwiHiAmfCIUIBYgG1StIBsgGVStICR8fHwiFyAnfCIZIBMgGFStIBggFlStICN8fHwiG3wiEyAVIBJUrSASICFUrSAifHx8IhIgKHwiFiAcIB1UrSAdIBVUrSAqfHx8IhUgMHwiGCAgIBpUrSAFQTBqKQMAIBogMlStfHx8Iho3A8gEIAUgEyAfVK0gEiATVK18IhwgFyAUVK0gFCAeVK0gLHx8Ih0gLXwiEyAbIBlUrSAZIBdUrSArfHx8Ihd8IhQgFSAWVK0gFiASVK0gKXx8fCISIC58IhYgGiAYVK0gGCAVVK0gMXx8fCIVNwPQBCAFIBQgHFStIBIgFFStfCAXIBNUrSAFQYAEaikDACATIB1UrXx8fCAVIBZUrSAWIBJUrSAvfHx8NwPYBCAFQZgEaiIGIA42AgQgBiAFQcAEajYCACAFKAKcBCEHIAUoApgEIQkgBUGQBGoiBkH438AANgIEIAZB2N/AADYCACAFKAKQBCEGIAVBiARqIgogBSgClAQ2AgQgCiAGNgIAIAUoAogEIQogBSgCjAQhESAFQYAFaiIGQgA3AhAgBiAKNgIIIAYgBzYCBCAGIAk2AgAgBkEMaiARNgIAIAVB4ARqIAYQ4QcgBSgC7AQhByAFKALoBCEJIAUoAuQEIQYgBSgC4AQhCgJAA0AgBiAKR0EAIAcgCUcbBEAgBkF4aiIGKQMAIhIgB0F4aiIHKQMAIhNUDQIgEiATWA0BCwsgBUH438AANgIEIAVB2N/AADYCACAFQYAFaiIGIAVBwARqIA4gBSgCACAFKAIEEN0GIAVB4ARqIAYQ4QcgBUGQBWogBUHwBGopAwAiEjcDACALIAVB6ARqKQMANwMAIAUgBSkD4AQ3A4AFIBKnIgYgBSgClAVJBEBCACESA0AgBSAGQQFqNgKQBSAFQYAFaigCACAGQQN0aiIHKQMAIhUgCygCACAGQQN0aikDACIUfSETIAcgEyASfTcDACAVIBRUrSATIBJUrXxCAVGtIRIgBSgCkAUiBiAFKAKUBUkNAAsLCyABKAKkASIGIAhNDQUgBUHoBGoiByABKAKcASAMaiIGQQhqKQMANwMAIAVB8ARqIgwgBkEQaikDADcDACAFQfgEaiIJIAZBGGopAwA3AwAgBSAGKQMANwPgBCAFQeAEaiAFQcAEahCnASAFQZgFaiIKIAkpAwA3AwAgBUGQBWoiCSAMKQMANwMAIAsgBykDADcDACAFIAUpA+AENwOABSAFKAK4BCIGIAUoArQERgRAIAVBsARqIAZBARD/BSAFKAK4BCEGCyAFKAKwBCAGQQV0aiIHIAUpA4AFNwMAIAdBCGogCykDADcDACAHQRBqIAkpAwA3AwAgB0EYaiAKKQMANwMAIAUgBkEBajYCuAQgECAIQQFqIghHDQALCyAFQYAFaiICIAFBkAEQogcaIAVBmAZqIAVBuARqKAIANgIAIAUgBSkDsAQ3A5AGIABBCGogAkGgARCiBxogAEEANgIADAELIAVBgAVqEPkCIABBFGpBADYCACAAQQxqIAQ2AgAgAEEIaiAGNgIAIABCATcDACAAQRhqIAUpAoAFNwIAIABBIGogBUGIBWopAgA3AgAgAEEoaiAFQZAFaigCADYCAAsgDxDlByABQZwBahDiByAFQaAGaiQADwsgDSAEQbDhwAAQ6QUACyAIIAZBwOHAABDpBQALiRcCB38BfiMAQeAcayIFJAAgBUHYAWogAhC3BSAFQegTaiIGIAVB4AFqKQMANwMAIAVBqBhqIgcgBUH0AWopAgA3AwAgBUGwGGoiCCAFQfwBaigCADYCACAFIAUpA9gBNwPgEyAFIAUpAuwBNwOgGAJAAkAgBSgC6AEiCUECRgRAIAVB4BNqIAMQugMgBUG4GGogBUH4E2ooAgA2AgAgCCAFQfATaikDADcDACAHIAYpAwA3AwAgBSAFKQPgEzcDoBggBUFAayAFQaAYahCbBiAFKAJAIgdFDQEgAkG4A2ooAgAhBiAFIAc2AkggBygCACAGSQRAA0AgBUE4aiAFQaAYahCbBiAFKAI4IgdFDQMgAigCuAMhBiAFIAc2AkggBygCACAGSQ0ACwsgBSAGNgLQDCAFQTBqIgFBmQE2AgQgASAFQcgAajYCACAFKQMwIQwgBUEoaiIBQbgBNgIEIAEgBUHQDGo2AgAgBUHsAWpBAjYCACAFIAw3A6AGIAVCAjcC3AEgBUGU1cAANgLYASAFIAUpAyg3A6gGIAUgBUGgBmo2AugBIAVB+A9qIAVB2AFqIgEQmAIgBUEIOgDAESAFQcwRaiAFQYAQaigCADYCACAFIAUpA/gPNwLEESABIAVBwBFqEOoEIABBBGogAUEoEKIHGiAAQQE6AAAMAgsgAEEBOgAAIABBBGogBSkD4BM3AgAgAEEUaiAJNgIAIABBGGogBSkDoBg3AgAgAEEMaiAGKQMANwIAIABBIGogBykDADcCACAAQShqIAgoAgA2AgAMAQsCQAJAAkACQAJAAkACQCABEJYHRQRAIAVByABqIgYgAUGQAWoiCUGQARCiBxogBhCkAyAFQdgLaiIHIAEQiAggBUHwCmoiCCAHEMwIIAVB0AxqIgcgAkGQAWoQhwggBUHADGoiCiAHENkHIAVBgA9qIgcgBhCICCAFQZgOaiIGIAcQzAggBUHAEWoiBxDSAyAFQfgPaiILIAcQhwggBUHoD2oiByALENkHIAVB7ApqIAc2AgAgBSAGNgLoCiAFIAo2AuQKIAUgCDYC4AogBUGgBmoiBiAFQeAKahCzASAFQdgBaiAGEKUBIAUpA9gBQgFRBEAgBUHgE2oiBiAFQeABakHABBCiBxogBUGgGGoiBxD3ByAGIAcQnQhFDQcgBUGQFGogBUHQGGoQnQhFDQcgBUHAFGogBUGAGWoQnQhFDQcgBUHwFGogBUGwGWoQnQhFDQcgBUGgFWogBUHgGWoQnQhFDQcgBUHQFWogBUGQGmoQnQhFDQcgBUGAFmogBUHAGmoQnQhFDQcgBUGwFmogBUHwGmoQnQhFDQcgBUHgFmogBUGgG2oQnQhFDQcgBUGQF2ogBUHQG2oQnQhFDQcgBUHAF2ogBUGAHGoQnQhFDQcgBUHwF2ogBUGwHGoQnQhFDQcgBUHoD2oQ6QcgBUHADGoQ6QcgBUEANgLYDCAFQgg3A9AMIAVB2AFqIgggAUGQARCiBxogBUHQDGpBAEEBEIAGIAUoAtAMIgcgBSgC2AwiBkGQAWxqIAhBkAEQogcaIAUgBkEBaiIGNgLYDCAIIAJBkAEQogcaIAUoAtQMIAZGBEAgBUHQDGogBkEBEIAGIAUoAtAMIQcgBSgC2AwhBgsgBkGQAWwgB2ogBUHYAWoiB0GQARCiBxogBSAGQQFqNgLYDCAFQaAYaiIGIAlBkAEQogcaIAcgAUGgAmoiCUGQARCiBxogBxCkAyAGIAcQRyAFKALQDCEIIAUoAtgMIQogByAGQZABEKIHGiAFQeATaiIGIAFBsANqIAggCiAHIAQQnAQgBS0A4RMhByAFLQDgEyAFQaAGaiAGQQJyQSoQogcaQQFHBEAgB0UNB0EAIQcgBUEgaiACQbgDaigCACADKAIIa0ECahCgBSAFQQA2AoAQIAUgBSgCJCIGNgL8DyAFIAUoAiAiCDYC+A8gBUHYAWogCUGQARCiBxogBkUEQCAFQfgPakEAQQEQgAYgBSgCgBAhByAFKAL4DyEIIAUoAvwPIQYLIAdBkAFsIAhqIAVB2AFqIglBkAEQogcaIAUgB0EBaiIHNgKAECAJIAJBkAEQogcaIAYgB0YEQCAFQfgPaiAGQQEQgAYgBSgC+A8hCCAFKAKAECEHCyAHQZABbCAIaiAFQdgBaiIGQZABEKIHGiAFIAdBAWo2AoAQIAVBGGogAygCCEEBahCgBSAFQQA2AsgRIAUgBSkDGDcDwBEgBUEQaiADKAIIQQFqEK8FIAVBADYCqAYgBSAFKQMQNwOgBiAGEOYFIAUoAsgRIAUoAsQRRgRAIAVBwBFqQQEQyQgLIAVBwBFqKAIAIAUoAsgRIgZBkAFsaiAFQdgBaiIHQZABEKIHGiAFIAZBAWo2AsgRIAVB4BNqIgZCADcDACAGQRhqQgA3AwAgBkEQakIANwMAIAZBCGpCADcDACAFQgE3A+ATIAcgBhCzAiAFKALYAUEBRg0DIAVB+BNqIgggBUH4AWopAwA3AwAgBUHwE2oiCSAFQfABaikDADcDACAFQegTaiIKIAVB6AFqKQMANwMAIAUgBUHgAWopAwA3A+ATIAUoAqgGIgcgBSgCpAZGBEAgBUGgBmogB0EBEP8FIAUoAqgGIQcLIAUoAqAGIAdBBXRqIgYgBSkD4BM3AwAgBkEIaiAKKQMANwMAIAZBEGogCSkDADcDACAGQRhqIAgpAwA3AwAgBSAHQQFqNgKoBiAFQQhqIgYgAigCuAM2AgQgBkEANgIAIAUoAggiByAFKAIMIglJBEADQCAFIAc2AuATAkAgAyAFQeATahCZBkUEQCACKAK4AyIIIAUoAuATIgZNDQggBUHYAWogAigCsAMgBkGQAWxqQZABEKIHGiAFKAKAECIGIAUoAvwPRgRAIAVB+A9qIAZBARCABiAFKAKAECEGCyAFKAL4DyAGQZABbGogBUHYAWpBkAEQogcaIAUgBkEBajYCgBAMAQsgAyAFQeATahCZBiIIRQ0IIAIoArgDIgogBSgC4BMiBk0NCSAFQdgBaiACKAKwAyAGQZABbGpBkAEQogcaIAUoAsgRIAUoAsQRRgRAIAVBwBFqQQEQyQgLIAVBwBFqKAIAIAUoAsgRIgZBkAFsaiAFQdgBaiIKQZABEKIHGiAFIAZBAWo2AsgRIAogCBCNByAFKAKoBiIGIAUoAqQGRgRAIAVBoAZqIAZBARD/BSAFKAKoBiEGCyAFKAKgBiAGQQV0aiIIIAUpA9gBNwMAIAhBCGogBUHgAWopAwA3AwAgCEEQaiAFQegBaikDADcDACAIQRhqIAVB8AFqKQMANwMAIAUgBkEBajYCqAYLIAkgB0EBaiIHRw0ACwsgBUHYAWoiAiAFQcARaiAFQaAGahDCBCACEKQDIAVB4BNqIAFB0ARqIAUoAvgPIAUoAoAQIAIgBBCcBAJAIAUtAOATIgFBAUYEQCAAQQM6AAEMAQsgBS0A4RNFBEAgAEEDOgABDAELIABBADoAAQsgAEEAOgAAIAVBoAZqEOIHIAVBwBFqEOUHIAVB+A9qEOUHIAVB0AxqEOUHIAFFDQogBSgC5BMEQCAFQegTahCiCAsgBUH0E2oQigUMCgsgBUHgE2oiASAFQaIGakEoEKIHGiAFQcARaiICIAEQxgIgAEEEaiACQSgQogcaIABBAToAAAwICwwGCyAAQYACOwEADAcLIAVB6BNqIAVB5AFqKAIANgIAIAUgBSkC3AE3A+ATQYvPwABBKyAFQeATakG4z8AAQaTVwAAQvQUACyAGIAhB1NXAABDpBQALQeDOwABBK0G01cAAEIAHAAsgBiAKQcTVwAAQ6QUACyAAQYAEOwEADAELIABBgAI7AQAgBUHoD2oQ6QcgBUHADGoQ6QcMAQsgBUHQDGoQ5QcLIAVB4BxqJAALlBIBB38jAEHQBWsiAyQAIAAgAUEwEKIHIgIQQSADIAJBMBCiByIDIAEQOSADQTBqIgAgAkEwEKIHGiAAEEEgA0HgAGoiByADQTAQogcaIAcgAhA5IANBkAFqIgUgAEEwEKIHGiAFIAMQOSADQcABaiIEIAdBMBCiBxogBCAAEDkgA0HwAWoiBiAFQTAQogcaIAYgABA5IANBoAJqIgUgBEEwEKIHGiAFIAAQOSADQdACaiIEIAZBMBCiBxogBCAAEDkgA0GAA2oiBiAFQTAQogcaIAYgABA5IANBsANqIgggBEEwEKIHGiAIIAAQOSADQeADaiIEIAZBMBCiBxogBCAAEDkgA0GQBGoiBCAIQTAQogcaIAQgABA5IAIgBUEwEKIHIgIQQSADQcAEaiIFIARBMBCiBxogBSAAEDkgA0HwBGoiACACQTAQogcaIAAgAxA5IANBoAVqIgAgAkEwEKIHGiAAIAcQOUEMIQADQCACEEEgAEF/aiIADQALIAIgA0GAA2oQOUEHIQADQCACEEEgAEF/aiIADQALIAIgA0HQAmoQOUEEIQADQCACEEEgAEF/aiIADQALIAIgA0HgAGoQOUEGIQADQCACEEEgAEF/aiIADQALIAIgA0GQAWoQOUEHIQADQCACEEEgAEF/aiIADQALIAIgA0GQBGoQOUEFIQADQCACEEEgAEF/aiIADQALIAIgA0GgBWoQOUECIQADQCACEEEgAEF/aiIADQALIAIgAxA5QQYhAANAIAIQQSAAQX9qIgANAAsgAiADQaACahA5QQYhAANAIAIQQSAAQX9qIgANAAsgAiADQaACahA5QQYhAANAIAIQQSAAQX9qIgANAAsgAiADQcABahA5QQMhAANAIAIQQSAAQX9qIgANAAsgAiADEDlBByEAA0AgAhBBIABBf2oiAA0ACyACIANBoAJqEDlBBCEAA0AgAhBBIABBf2oiAA0ACyACIANBoAJqEDlBBiEAA0AgAhBBIABBf2oiAA0ACyACIANB0AJqEDlBBiEAA0AgAhBBIABBf2oiAA0ACyACIANBwARqEDlBAyEAA0AgAhBBIABBf2oiAA0ACyACIAEQOUEIIQADQCACEEEgAEF/aiIADQALIAIgA0GgAmoQOUEHIQADQCACEEEgAEF/aiIADQALIAIgA0GQBGoQOUEFIQADQCACEEEgAEF/aiIADQALIAIgA0HwAWoQOUEGIQADQCACEEEgAEF/aiIADQALIAIgA0GgAmoQOUEGIQADQCACEEEgAEF/aiIADQALIAIgA0HwBGoQOUEEIQADQCACEEEgAEF/aiIADQALIAIgA0HAAWoQOUEIIQADQCACEEEgAEF/aiIADQALIAIgA0HwBGoQOUEEIQADQCACEEEgAEF/aiIADQALIAIgA0GgAmoQOUEHIQADQCACEEEgAEF/aiIADQALIAIgA0GQBGoQOUEJIQADQCACEEEgAEF/aiIADQALIAIgA0GwA2oQOUECIQADQCACEEEgAEF/aiIADQALIAIgAxA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQZABahA5QQchAANAIAIQQSAAQX9qIgANAAsgAiADQeAAahA5QQchAANAIAIQQSAAQX9qIgANAAsgAiADQcABahA5QQYhAANAIAIQQSAAQX9qIgANAAsgAiADQZAEahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQfAEahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQbADahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQbADahA5QQghAANAIAIQQSAAQX9qIgANAAsgAiADQaACahA5QQchAANAIAIQQSAAQX9qIgANAAsgAiADQeADahA5QQkhAANAIAIQQSAAQX9qIgANAAsgAiADQdACahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaACahA5QQMhAANAIAIQQSAAQX9qIgANAAsgAiADEDlBCCEAA0AgAhBBIABBf2oiAA0ACyACIANB0AJqEDlBAyEAA0AgAhBBIABBf2oiAA0ACyACIAMQOUEHIQADQCACEEEgAEF/aiIADQALIAIgA0HAAWoQOUEJIQADQCACEEEgAEF/aiIADQALIAIgA0HQAmoQOUEGIQADQCACEEEgAEF/aiIADQALIAIgA0HgA2oQOUEGIQADQCACEEEgAEF/aiIADQALIAIgA0GgBWoQOUEFIQADQCACEEEgAEF/aiIADQALIAIgA0GgBWoQOUEFIQADQCACEEEgAEF/aiIADQALIAIgA0GgBWoQOUEEIQADQCACEEEgAEF/aiIADQALIAIgA0GgAmoQOUEDIQADQCACEEEgAEF/aiIADQALIAIgAxA5QQghAANAIAIQQSAAQX9qIgANAAsgAiADQeADahA5QQchAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQQhAANAIAIQQSAAQX9qIgANAAsgAiADQdACahA5QQQhAANAIAIQQSAAQX9qIgANAAsgAiADQZABahA5QQchAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQfAEahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQUhAANAIAIQQSAAQX9qIgANAAsgAiADQaAFahA5QQQhAANAIAIQQSAAQX9qIgANAAsgAiADQaACahA5QQYhAANAIAIQQSAAQX9qIgANAAsgAiADQeADahA5QQQhAANAIAIQQSAAQX9qIgANAAsgAiADQeAAahA5IAIQQSADQdAFaiQAC7wSAgJ/Fn4jAEHwBGsiAiQAIAJBwARqIAFBMBCiBxogAkGwBGogASkDACIEQv3/8//P///5iX9+IgVCq9X+////v/+5fxC1BSACQaAEaiAFQv//z4rr///VHhC1BSACQZAEaiAFQqTsw7WP1LSY5wAQtQUgAkGABGogBUK/pZScz/DSu+QAELUFIAJB8ANqIAVC19mumuT26Y3LABC1BSACQeADaiAFQprN/8ujvcSAGhC1BSACQdADaiACKQOgBCIFIAEpAwh8IgcgAkG4BGopAwAgBCACKQOwBCIEfCAEVK18fCIEQv3/8//P///5iX9+IgZCq9X+////v/+5fxC1BSACQcADaiAGQv//z4rr///VHhC1BSACQdACaiAGQqTsw7WP1LSY5wAQtQUgAkHgAWogBkK/pZScz/DSu+QAELUFIAJB8ABqIAZC19mumuT26Y3LABC1BSACIAZCms3/y6O9xIAaELUFIAJBsANqIAIpA8ADIg0gAikDkAQiBiABKQMQfCIIIAQgB1StIAJBqARqKQMAIAcgBVStfHx8IgV8IgsgAkHYA2opAwAgBCACKQPQAyIEfCAEVK18fCIEQv3/8//P///5iX9+IgdCq9X+////v/+5fxC1BSACQaADaiAHQv//z4rr///VHhC1BSACQZADaiAHQqTsw7WP1LSY5wAQtQUgAkGAA2ogB0K/pZScz/DSu+QAELUFIAJB8AJqIAdC19mumuT26Y3LABC1BSACQeACaiAHQprN/8ujvcSAGhC1BSACQcACaiACKQOgAyIKIAIpA4AEIgcgASkDGHwiDCAFIAhUrSACQZgEaikDACAIIAZUrXx8fCIJIAIpA9ACfCIIIAQgC1StIAJByANqKQMAIAsgDVStfHx8IgV8IhcgAkG4A2opAwAgBCACKQOwAyIEfCAEVK18fCIEQv3/8//P///5iX9+IgZCq9X+////v/+5fxC1BSACQbACaiAGQv//z4rr///VHhC1BSACQaACaiAGQqTsw7WP1LSY5wAQtQUgAkGQAmogBkK/pZScz/DSu+QAELUFIAJBgAJqIAZC19mumuT26Y3LABC1BSACQfABaiAGQprN/8ujvcSAGhC1BSACQdABaiACKQOwAiINIAIpA/ADIgYgASkDIHwiDiAJIAxUrSACQYgEaikDACAMIAdUrXx8fCILIAIpA+ABfCIMIAUgCFStIAJB2AJqKQMAIAggCVStfHx8IgkgAikDkAN8IgggBCAXVK0gAkGoA2opAwAgFyAKVK18fHwiB3wiCiACQcgCaikDACAEIAIpA8ACIgR8IARUrXx8IgRC/f/z/8////mJf34iBUKr1f7///+//7l/ELUFIAJBwAFqIAVC///Piuv//9UeELUFIAJBsAFqIAVCpOzDtY/UtJjnABC1BSACQaABaiAFQr+llJzP8NK75AAQtQUgAkGQAWogBULX2a6a5PbpjcsAELUFIAJBgAFqIAVCms3/y6O9xIAaELUFIAJB4ABqIAIpA8ABIhggAikD4AMiBSABKQMofCIPIAsgDlStIAJB+ANqKQMAIA4gBlStfHx8IhAgAikDcHwiESAJIAxUrSACQegBaikDACAMIAtUrXx8fCISIAIpA4ADfCITIAcgCFStIAJBmANqKQMAIAggCVStfHx8IhQgAikDoAJ8IhUgBCAKVK0gAkG4AmopAwAgCiANVK18fHwiB3wiFiACQdgBaikDACAEIAIpA9ABIgR8IARUrXx8IgRC/f/z/8////mJf34iBkKr1f7///+//7l/ELUFIAJB0ABqIAZC///Piuv//9UeELUFIAJBQGsgBkKk7MO1j9S0mOcAELUFIAJBMGogBkK/pZScz/DSu+QAELUFIAJBIGogBkLX2a6a5PbpjcsAELUFIAJBEGogBkKazf/Lo73EgBoQtQUgAkG4AWopAwAhGSACQZgCaikDACEXIAJB+AJqKQMAIQ4gAkEIaikDACELIAIpA+ACIQwgAikDgAIhCSACKQOgASEIIAIpA0AhCiACQcgAaikDACENIAIgAikDUCIGIBAgD1StIAJB6ANqKQMAIA8gBVStfHwiBSACKQMAfCIPIBIgEVStIAJB+ABqKQMAIBEgEFStfHx8IhAgAikD8AJ8IhEgFCATVK0gAkGIA2opAwAgEyASVK18fHwiEiACKQOQAnwiEyAHIBVUrSACQagCaikDACAVIBRUrXx8fCIUIAIpA7ABfCIVIAQgFlStIAJByAFqKQMAIBYgGFStfHx8Igd8IhYgAkHoAGopAwAgBCACKQNgIgR8IARUrXx8IgQ3A8AEIAIgCiAIIBAgD1StIA8gBVStIAt8fCIFIAx8IhggEiARVK0gESAQVK0gDnx8fCIOIAl8IgkgFCATVK0gEyASVK0gF3x8fCIIfCIKIAcgFVStIBUgFFStIBl8fHwiC3wiDCAEIBZUrSACQdgAaikDACAWIAZUrXx8fCIENwPIBCACIA4gGFStIAJB6AJqKQMAIBggBVStfHwiBSACKQPwAXwiByAIIAlUrSACQYgCaikDACAJIA5UrXx8fCIJIAIpA5ABfCIGIAsgClStIAJBqAFqKQMAIAogCFStfHx8IgggAikDMHwiCiAEIAxUrSAMIAtUrSANfHx8IgQ3A9AEIAIgCSAHVK0gAkH4AWopAwAgByAFVK18fCIFIAIpA4ABfCIHIAggBlStIAJBmAFqKQMAIAYgCVStfHx8Ig0gAikDIHwiBiAEIApUrSACQThqKQMAIAogCFStfHx8IgQ3A9gEIAIgDSAHVK0gAkGIAWopAwAgByAFVK18fCIFIAIpAxB8IgcgBCAGVK0gAkEoaikDACAGIA1UrXx8fCIENwPgBCACIAQgB1StIAJBGGopAwAgByAFVK18fDcD6ARBKCEBAkADQCABQXhHBEAgAkHABGogAWopAwAiBSABQbDbwQBqKQMAIgRUDQIgAUF4aiEBIAUgBFgNAQsLQgAhBkEAIQEDQCACQcAEaiABaiIDKQMAIgUgAUGw28EAaikDACIEfSEHIAMgByAGfTcDACAFIARUrSAHIAZUrXxCAVGtIQYgAUEIaiIBQTBHDQALCyAAIAJBwARqQTAQogcaIAJB8ARqJAAL3xACCH8EfiMAQbAGayIDJAAgA0EwaiIEIAFBMBCiBxogBBBDIANBgANqIgUgBEEwEKIHGiADQaAFaiIEIAVBMBCiBxogBEH4ycEAEDsgA0HQBWogBEEwEKIHGiAEEEMgA0GABmogBEEwEKIHGgNAIANBoAVqIAJqIgQpAwAiDCAKfCIKIANB0AVqIAJqKQMAfCELIAQgCzcDACAKIAxUrSALIApUrXwhCiACQQhqIgJBMEcNAAtBKCECAkADQCACQXhHBEAgA0GgBWogAmopAwAiCiACQcDMwQBqKQMAIgtUDQIgAkF4aiECIAogC1gNAQsLQgAhCkEAIQIDQCADQaAFaiACaiIEKQMAIgwgAkHAzMEAaikDACINfSELIAQgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAkEIaiICQTBHDQALCyADQTBqIgIgA0GgBWpBMBCiBxogA0HgAGogA0HQBWpBMBCiByEEIANBkAFqIANBgAZqQTAQogchBSADQbADaiIGIAJBMBCiBxogA0HgA2ogBEEwEKIHGiADQZAEaiAFQTAQogcaIAIgBkEwEKIHGkIAIQpBACECA0AgA0EwaiACaiIEKQMAIgwgCnwiCiACQZDMwQBqKQMAfCELIAQgCzcDACAKIAxUrSALIApUrXwhCiACQQhqIgJBMEcNAAtBKCECAkADQCACQXhHBEAgA0EwaiACaikDACIKIAJBwMzBAGopAwAiC1QNAiACQXhqIQIgCiALWA0BCwtCACEKQQAhAgNAIANBMGogAmoiBCkDACIMIAJBwMzBAGopAwAiDX0hCyAEIAsgCn03AwAgDCANVK0gCyAKVK18QgFRrSEKIAJBCGoiAkEwRw0ACwsgA0EwaiICQdjKwQAQOyADQcAEaiACQTAQogcaIANBgAZqQajKwQBBMBCiBxpBACECAkACQANAIAJBMEYNASADQbADaiACaiACQQhqIQIpAwBQDQALIANBgAZqIANBsANqEDtBACECA0AgAkEwRg0CIANBgAZqIAJqIAJBCGohAikDAFANAAsgA0EwakHAzMEAQTAQogcaQgAhCkEAIQIDQCADQTBqIAJqIgQpAwAiDCADQYAGaiACaikDACINfSELIAQgCyAKfTcDACAMIA1UrSALIApUrXxCAVGtIQogAkEIaiICQTBHDQALIANBgAZqIANBMGpBMBCiBxoMAQsgA0GABmpB+MnBABA7CyADQfAEaiIEIANBgAZqIgVBMBCiBxogA0EwaiICIARBMBCiBxogAhBDIAIgBBA7IANBoAVqIgYgAkEwEKIHGiAFIAZBMBCiBxogBUHYysEAEDsgAiAEQTAQogcaIAIQQyACIANBwARqEDsgAkGoysEAEDtCACEKQQAhAgNAIANBgAZqIAJqIgQpAwAiDCAKfCIKIANBMGogAmopAwB8IQsgBCALNwMAIAogDFStIAsgClStfCEKIAJBCGoiAkEwRw0AC0EoIQICQANAIAJBeEcEQCADQYAGaiACaikDACIKIAJBwMzBAGopAwAiC1QNAiACQXhqIQIgCiALWA0BCwtCACEKQQAhAgNAIANBgAZqIAJqIgQpAwAiDCACQcDMwQBqKQMAIg19IQsgBCALIAp9NwMAIAwgDVStIAsgClStfEIBUa0hCiACQQhqIgJBMEcNAAsLIANBMGoiAiADQcAEaiIEQTAQogcaIAIQQyACIAQQO0IAIQpBACECA0AgA0GABmogAmoiBCkDACIMIAp8IgogA0EwaiACaikDAHwhCyAEIAs3AwAgCiAMVK0gCyAKVK18IQogAkEIaiICQTBHDQALQSghAgJAA0AgAkF4RwRAIANBgAZqIAJqKQMAIgogAkHAzMEAaikDACILVA0CIAJBeGohAiAKIAtYDQELC0IAIQpBACECA0AgA0GABmogAmoiBCkDACIMIAJBwMzBAGopAwAiDX0hCyAEIAsgCn03AwAgDCANVK0gCyAKVK18QgFRrSEKIAJBCGoiAkEwRw0ACwsgA0HQBWoiBCADQYAGakEwEKIHGiADQTBqIgUgA0GAA2pBMBCiBxogA0HgAGoiAiADQeADakEwEKIHIQkgA0GQAWogA0GQBGpBMBCiBxogA0HAAWogA0HABGpBMBCiByEGIANB8AFqIANB8ARqQTAQogchByADQaACaiAEQTAQogchBCADQdACaiADQaAFakEwEKIHIQggAyAFQTAQogciA0GAA2ogCUEwEKIHGiADQbADaiAGQTAQogcaIANB4ANqIAdBMBCiBxogA0GQBGoiByAEQTAQogcaIANBwARqIgUgCEEwEKIHGiADQdAFaiIGIAdBMBCiBxogBiAFEDsgA0GABmoiBCAFQTAQogcaIAQQQyAEIAYQOyADQTBqIgggBEEwEKIHGiAEIAgQTiAEIAYQOyADQfAEaiIGIARBMBCiBxogA0GgBWoiBCAGQTAQogcaIAQQQyAEIAUQOwJAIAQgB0EwENYGBEAgA0HQBWoiBSADQbADakEwEKIHGiAFIANBgANqEDsgA0GABmoiBCADQTAQogcaIAQgARA7IAQgA0HwBGoQOyAEQYjLwQAQOyADQTBqIAVBMBCiBxogCSAEQTAQogcaDAELIANBMGogA0GwA2pBMBCiBxogA0HgAGoiAiADQfAEakEwEKIHGgsgA0HQBWoiBSADQTBqQTAQogcaIANBgAZqIgQgAkEwEKIHGiAEIAQQ3wUgARDfBXMQmQQgBSADQeADaiIBEDsgBCADQcAEahA7IAAgBUEwEKIHIgBBMGogBEEwEKIHGiAAQeAAaiABQTAQogcaIANBsAZqJAALsBECCH8ZfiMAQdAAayIFJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgASkDACIMUEUEQCABKQMIIg1QDQEgASkDECILUA0CIAsgDHwiCyAMVA0DIAwgDX0iDSAMVg0EIAtC//////////8fVg0HIAUgAS8BGCIBOwEQIAUgDTcDCCABIAFBYGogASALQoCAgIAQVCIEGyIDQXBqIAMgC0IghiALIAQbIgtCgICAgICAwABUIgQbIgNBeGogAyALQhCGIAsgBBsiC0KAgICAgICAgAFUIgQbIgNBfGogAyALQgiGIAsgBBsiC0KAgICAgICAgBBUIgQbIgNBfmogAyALQgSGIAsgBBsiC0KAgICAgICAgMAAVCIEGyALQgKGIAsgBBsiD0I/h6dBf3NqIgRrQRB0QRB1IgNBAEgNBSAFQn8gA61CP4MiEogiCyANgzcDKCANIAtWDQ8gBSABOwEQIAUgDDcDCCAFIAsgDIM3AyggDCALVg0PQaB/IARrQRB0QRB1QdAAbEGwpwVqQc4QbSIBQdEATw0GIAwgEoYiC0IgiCIcIAFBBHQiAUHQkMIAaikDACIOQv////8PgyIMfiIQQiCIIR0gDkIgiCIOIAtC/////w+DIgt+IhFCIIgiIyAOIBx+IB18fCAQQv////8PgyALIAx+QiCIfCARQv////8Pg3xCgICAgAh8QiCIIR5CAUEAIAFB2JDCAGovAQAgBGprQT9xrSIRhiIQQn98IRYgDCANIBKGIg1CIIgiH34hCyANQv////8PgyISIA5+IQ0gC0L/////D4MgDCASfkIgiHwgDUL/////D4N8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BSACQeACaiAAKQMYIgUgBBC1BSACQZADaiAFIAcQtQUgAkHAA2ogBSAGELUFIAJB8ANqIAUgCBC1BSACQfABaiACKQOAAiIGQv////9vfiIEQoGAgIBwELUFIAJB4AFqIARC/rf5/6+A6d7TABC1BSACQZABaiAEQoWwh82AgfacMxC1BSACQUBrIARCyPr1zLLq6fbzABC1BSACQdABaiACKQPAAiIJIAIpA5ACIgggAkGIAmopAwB8Igp8IgUgAikD4AF8IgcgAkH4AWopAwAgAikD8AEiBCAGfCAEVK18fCIGQv////9vfiIEQoGAgIBwELUFIAJBwAFqIARC/rf5/6+A6d7TABC1BSACQbABaiAEQoWwh82AgfacMxC1BSACQaABaiAEQsj69cyy6un28wAQtQUgAkGAAWogBiAHVK0gAkHoAWopAwAgByAFVK18fCILIAIpA5ABfCIHIAJBmAJqKQMAIAogCFStfCINIAIpA6ACfCIIIAIpA/ACfCIKIAJByAJqKQMAIAUgCVStfHwiBSACKQPQAnwiDnwiCSACKQPAAXwiDCACQdgBaikDACACKQPQASIEIAZ8IARUrXx8IgZC/////29+IgRCgYCAgHAQtQUgAkHwAGogBEL+t/n/r4Dp3tMAELUFIAJB4ABqIARChbCHzYCB9pwzELUFIAJB0ABqIARCyPr1zLLq6fbzABC1BSACQTBqIAkgB1StIAJBmAFqKQMAIAcgC1StfHwiDyACKQNAfCIHIAJBqAJqKQMAIAggDVStfCIQIAIpA7ACfCILIAIpA6ADfCINIAUgClStIAJB+AJqKQMAIAogCFStfHx8IgggAikDgAN8IgogAkHYAmopAwAgDiAFVK18fCIFIAIpA+ACfCIRfCISIAYgDFStIAJByAFqKQMAIAwgCVStfHwiEyACKQOwAXwiCXwiDCACKQNwfCIOIAJBiAFqKQMAIAIpA4ABIgQgBnwgBFStfHwiBkL/////b34iBEKBgICAcBC1BSACQSBqIARC/rf5/6+A6d7TABC1BSACQRBqIARChbCHzYCB9pwzELUFIAIgBELI+vXMsurp9vMAELUFIAAgAikDICIUIAwgCVStIAJBuAFqKQMAIAkgE1StfHwiEyACKQOgAXwiBCACQbgCaikDACALIBBUrXwiECACKQPQA3wiCSAI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IgJFDQAgACgCBCAAKAIIIgFNDQAgASACai0AAEH1AEcNACAAIAFBAWo2AgggACAAKAIQIAinazYCEAwBCyAAKAIMIgEoAhhBwYbBAEEEIAFBHGooAgAoAgwRAQANASAAEFQgACAAKAIQIAinazYCEEEAIQENAgwEC0EAIQEMAwsgACAAKAIQIAinazYCEAtBASEBDAELIAAQVCEBCyADQcABaiQAIAELtQ0CBH8EfiMAQaABayIDJAACQAJAA0AgAkEgRg0BIAEgAmogAkEIaiECKQMAUA0ACyADQRhqQgA3AwAgA0EQakIANwMAIANCADcDCCADQgE3AwAgA0E4aiABQRhqKQMANwMAIANBMGogAUEQaikDADcDACADQShqIAFBCGopAwA3AwAgAyABKQMANwMgIANB2ABqQYDiwQApAwA3AwAgA0HQAGpB+OHBACkDADcDACADQcgAakHw4cEAKQMANwMAIANB6OHBACkDADcDQCADQfgAakHg4cEAKQMANwMAIANB8ABqQdjhwQApAwA3AwAgA0HoAGpB0OHBACkDADcDACADQcjhwQApAwA3A2AgA0GYAWpCADcDACADQZABakIANwMAIANBiAFqQgA3AwAgA0IANwOAAQJAIANBIGogA0EgENYGRQ0AIANB4ABqIQEgA0FAayEFA0AgA0FAayADQSAQ1gZFDQEgAy0AIEEBcUUEQEIAIQYgBSECA0AgAkF4aiICKQMAIQcgAiAHQgGIIAaENwMAIAdCP4YhBiADQSBqIAJHDQAgAykDYCIGp0EBcQRAIAMgBkKBgICAcHwiBzcDYCAHIAZUrSEGQQghAgNAIANB4ABqIAJqIgQpAwAiCCAGfCIGIAJB6OHBAGopAwB8IQcgBCAHNwMAIAYgCFStIAcgBlStfCEGIAJBCGoiAkEgRw0ACwtCACEGQRghAgNAIANB4ABqIAJqIgQpAwAhByAEIAdCAYggBoQ3AwAgB0I/hiEGIAJBeGoiAkF4Rw0AC0IAIQYgBSECIAMtACBBAXFFDQALCyADKQNAIgenQQFxRQRAQgAhBiABIQIDQCACQXhqIgIpAwAhByACIAdCAYggBoQ3AwAgB0I/hiEGIANBQGsgAkcNACADKQOAASIGp0EBcQRAIAMgBkKBgICAcHwiBzcDgAEgByAGVK0hBkEIIQIDQCADQYABaiACaiIEKQMAIgggBnwiBiACQejhwQBqKQMAfCEHIAQgBzcDACAGIAhUrSAHIAZUrXwhBiACQQhqIgJBIEcNAAsLQgAhBkEYIQIDQCADQYABaiACaiIEKQMAIQcgBCAHQgGIIAaENwMAIAdCP4YhBiACQXhqIgJBeEcNAAtCACEGIAEhAiADKQNAIgdCAYNQDQALC0EYIQICQANAIAJBeEcEQCADQUBrIAJqKQMAIgYgA0EgaiACaikDACIIVARAIAMgAykDICIGIAd9NwMgQgEgBiAHVK19IQZBCCECA0AgA0EgaiACaiIEKQMAIgggA0FAayACaikDACIJfSEHIAQgByAGUK0iBn03AwBCASAIIAlUrSAHIAZUrXx9IQYgAkEIaiICQSBHDQALQRghAgJAA0AgAkF4Rg0BIANBgAFqIAJqKQMAIgYgA0HgAGogAmopAwAiB1QNASACQXhqIQIgBiAHWA0AC0IAIQZBACECA0AgA0HgAGogAmoiBCkDACIIIAZ8IgYgAkHo4cEAaikDAHwhByAEIAc3AwAgBiAIVK0gByAGVK18IQYgAkEIaiICQSBHDQALC0IAIQZBACECA0AgA0HgAGogAmoiBCkDACIIIANBgAFqIAJqKQMAIgl9IQcgBCAHIAZ9NwMAIAggCVStIAcgBlStfEIBUa0hBiACQQhqIgJBIEcNAAsMAwsgAkF4aiECIAYgCFgNAQsLQgAhBkEAIQIDQCADQUBrIAJqIgQpAwAiCCADQSBqIAJqKQMAIgl9IQcgBCAHIAZ9NwMAIAggCVStIAcgBlStfEIBUa0hBiACQQhqIgJBIEcNAAtBGCECAkADQCACQXhGDQEgA0HgAGogAmopAwAiBiADQYABaiACaikDACIHVA0BIAJBeGohAiAGIAdYDQALQgAhBkEAIQIDQCADQYABaiACaiIEKQMAIgggBnwiBiACQejhwQBqKQMAfCEHIAQgBzcDACAGIAhUrSAHIAZUrXwhBiACQQhqIgJBIEcNAAsLQgAhBkEAIQIDQCADQYABaiACaiIEKQMAIgggA0HgAGogAmopAwAiCX0hByAEIAcgBn03AwAgCCAJVK0gByAGVK18QgFRrSEGIAJBCGoiAkEgRw0ACwsgA0EgaiADQSAQ1gYNAAsLIANBIGogA0EgENYGIQEgAEIBNwMAIAAgA0GAAWogA0HgAGogARsiASkDADcDCCAAQSBqIAFBGGopAwA3AwAgAEEYaiABQRBqKQMANwMAIABBEGogAUEIaikDADcDAAwBCyAAQgA3AwALIANBoAFqJAALqw8BCH8jAEHwJ2siAiQAAkACQAJ/AkACQAJAIAEtAARFBEAgAkHACGogASgCABCVAyACKALECCEEIAIoAsAIIQMgAkHAG2ogAkHICGpBmAQQogcaAkACfwJAIANBAUcEQCACQcgAaiACQcAbakGYBBCiBxogAkFAayIDIAJBxARqIgYoAgg2AgQgAyAGKAIANgIAIAIoAkRBAnQhAyACKALABCEFIAIoAkAhBANAIANFDQIgA0F8aiEDIAQoAgAgBEEEaiEEIAVNDQALQbCcwABBHxABDAILDAILIAJBwAhqIgMgAkGYAmogBRCMASACKALACCACQcAbaiADQQRyQcQDEKIHGkEBRwRAIAJB4ARqIAJBxBtqQcADEKIHGiACQcgbaiIEIAZBCGooAgA2AgAgAiAGKQIANwPAGyACIAJBwBtqKAIAIgM2AsgIIAIgAzYCwAggAiACKALEGzYCxAggAiAEKAIAQQJ0IANqNgLMCCACQaAIaiACQcAIahDgBUEAIQMgAkEANgK4CCACQgg3A7AIIAJBOGoiBCACKALABDYCBCAEQQA2AgBBCCACKAI4IgQgAigCPCIHTw0HGiACQcgbaiEGA0AgAiAENgLIFSACAn8gAkGgCGogAkHIFWoQwwhFBEAgAigCwAQiBSACKALIFSIDTQ0HIAJBwBtqIAIoArgEIANBDGxqEOAHIAJBiA9qIgUgAkHYCGopAwA3AwAgAkGAD2oiCCACQdAIaikDADcDACACQfgOaiIJIAJByAhqKQMANwMAIAIgAikDwAg3A/AOIAIoArgIIgMgAigCtAhGBEAgAkGwCGogAxD5BSACKAK4CCEDCyACKAKwCCADQdAAbGoiA0IANwMIIANCATcDACADQRBqIAIpA8AbNwMAIANBMGogAikD8A43AwAgA0EYaiAGKQMANwMAIANBIGogAkHQG2opAwA3AwAgA0EoaiACQdgbaikDADcDACADQThqIAkpAwA3AwAgA0FAayAIKQMANwMAIANByABqIAUpAwA3AwAgAigCuAhBAWoMAQsgAigCwAQiBSACKALIFSIDTQ0HIAJBwBtqIAIoArgEIANBDGxqEOAHIAIoArgIIgMgAigCtAhGBEAgAkGwCGogAxD5BSACKAK4CCEDCyACKAKwCCADQdAAbGoiA0IANwMAIAMgAikDwBs3AwggA0EQaiAGKQMANwMAIANBGGogAkHQG2opAwA3AwAgA0EgaiACQdgbaikDADcDACADQShqIAJBwAhqQSgQogcaIAIoArgIQQFqCyIDNgK4CCAHIARBAWoiBEcNAAsMBgsgAkHACGoiAyACQcAbakEoEKIHGiADEPUDCyEEIAJBuARqIgMQlAcgAxDdByAGEP8HIAJB0ARqEKIIC0EBIQMMBQtBoJfAAEEjQaShwAAQgAcACyADIAVBxKHAABDpBQALIAMgBUG0ocAAEOkFAAsgAigCsAgLIQUgAkG4BGohBiACQcAIaiACQcgAaiACQeAEaiAFIAMQN0EBIQMgAigCwAhBAUcEQCACQfAOaiIEIAJByAhqQagGEKIHGiACQZgVaiAEELUCIAJB0ARqIQcCQCACQdgEaigCAARAIAIgBzYCwBsgAkEwaiACQcAbaiIEEMMHIAJByBVqIgUgAigCMCACKAI0EJgEIAQgBRCfBCACQZgVaiAEQSAQuAgMAQsgAkGYFWpB8JzAAEEgELgICyACQagVaiIEIAJBmBVqEOAHIAJBwBtqIgUgAkHwDmpBqAYQogcaIAJByBVqIAUgBBC/AQJAIAIoAsgVQQFGBEAgAkHAG2oiCCACQcgVakEEckEoEKIHGiACQSBqIgRB4wA2AgQgBCAINgIAIAJB/CFqQQE2AgAgAkIBNwLsISACQYyZwAA2AughIAIgAikDIDcD6CcgAiACQegnajYC+CEgAkHYJ2oiBSACQeghahCYAiACQRhqIgQgBSgCCDYCBCAEIAUoAgA2AgAgAigCGCACKAIcEAEhBCAFEKIIIAgQ5gMMAQsgAigCwAQhAyACQeghaiIEIAJB0BVqQfAFEKIHGiACQcAbaiIFIAMgAkGgCGogBBDUASACQShqIAUQrwYgAigCLCEEIAIoAigNAyACQbAhahCiCCACQYAgahDiByACQaAhahDiB0EAIQMLIAJBmBVqEKIIIAJBsAhqEN4HIAJBoAhqELgEIAJBkAhqEOUHIAYQlAcgBhDdByAHEKIIDAELIAJBwBtqIgcgAkHACGpBBHJBKBCiBxogAkEQaiIEQeMANgIEIAQgBzYCACACQYQPakEBNgIAIAJCATcC9A4gAkGMmcAANgLwDiACIAIpAxA3A+ghIAIgAkHoIWo2AoAPIAJByBVqIgUgAkHwDmoQmAIgAkEIaiIEIAUoAgg2AgQgBCAFKAIANgIAIAIoAgggAigCDBABIQQgBRCiCCAHEOYDIAJBsAhqEN4HIAJBoAhqELgEIAJBkAhqEOUHIAYQlAcgBhDdByACQdAEahCiCAsgAUEBOgAEIAAgBDYCBCAAIAM2AgAgAkHwJ2okAA8LIAIgBDYC6CFB7pfAAEErIAJB6CFqQZyYwABB1KHAABC9BQAL0Q4CDn8BfiMAQfAFayICJAAgAkEIaiABQeAAEKIHGgJAAkACQCACLAAIIghBf0wEQAJAAkAgCEHAAHFFBEAgAiAIQR9xOgAIIAJB6ABqIgFBAEEwEO0HGiACQZgBakEAQTAQ7QcaIAJB4AA2ApQFIAIgAkEIajYCkAUgASACQZAFahCyAiIQpyIBQf8BcUEDRw0EIAJBmAFqIAJBkAVqELICIhCnIgFB/wFxQQNHDQUgAkGQBWoiASACQZgBakEwEKIHGiACQcgDaiABELwDQQEhAQJ/IAIoAsgDQQFGBEAgAkGQA2ogAkHUA2ooAgA2AgAgAiACKQLMAzcDiANB8JnBACEJQREMAQsgAkGQA2ogAkHgA2ooAgA2AgAgAkGYBWogAkHsA2opAgA3AwAgAkGgBWogAkH0A2opAgA3AwAgAkGoBWogAkH8A2ooAgA2AgAgAiACQdgDaikDADcDiAMgAiACQeQDaikCADcDkAUgAkHQA2ooAgAhCUEAIQEgAkHUA2ooAgALIQMgAkGAA2oiBSACQZADaigCADYCACACQeACaiIGIAJBmAVqKQMANwMAIAJB6AJqIgQgAkGgBWopAwA3AwAgAkHwAmoiByACQagFaigCADYCACACIAIpA4gDNwP4AiACIAIpA5AFNwPYAiABRQ0BIABCgYCAgCA3AwAgAEEMaiADNgIAIABBCGogCTYCACAAQRBqIAIpA/gCNwIAIABBGGogBSgCADYCAAwGCyACIAhBP3E6AAhBACEBA0AgAUHgAEYNAiACQQhqIAFqIAFBAWohAS0AAEUNAAsgAEKBgICAwAA3AwAMBQsgAkHQAmogBSgCADYCACACQbACaiAGKQMANwMAIAJBuAJqIAQpAwA3AwAgAkHAAmogBygCADYCACACIAIpA/gCNwPIAiACIAIpA9gCNwOoAiACQZAFaiIBIAJB6ABqQTAQogcaIAJByANqIAEQvANBASEBAn8gAigCyANBAUYEQCACQcADaiACQdQDaigCADYCACACIAIpAswDNwO4A0GBmsEAIQZBEQwBCyACQcADaiACQeADaigCADYCACACQZgFaiACQewDaikCADcDACACQaAFaiACQfQDaikCADcDACACQagFaiACQfwDaigCADYCACACIAJB2ANqKQMANwO4AyACIAJB5ANqKQIANwOQBSACQdADaigCACEGQQAhASACQdQDaigCAAshBSACQbADaiIEIAJBwANqKAIANgIAIAJBkANqIgcgAkGYBWopAwA3AwAgAkGYA2oiCiACQaAFaiIMKQMANwMAIAJBoANqIgsgAkGoBWooAgA2AgAgAiACKQO4AzcDqAMgAiACKQOQBTcDiAMgAUUEQCACQfABaiIBIAQoAgA2AgAgAkHQAWoiBCAHKQMANwMAIAJB2AFqIgcgCikDADcDACACQeABaiIKIAsoAgA2AgAgAkGgAmoiCyACQdACaigCADYCACACQZACaiINIAJBwAJqKAIANgIAIAJBiAJqIg4gAkG4AmopAwA3AwAgAkGAAmoiDyACQbACaikDADcDACACIAIpA6gDNwPoASACIAIpA4gDNwPIASACIAIpA8gCNwOYAiACIAIpA6gCNwP4ASAMIAsoAgA2AgAgAkGsBWogDykDADcCACACQbQFaiAOKQMANwIAIAJBvAVqIA0oAgA2AgAgAkHEBWogBTYCACACIAM2ApQFIAIgCTYCkAUgAiACKQOYAjcDmAUgAiACKQP4ATcCpAUgAiAGNgLABSACQcgFaiACKQPoATcDACACQdAFaiABKAIANgIAIAJB7AVqIAooAgA2AgAgAkHkBWogBykDADcCACACQdwFaiAEKQMANwIAIAIgAikDyAE3AtQFQQAhASACQcgDaiACQZAFaiAIQSBxQQBHEMIBAkAgAi0AiAVBAkYEQCAAQQA2AgQgAEEIaiACKQKQBTcCACAAQRBqIAJBmAVqKQIANwIAIABBGGogAkGgBWooAgA2AgBBASEBDAELIABBCGogAkHIA2pByAEQogcaCyAAIAE2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QQBBMBDtBxogAkHgADYC1AMgAiACNgLQAyABIAJB0ANqELICIg6nIgFB/wFxQQNHDQEgAkGQAWogAkHQA2oQsgIiDqciAUH/AXFBA0cNAiACQdADaiIBIAJB4ABqQTAQogcaIAJBmANqIAEQvANBASEBAn8gAigCmANBAUYEQCACQeACaiACQaQDaigCADYCACACIAIpApwDNwPYAkHAs8EAIQdBDAwBCyACQeACaiACQbADaigCADYCACACQdgDaiACQbwDaikCADcDACACQeADaiACQcQDaikCADcDACACQegDaiACQcwDaigCADYCACACIAJBqANqKQMANwPYAiACIAJBtANqKQIANwPQAyACQaADaigCACEHQQAhASACQaQDaigCAAshAyACQdACaiIEIAJB4AJqKAIANgIAIAJBsAJqIgUgAkHYA2opAwA3AwAgAkG4AmoiBiACQeADaikDADcDACACQcACaiIIIAJB6ANqKAIANgIAIAIgAikD2AI3A8gCIAIgAikD0AM3A6gCIAENAyACQaACaiAEKAIANgIAIAJBgAJqIAUpAwA3AwAgAkGIAmogBikDADcDACACQZACaiAIKAIANgIAIAIgAikDyAI3A5gCIAIgAikDqAI3A/gBIAJB0ANqIgEgAkGQAWpBMBCiBxogAkGYA2ogARC8A0EBIQECfyACKAKYA0EBRgRAIAJBkANqIAJBpANqKAIANgIAIAIgAikCnAM3A4gDQcyzwQAhBUEMDAELIAJBkANqIAJBsANqKAIANgIAIAJB2ANqIAJBvANqKQIANwMAIAJB4ANqIAJBxANqKQIANwMAIAJB6ANqIAJBzANqKAIANgIAIAIgAkGoA2opAwA3A4gDIAIgAkG0A2opAgA3A9ADIAJBoANqKAIAIQVBACEBIAJBpANqKAIACyEEIAJBgANqIgYgAkGQA2ooAgA2AgAgAkHgAmoiCCACQdgDaikDADcDACACQegCaiIJIAJB4ANqKQMANwMAIAJB8AJqIgogAkHoA2ooAgA2AgAgAiACKQOIAzcD+AIgAiACKQPQAzcD2AIgAUUEQCACQfABaiACQaACaigCACIBNgIAIAJB0AFqIgsgAkGAAmopAwA3AwAgAkHYAWoiDCACQYgCaikDADcDACACQeABaiINIAJBkAJqKAIANgIAIAIgAikDmAIiDjcD6AEgAiACKQP4ATcDyAEgAEEMaiADNgIAIABBCGogBzYCACAAQRBqIA43AwAgAEEYaiABNgIAIABBPGogBDYCACAAQThqIAU2AgAgAEEcaiACKQPIATcCACAAQSRqIAspAwA3AgAgAEEsaiAMKQMANwIAIABBNGogDSgCADYCACAAQUBrIAIpA/gCNwIAIABByABqIAYoAgA2AgAgAEHkAGogCigCADYCACAAQdwAaiAJKQMANwIAIABB1ABqIAgpAwA3AgAgAEHMAGogAikD2AI3AgAgAEHoAGpBADoAACAAQewAaiACQcQBaigAADYAACAAQekAaiACKADBATYAACAAQQA2AgAMBQsgAEKBgICAIDcDACAAQQxqIAQ2AgAgAEEIaiAFNgIAIABBEGogAikD+AI3AgAgAEEYaiAGKAIANgIADAQLIABCgYCAgDA3AwAMAwsgAiABOgCYAyACIA5COIg8AJ8DIAIgDkIoiD0AnQMgAiAOQgiIPgCZA0H6scEAQSsgAkGYA2pBqLLBAEGgs8EAEL0FAAsgAiABOgCYAyACIA5COIg8AJ8DIAIgDkIoiD0AnQMgAiAOQgiIPgCZA0H6scEAQSsgAkGYA2pBqLLBAEGws8EAEL0FAAsgAEKBgICAIDcDACAAQQxqIAM2AgAgAEEIaiAHNgIAIABBEGogAikDyAI3AgAgAEEYaiAEKAIANgIACyACQYAEaiQAC7UMAgd/An4jAEGwD2siAiQAIAJBEGpBBTYCACACQaiGwAA2AgwgAiABNgIIIAJBADYC2AQgAkIANwPoBCACQQA2ApAFIAJBADYCoAVBASEDAkACfwJAAkACQAJAAkACQAJAAkACQAJAIAJBCGoQxQQiCadBAXFFBEAgAkG4CmohBCACQfAEaiEBIAJBsApqQQRyIQUDQAJAAkACQAJAAkACQAJAIAmnQQh2Qf8BcQ4HAAECAwQFCQULIApCAVENCSACQbAKaiACQQhqEIkEIAIoArAKQQFGDRAgAkEYaiAEQZABEKIHGkIBIQoMBQsgAigC2AQNCSACQbAKaiACQQhqEIQEIAIoArAKQQFGDQ8gAkGoAWoiBhCbCCAGIARBwAMQogcaDAQLIAIpA+gEQgFRDQkgAkGwCmogAkEIahCABCACKAKwCkEBRg0OIAJB2AZqIgYgBEEYaikDADcDACACQdAGaiIHIARBEGopAwA3AwAgAkHIBmoiCCAEQQhqKQMANwMAIAIgBCkDADcDwAYgAikD6ARQRQRAIAEQjwgLIAEgAikDwAY3AwAgAUEIaiAIKQMANwMAIAFBEGogBykDADcDACABQRhqIAYpAwA3AwAgAkIBNwPoBAwDCyACKAKQBQ0JIAJBsApqIAJBCGoQiAQgAigCsApBAUYNDSACQZAFahCpCCACQZgFaiAFQQhqKAIANgIAIAIgBSkCADcDkAUMAgsgAigCoAUNCSACQbAKaiACQQhqEIUEIAIoArAKQQFGDQwgAkGgBWoQqwggAkGoBWogBUEIaigCADYCACACIAUpAgA3A6AFDAELIAIgAkEIahDUAyACKAIADQoLIAJBCGoQxQQiCUIBg1ANAAsLIABBATYCACAAIAlCIIg+AgQMCQsgCkIBUgRAQbmCwABBChD1BSEBIABBATYCACAAIAE2AgQMCQsgAkGwBWogAkEYakGQARCiBxogAigC2ARFBEBBm4LAAEEJEPUFIQEgAEEBNgIAIAAgATYCBAwJCyACQcAGaiACQagBakHAAxCiBxogAikD6ARCAVIEQEHzgsAAQQkQ9QUhASAAQQE2AgAgACABNgIEQQEhAQwGCyACQZgKaiABQRhqKQMANwMAIAJBkApqIAFBEGopAwA3AwAgAkGICmogAUEIaikDADcDACACIAEpAwA3A4AKAkACfyACKAKQBUUEQEGTgsAAQQgQ9QUhASAAQQE2AgAgACABNgIEQQEMAQsgAkGoCmogAkGYBWooAgA2AgAgAiACKQOQBTcDoAogAigCoAUiAQ0BQfyCwABBBRD1BSEBIABBATYCACAAIAE2AgQgAkGgCmoiABCUByAAEN0HQQALIQMgAkGACmoQjwhBACEBDAYLIAIpAqQFIQkgAkGwCmoiAyACQbAFakGQARCiBxogAkHAC2ogAkHABmpBwAMQogcaIAJBmA9qIAJBmApqKQMANwMAIAJBkA9qIAJBkApqKQMANwMAIAJBiA9qIAJBiApqKQMANwMAIAJBqA9qIAJBqApqKAIANgIAIAIgAikDgAo3A4APIAIgAikDoAo3A6APIABBCGogA0H8BBCiBxogAEGIBWogCTcDACAAQYQFaiABNgIAIABBADYCACACKAIIIgBBJEkNCiAAEAAM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ACACIAEpAgA3A8AIDAILIAIoAtAIDQggAkGQEWogAkEQahCCBCACKAKQEUEBRg0MIAJB0AhqEKoIIAJB2AhqIAFBCGooAgA2AgAgAiABKQIANwPQCAwBCyACQQhqIAJBEGoQ1AMgAigCCA0KCyACQRBqEMsEIgVCAYNQDQALCyAAQQE2AgAgACAFQiCIPgIEDAkLIAIoAuAERQ0FIAJB4AhqIAJBIGpBgAYQogcaIAZCAVIEQEGbgsAAQQkQ9QUhASAAQQE2AgAgACABNgIEDAULIAJB4A5qIAJBoAZqQaACEKIHGiACKALACEUEQEGTgsAAQQgQ9QUhASAAQQE2AgAgACABNgIEDAULIAJBiBFqIgEgAkHICGooAgA2AgAgAiACKQPACDcDgBEgAigC0AgiA0UEQEG0gsAAQQUQ9QUhASAAQQE2AgAgACABNgIEIAJBgBFqIgAQlAcgABDdB0EAIQMMBQsgAikC1AghBSACQZARaiIEIAJB4AhqQYAGEKIHGiACQZAXaiACQeAOakGgAhCiBxogAkG4GWogASgCADYCACACIAIpA4ARNwOwGSAAQQhqIARBrAgQogcaIABBuAhqIAU3AwAgAEG0CGogAzYCACAAQQA2AgAgAigCECIAQSRJDQogABAADAoLQYmDwABBBRD2BSEBIABBATYCACAAIAE2AgQMBwtBm4LAAEEJEPYFIQEgAEEBNgIAIAAgATYCBAwGC0GTgsAAQQgQ9gUhASAAQQE2AgAgACABNgIEDAULQbSCwABBBRD2BSEBIABBATYCACAAIAE2AgQMBAsgAkHgCGoQ1AdBAAwEC0GJg8AAQQUQ9QUhASAAQQE2AgAgACABNgIEDAILIAIoAgwhASAAQQE2AgAgACABNgIEDAELIAAgAigClBE2AgQgAEEBNgIAC0EBCyEAIAIoAtAIBEAgAkHQCGoQoggLIAIoAsAIRSADQQFzckUEQCACQcAIaiIBEJQHIAEQ3QcLIAIoAuAERSAAQQFzckUEQCACQSBqENQHCyACKAIQIgBBJEkNACAAEAALIAJBwBlqJAAL8ggCB38FfiMAQYABayIDJAACf0EEIAG9IgtC////////////AINQDQAaIAtC/////////weDIgpCgICAgICAgAiEIApCAYYgC0I0iKdB/w9xIgUbIgxCAYMhDSALQoCAgICAgID4/wCDIg5QRQRAQQNBAiAKUBsgDkKAgICAgICA+P8AUQ0BGkKAgICAgICAICAMQgGGIAxCgICAgICAgAhRIgQbIQxCAkIBIAQbIQpBy3dBzHcgBBsgBWohBSANp0EBcwwBCyAFQc13aiEFQgEhCiANp0EBcwshBCADQRBqIANBJGotAAAiBjoAACADIAMoACAiBzYCDCADQf8AaiAGOgAAIAMgBTsBeCADIAo3A3AgA0IBNwNoIAMgDDcDYCADIAc2AHsgAyAEOgB6IAtCOIhCgAGDIQogBEF+aiIFQf8BcSEEAkACQAJAAkACQAJAAkACQCAFQQMgBEEDSRtB/wFxDgMBAgACC0GEiMIAIQRBACEFAkACfwJAAkACQCACQf8BcUEBaw4DAAECBAtB75/CAEGEiMIAIApCAFIbIQQgCkIHiKchBQwDC0Hwn8IADAELQe+fwgBB8J/CACAKQgBSGwshBEEBIQULIANBAjsBIEEBIQYgA0EBNgIoIANBhIjCADYCJAwCCyADQQM2AiggA0H0n8IANgIkIANBAjsBICADQYSIwgA2AlBBASEGQQAhBQwDC0Hvn8IAQYSIwgAgCkIAUiIFG0Hvn8IAQfCfwgAgBRsgAkH/AXEiAkECSRshCEEBIQYgAkEBSyAFciEFIARBAksNASADQQM2AiggA0Hxn8IANgIkIANBAjsBICADIAg2AlAMAgsgAyAENgJQDAELIANBIGogA0HgAGogA0EMahBRAkAgAygCIEUEQCADQdAAaiADQeAAaiADQQxqED8MAQsgA0HYAGogA0EoaigCADYCACADIAMpAyA3A1ALIAMoAlQiAkUNASADKAJQIgctAABBMUkNAgJAAkACQCADLgFYIgRBAU4EQCADIAc2AiRBAiEGIANBAjsBICACIARNDQEgA0E0akEBNgIAIANBMGpB7p/CADYCACADIAQ2AiggA0FAayACIARrIgk2AgAgA0E8aiAEIAdqNgIAIANBAjsBOCADQQI7ASxBAyEGIAlBAE8NAyADQcgAaiAEIAJrNgIADAILIANBQGsgAjYCACADQTxqIAc2AgAgA0EAOwEsIANBMGpBACAEayIHNgIAIANBAjsBOCADQQI2AiggA0Hsn8IANgIkIANBAjsBIEEDIQYgAkEATw0CQQAgAmsiAiAHTQ0CIANByABqIAIgBGo2AgAMAQsgAyACNgIoIANBMGogBCACazYCACADQQA7ASwMAQsgA0EAOwFEQQQhBgsgAyAINgJQCyADQdwAaiAGNgIAIAMgBTYCVCADIANBIGo2AlggACADQdAAahDEASADQYABaiQADwtBrJ3CAEEhQaifwgAQgAcAC0G4n8IAQSFB3J/CABCABwAL+ggBCH8jAEGQDmsiAiQAAkACQAJAAkACQAJAIAEtAARFBEAgAkGgCmogASgCABCTAyACKAKkCiEEIAIoAqAKIQMgAkHYBmogAkGoCmpBwAAQogcaAn8CQAJAIANBAUcEQCACQRhqIAJB2AZqQcAAEKIHGiACKAJQRQ0CIAJBQGshBQJAIAIoAkBFBEAgAikDGEIBUQ0BQQEhA0HgnsAAQRMQASEEDAwLIAJBgANqIAVBCGooAgA2AgAgAiAFKQIANwP4AiACQRBqIgMgAkH4AmoiBCgCCDYCBCADIAQoAgA2AgAgAigCFCIDQd8ATQ0GIAJB2ABqIgMgAigCEBDkBSACQaAKaiIEIAMgAigCUBCMASACKAKgCiACQdgGaiAEQQRyQcQDEKIHGkEBIQNBAUYNAiACQZgDaiIDIAJB3AZqQcADEKIHGiACQaAKaiIEIANBwAMQogcaIAIoAlAhAyACQeANaiACQRhqQSgQogcaIAIgAzYCiA4gAkEIaiAEIAJB2AZqEPcCIAIoAgwhBCACKAIIDQcgAkHQDWoQ5QcgAikD4A1QRQRAIAJB6A1qEI8ICyACQfgCahCiCEEAIQMMCwsgAkG8CmogAkE4aikDADcCACACQbQKaiACQTBqKQMANwIAIAJBrApqIAJBKGopAwA3AgAgAiACKQMgNwKkCiACQQE2AtgGIAJB2AZqIgRBBHIgAkGgCmoiA0EkEKIHGiADIAQQiQMgAkHYAGoiBiADQaACEKIHGiACQZADaiIHIAJB2AxqKQMANwMAIAJBiANqIgggAkHQDGopAwA3AwAgAkGAA2oiCSACQcgMaikDADcDACACIAIpA8AMNwP4AiADIAYgAigCUBCMASACKAKgCiAEIANBBHJBxAMQogcaQQFHBEAgAkGYA2oiAyACQdwGakHAAxCiBxogAkGgCmoiBCADQcADEKIHGiACQegNaiIDIAIpA/gCNwMAIAJB8A1qIAkpAwA3AwAgAkH4DWogCCkDADcDACACQYAOaiAHKQMANwMAIAJCATcD4A0gAiACKAJQNgKIDiACIAQgAkHYBmoQ9wIgAigCBCEEIAIoAgANCCACQdANahDlByACKQPgDVBFBEAgAxCPCAtBACEDIAIoAkBFDQsgBRCiCAwLCyACQaAKaiIDIAJB2AZqQSgQogcaIAMQ9QMhBCACQfgCahCPCEEADAMLDAgLIAJBoApqIgQgAkHYBmpBKBCiBxogBBD1AyEEIAJB+AJqEKIIDAYLQaSfwABBFRABIQRBAQshAyACKAJARQ0EIAJBQGsQoggMBAtBoJfAAEEjQdCewAAQgAcAC0HgACADQYSfwAAQ6gUACyACIAQ2AtgGQe6XwABBKyACQdgGakGcmMAAQZSfwAAQvQUACyACIAQ2AtgGQe6XwABBKyACQdgGakGcmMAAQfSewAAQvQUACyADRSACKQMYQgFScg0AIAJBIGoQjwgLQQEhAwsgAUEBOgAEIAAgBDYCBCAAIAM2AgAgAkGQDmokAAvtDAEHfyMAQeAAayICJAACQAJAIAAoAgAiBgRAIAAoAgQiCCAAQQhqKAIAIgVLDQELIABBADYCACAAKAIMIgAoAhhB3YXBAEEBIABBHGooAgAoAgwRAQAhAwwBCyAFIAZqLQAAIQRBASEDIAAgBUEBaiIHNgIIAkACQAJAAkACQAJAAkACQAJAAkACQCAEQbd/ag4GBgEBAQQDAAsCQCAEQb5/ag4CBwIACyAEQah/ag4CAwQACyAAQQA2AgAgACgCDCIAKAIYQd2FwQBBASAAQRxqKAIAKAIMEQEAIQMMCQsgAiAAQfMAEIwFIAIpAwCnBEAgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBACEDDAkLIAIgAikDCDcDMAJAAkAgACgCAEUEQCACQQA2AkgMAQsgAkHIAGogABCaASACKAJIDQELIABBADYCACAAKAIMIgAoAhhB3YXBAEEBIABBHGooAgAoAgwRAQAhAwwJCyACQUBrIAJB0ABqKQMANwMAIAIgAikDSDcDOCACQThqIAAoAgwQbA0IIAAoAgwtAABBBHFBAnYNByAAKAIMIgEoAhhB/oXBAEEBIAFBHGooAgAoAgwRAQANCCACQTBqIAAoAgwQwwQNCCAAKAIMIgAoAhhB/4XBAEEBIABBHGooAgAoAgwRAQANCAwHCwJAIAggB0sEQCAGIAdqLQAAIQQgACAFQQJqNgIIIARBv39qQf8BcUEaSQ0BIARBn39qQYCAxAAhBEH/AXFBGkkNAQsgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBACEDDAgLQQEhAyAAIAEQdw0HAkAgACgCAARAIAJBEGogAEHzABCMBSACKQMQp0UNAQsgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBACEDDAgLIAIgAikDGDcDMAJAAkAgACgCAEUEQCACQQA2AkgMAQsgAkHIAGogABCaASACKAJIDQELIABBADYCACAAKAIMIgAoAhhB3YXBAEEBIABBHGooAgAoAgwRAQAhAwwICyACQUBrIAJB0ABqKQMANwMAIAIgAikDSDcDOCAEQYCAxABGBEAgAigCPEUEQCACQcQAaigCAEUNCAsgACgCDCIBKAIYQeaFwQBBAiABQRxqKAIAKAIMEQEADQggAkE4aiAAKAIMEGxFDQcMCAsgAiAENgJIIAAoAgwiASgCGEHuhcEAQQMgAUEcaigCACgCDBEBAA0HIARBwwBGDQQgBEHTAEcEQCACQcgAaiAAKAIMEKoCRQ0GDAgLIAAoAgwiASgCGEHxhcEAQQQgAUEcaigCACgCDBEBAA0HDAULIAJBIGogAEHzABCMBSACKAIgBEAgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBACEDDAcLIAAoAgAEQCAAEL4BRQ0BCyAAQQA2AgAgACgCDCIAKAIYQd2FwQBBASAAQRxqKAIAKAIMEQEAIQMMBgsgACgCDCIBKAIYQeiFwQBBASABQRxqKAIAKAIMEQEADQUgABBUDQUgBEHNAEcEQCAAKAIMIgEoAhhB6oXBAEEEIAFBHGooAgAoAgwRAQANBiAAQQAQdw0GCyAAKAIMIgAoAhhB6YXBAEEBIABBHGooAgAoAgwRAQAgAkHgAGokAA8LIAAgARB3DQQgAQRAIAAoAgwiASgCGEHmhcEAQQIgAUEcaigCACgCDBEBAA0FCyAAKAIMIgEoAhhB6IXBAEEBIAFBHGooAgAoAgwRAQANBCAAENUCDQQgACgCDCIAKAIYQemFwQBBASAAQRxqKAIAKAIMEQEAIQMMBAsgAkHIAGoiAyAAEIUGIAIgACkCDDcCVCADIAEQdyEDDAMLIAAoAgwiASgCGEH1hcEAQQcgAUEcaigCACgCDBEBAA0CCwJAIAIoAjxFBEAgAkHEAGooAgBFDQELIAAoAgwiASgCGEH8hcEAQQEgAUEcaigCACgCDBEBAA0CIAJBOGogACgCDBBsDQILIAAoAgwiASgCGEH9hcEAQQEgAUEcaigCACgCDBEBAA0BIAJBMGogACgCDBDVCA0BIAAoAgwiACgCGEHahMEAQQEgAEEcaigCACgCDBEBAEUNAAwBC0EAIQMLIAJB4ABqJAAgAwuvCAEGfyMAQfAAayIFJAAgBSADNgIMIAUgAjYCCEEBIQYgASEHAkAgAUGBAkkNAEEAIAFrIQlBgAIhCANAAkAgCCABTw0AQQAhBiAAIAhqLAAAQb9/TA0AIAghBwwCCyAIQX9qIQdBACEGIAhBAUYNASAIIAlqIAchCEEBRw0ACwsgBSAHNgIUIAUgADYCECAFQQBBBSAGGzYCHCAFQYSIwgBB1K7CACAGGzYCGAJAAn8CQAJAIAIgAUsiByADIAFLckUEQCACIANLDQECQCACRSABIAJGckUEQCABIAJNDQEgACACaiwAAEFASA0BCyADIQILIAUgAjYCICACQQAgASACRxtFBEAgAiEGDAMLIAFBAWohBwNAAkAgAiABTw0AIAAgAmosAABBQEgNACACIQYgBUEkagwFCyACQX9qIQYgAkEBRg0DIAIgB0YgBiECRQ0ACwwCCyAFIAIgAyAHGzYCKCAFQcQAakEDNgIAIAVB3ABqQf0CNgIAIAVB1ABqQf0CNgIAIAVCAzcCNCAFQfyuwgA2AjAgBUG4ATYCTCAFIAVByABqNgJAIAUgBUEYajYCWCAFIAVBEGo2AlAgBSAFQShqNgJIDAMLIAVB5ABqQf0CNgIAIAVB3ABqQf0CNgIAIAVB1ABqQbgBNgIAIAVBxABqQQQ2AgAgBUIENwI0IAVBuK/CADYCMCAFQbgBNgJMIAUgBUHIAGo2AkAgBSAFQRhqNgJgIAUgBUEQajYCWCAFIAVBDGo2AlAgBSAFQQhqNgJIDAILIAVBJGoLIQgCQCABIAZGDQBBASEDAkACQAJAIAAgBmoiAiwAACIJQX9MBEBBACEDIAAgAWoiASIAIAJBAWpHBEAgAi0AAUE/cSEDIAJBAmohAAsgCUEfcSEKIAlB/wFxQd8BSw0BIApBBnQgA3IhAgwCCyAFIAlB/wFxNgIkIAVBKGohAQwCC0EAIQIgASIHIABHBH8gAEEBaiEHIAAtAABBP3EFQQALIANBBnRyIQIgCUH/AXFB8AFJBEAgCkEMdCACciECDAELIAEgB0cEfyAHLQAAQT9xBUEACyAKQRJ0QYCA8ABxIAJBBnRyciICQYCAxABGDQILIAUgAjYCJEEBIQMgBUEoaiEBIAJBgAFJDQBBAiEDIAJBgBBJDQBBA0EEIAJBgIAESRshAwsgBSAGNgIoIAUgAyAGajYCLCAFQcQAakEFNgIAIAVB7ABqQf0CNgIAIAVB5ABqQf0CNgIAIAVB3ABqQf4CNgIAIAVB1ABqQf8BNgIAIAVCBTcCNCAFQYywwgA2AjAgBSABNgJYIAUgCDYCUCAFQbgBNgJMIAUgBUHIAGo2AkAgBSAFQRhqNgJoIAUgBUEQajYCYCAFIAVBIGo2AkgMAQtBwaHCAEErIAQQgAcACyAFQTBqIAQQ7AcAC+wKAQl/IwBBQGoiAyQAAkACQAJAAkAgACgCACIERQ0AIAAoAgQiBiAAQQhqKAIAIgFNDQAgASAEaiICLQAAQcIARw0BIAAgAUEBajYCCCADQSBqIgIgABCFBiADIAApAgw3AiwgAhB5IQIMAgsgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBACECDAELIAItAAAhCUEBIQIgACABQQFqIgU2AggCQAJAAkACQAJAAkACQCAJQZ9/ag4ZAwQFAQEBAQIDAgEDAgMCAAEBAwIBAQEDAgELIAAoAgwiACgCGEHehMEAQQEgAEEcaigCACgCDBEBACADQUBrJAAPCyAAQQA2AgAgACgCDCIAKAIYQd2FwQBBASAAQRxqKAIAKAIMEQEAIQIMBQsgABDRAUUNAwwECwJAIAYgBU0NACAEIAVqLQAAQe4ARw0AIAAgAUECajYCCCAAKAIMIgEoAhhB2YTBAEEBIAFBHGooAgAoAgwRAQANBAsgABDRAUUNAgwDCyADQQhqIAAQgAMgAygCCCIBRQRAIABBADYCACAAKAIMIgEoAhhB3YXBAEEBIAFBHGooAgAoAgwRAQBFDQIMAwsCQCADKAIMQQFHDQACQAJAIAEtAABBUGoOAgABAgsgACgCDCIBKAIYQfSGwQBBBSABQRxqKAIAKAIMEQEARQ0DDAQLIAAoAgwiASgCGEHwhsEAQQQgAUEcaigCACgCDBEBAEUNAgwDCyAAQQA2AgAgACgCDCIBKAIYQd2FwQBBASABQRxqKAIAKAIMEQEARQ0BDAILIANBEGogABCAAyADKAIQIgJFBEAgAEEANgIAQQEhAiAAKAIMIgEoAhhB3YXBAEEBIAFBHGooAgAoAgwRAQBFDQEMAgsCQAJAIAMoAhQiAUEITQRAIAENAUEAIQYMAgsgAEEANgIAQQEhAiAAKAIMIgEoAhhB3YXBAEEBIAFBHGooAgAoAgwRAQBFDQIMAwsgASACaiEBQQAhBgNAIAJBAWohBAJAIAIsAAAiBUF/SgRAIAVB/wFxIQUgBCECDAELAn8gASAERgRAQQAhByABDAELIAItAAFBP3EhByACQQJqCyEEIAVBH3EhCCAFQf8BcSIFQd8BTQRAIAhBBnQgB3IhBSAEIQIMAQsCfyABIARGBEAgASECQQAMAQsgBEEBaiECIAQtAABBP3ELIAdBBnRyIQQgBUHwAUkEQCAIQQx0IARyIQUMAQsCfyABIAJGBEBBACEFIAEMAQsgAi0AAEE/cSEFIAJBAWoLIQIgCEESdEGAgPAAcSAEQQZ0ciAFciIFQYCAxABGDQILAkAgBUFQaiIEQQpJDQBBqX8hBAJAIAVBn39qQRpPBEBBSSEEIAVBv39qQRlLDQELIAQgBWoiBEEQSQ0BC0HwgcEAQStB/IbBABCABwALIAZBBHQgBHIhBiABIAJHDQALCyAGQYBwcUGAsANGIAZB///DAEtyRQRAIAMgBjYCHCAAKAIMQQEhAiADQTRqQQE2AgAgA0IBNwIkIANBjIfBADYCICADQf8BNgI8IAMgA0E4ajYCMCADIANBHGo2AjggA0EgahDuBUUNAQwCCyAAQQA2AgBBASECIAAoAgwiASgCGEHdhcEAQQEgAUEcaigCACgCDBEBAA0BC0EAIQIgACgCDC0AAEEEcUECdg0AQQEhAiAAKAIMIgEoAhhByIbBAEECIAFBHGooAgAoAgwRAQANACADIAkQjgMgAygCACICRQ0BIAAoAgwiACgCGCACIAMoAgQgAEEcaigCACgCDBEBACECCyADQUBrJAAgAg8LQfCBwQBBK0HMhsEAEIAHAAvtBgEFfyAAQXhqIgAoAgRBeHEhASAAIAFqIQICQAJAIAAoAgRBAXENACAAKAIAIQMCQCAALQAEQQNxBEAgASADaiEBIAAgA2siAEHsy8IAKAIARw0BIAIoAgRBA3FBA0cNAkHky8IAIAE2AgAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgAPCwwCCyADQYACTwRAIAAQtwIMAQsgAEEIaigCACIEIABBDGooAgAiBUcEQCAEIAU2AgwgBSAENgIIDAELQdTIwgBB1MjCACgCAEF+IANBA3Z3cTYCAAsCQCACLQAEQQJxQQF2BEAgAiACKAIEQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgAMAQsCQEHwy8IAKAIAIAJHBEBB7MvCACgCACACRw0BQezLwgAgADYCAEHky8IAQeTLwgAoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwtB8MvCACAANgIAQejLwgBB6MvCACgCACABaiIBNgIAIAAgAUEBcjYCBEHsy8IAKAIAIABGBEBB5MvCAEEANgIAQezLwgBBADYCAAtBjMzCACgCACABTw0CQfDLwgAoAgBFDQICQEHoy8IAKAIAQShNDQBB8MvCACgCACEBQfzLwgAhAAJAA0AgACgCACABTQRAIAAoAgAgACgCBGogAUsNAgsgACgCCCIADQALQQAhAAsgACgCDEEBcQ0AIABBDGooAgAaCxCnAg0CQejLwgAoAgBBjMzCACgCAE0NAkGMzMIAQX82AgAPCyACKAIEQXhxIgMgAWohAQJAIANBgAJPBEAgAhC3AgwBCyACQQxqKAIAIgQgAkEIaigCACICRwRAIAIgBDYCDCAEIAI2AggMAQtB1MjCAEHUyMIAKAIAQX4gA0EDdndxNgIACyAAIAFBAXI2AgQgACABaiABNgIAQezLwgAoAgAgAEcNAEHky8IAIAE2AgAPCyABQYACTwRAIAAgARCsAkGUzMIAQZTMwgAoAgBBf2oiADYCACAADQEQpwIaDwsgAUEDdiICQQN0QdzIwgBqIQECf0HUyMIAKAIAIgNBASACdCICcQRAIAEoAggMAQtB1MjCACACIANyNgIAIAELIQIgASAANgIIIAIgADYCDCAAIAE2AgwgACACNgIICwvYCAICfwN+IwBB4AprIgMkAAJAAkACQAJAAkAgAkF8akEwcEUEQCADQRBqIgQgATYCCCAEQgA3AwAgBEEMaiACNgIAIANBkAdqIAQQkAEgAykClAchBiADKAKQByADQcACaiADQZwHaiICQZwCEKIHGkEBRg0BIANBJGogA0HAAmoiAUGcAhCiBxogA0GQB2ogA0EQahCRASADKQKUByEHIAMoApAHIAEgAkGMARCiBxpBAUYNBCADQeAEaiADQcACakGMARCiBxogA0EANgLsBSADQRBqIANB7AVqQQQQlgQiBaciAUH/AXFBA0cNAiADQQhqIAMoAuwFIgFBGHQgAUEIdEGAgPwHcXIgAUEIdkGA/gNxIAFBGHZyciIBEKAFIANBADYC+AUgAyADKQMINwPwBSADIAE2AgQgA0EANgIAIAMoAgAiASADKAIEIgJJBEAgAiABayECIANBnAdqIQQDQCADQZAHaiADQRBqEJEBIAMpApQHIQUgAygCkAcgA0HAAmogBEGMARCiBxpBAUYNBSADQYAGaiIBIANBwAJqQYwBEKIHGiADQZAHaiABQYwBEKIHGiADKAL4BSIBIAMoAvQFRgRAIANB8AVqIAFBARCABiADKAL4BSEBCyADKALwBSABQZABbGoiASAFQiCIPgIAIAFBBGogA0GQB2pBjAEQogcaIAMgAygC+AVBAWo2AvgFIAJBf2oiAg0ACwsgAyAHQiCIPgKQByADQZAHaiIBQQRyIANB4ARqQYwBEKIHGiADQcgKaiADQfgFaigCADYCACADIAZCIIg+AqAIIAMgAykD8AU3A8AKIANBpAhqIANBJGpBnAIQogcaIANBwAJqIAEQtwUgA0HYCmogA0HIAmopAwA3AwAgA0GIBmogA0HcAmopAgA3AwAgA0GQBmoiASADQeQCaigCADYCACADIAMpA8ACNwPQCiADIAMpAtQCNwOABiADKALQAiICQQJGBEAgAEEIaiADQZAHakHAAxCiBxogAEEANgIADAYLIAAgAykD0Ao3AgQgAEEBNgIAIABBFGogAjYCACAAQRhqIAMpA4AGNwIAIABBDGogA0HYCmopAwA3AgAgAEEgaiADQYgGaikDADcCACAAQShqIAEoAgA2AgAgA0HACmoQ5QcMBQsgA0EEOgDAAiADQZAHaiIBIANBwAJqEOoEIABBBGogAUEoEKIHGiAAQQE2AgAMBAsgA0GQB2oiASAGEJ8CIABBBGogAUEoEKIHGiAAQQE2AgAMAwsgAyABOgCQByADIAVCOIg8AJcHIAMgBUIoiD0AlQcgAyAFQgiIPgCRB0Hs28AAQSsgA0GQB2pBqNzAAEGM3sAAEL0FAAsgA0GQB2oiASAFEJ8CIABBBGogAUEoEKIHGiAAQQE2AgAgA0HwBWoQ5QcMAQsgA0GQB2oiASAHEJ8CIABBBGogAUEoEKIHGiAAQQE2AgALIANB4ApqJAALrggCBH8DfiMAQYAJayIDJAACQAJAAkACQAJAAkACQAJAQZABIAJNBEAgA0EQaiIEIAE2AgggBEIANwMAIARBDGogAjYCACADQbAHaiAEEJEBIAMpArQHIQcgAygCsAcgA0GIBmogA0G8B2oiBUGMARCiBxpBAUYNASADQSRqIANBiAZqIgRBjAEQogcaIANBsAdqIANBEGoQkQEgAykCtAchCCADKAKwByAEIAVBjAEQogcaQQFGDQIgA0GwAWogA0GIBmoiBEGMARCiBxogA0GwB2ogA0EQahCRASADKQK0ByEJIAMoArAHIAQgA0G8B2pBjAEQogcaQQFGDQYgA0G8AmogA0GIBmpBjAEQogcaQZQBIAJLDQMgAUGQAWooAAAiBEEYdCAEQQh0QYCA/AdxciAEQQh2QYD+A3EgBEEYdnJyIgVBlAFqIgQgBUkNBCAEIAJLDQUgA0GwB2oiBiABQZQBaiAFEHMgAygCsAcgA0GIBmogBkEEciIGQaQBEKIHGkEBRg0HIANByANqIANBjAZqQaABEKIHGiADQbAHaiABIARqIAIgBGsQcyADKAKwByADQYgGaiAGQaQBEKIHGkEBRwRAIANB6ARqIgEgA0GMBmpBoAEQogcaIABBCGogB0IgiD4CACAAQQxqIANBJGpBjAEQogcaIABBmAFqIAhCIIg+AgAgAEGcAWogA0GwAWpBjAEQogcaIABBqAJqIAlCIIg+AgAgAEGsAmogA0G8AmpBjAEQogcaIABBuANqIANByANqQaABEKIHGiAAQdgEaiABQaABEKIHGiAAQQA2AgAMCQsgA0GwB2oiASADQYgGakEoEKIHGiADQdgIaiICIAEQxgIgAEEEaiACQSgQogcaIABBATYCACADQdgEahDiBwwICyADQZABNgK8AiADQQhqIgFBuAE2AgQgASADQbwCajYCACADQcQHakEBNgIAIANCATcCtAcgA0G01sAANgKwByADIAMpAwg3A8gDIAMgA0HIA2o2AsAHIANB6ARqIANBsAdqIgEQmAIgA0GUBmogA0HwBGooAgA2AgAgA0EFOgCIBiADIAMpA+gENwKMBiABIANBiAZqEOoEIABBBGogAUEoEKIHGiAAQQE2AgAMBwsgA0GwB2oiASAHEJ8CIABBBGogAUEoEKIHGiAAQQE2AgAMBgsgA0GwB2oiASAIEJ8CIABBBGogAUEoEKIHGiAAQQE2AgAMBQtBlAEgAkG81sAAEOoFAAtBlAEgBEHM1sAAEOsFAAsgBCACQczWwAAQ6gUACyADQbAHaiIBIAkQnwIgAEEEaiABQSgQogcaIABBATYCAAwBCyADQbAHaiIBIANBiAZqQSgQogcaIANB6ARqIgIgARDGAiAAQQRqIAJBKBCiBxogAEEBNgIACyADQYAJaiQAC9AIAQt/IwBB8AFrIgUkACAFQRhqIANBAmoiBhCgBSAFQQA2AiggBSAFKAIcIgc2AiQgBSAFKAIYNgIgIAVBEGogBhCvBSAFQQA2AjggBSAFKQMQNwMwIAVB4ABqEOYFIAdFBEAgBUEgakEBEMkICyAFQSBqKAIAIAUoAigiBkGQAWxqIAVB4ABqIgdBkAEQogcaIAUgBkEBajYCKCAFQUBrIgZCADcDACAGQRhqQgA3AwAgBkEQakIANwMAIAZBCGpCADcDACAFQgE3A0AgByAGELMCAkAgBSgCYEEBRwRAIAVB2ABqIgggBUGAAWopAwA3AwAgBUHQAGoiCSAFQfgAaikDADcDACAFQcgAaiIKIAVB8ABqKQMANwMAIAUgBUHoAGopAwA3A0AgBSgCOCIGIAUoAjRGBEAgBUEwaiAGQQEQ/wUgBSgCOCEGCyAFKAIwIAZBBXRqIgcgBSkDQDcDACAHQQhqIAopAwA3AwAgB0EQaiAJKQMANwMAIAdBGGogCCkDADcDACAFIAZBAWo2AjggBUHgAGogBEGQARCiBxogBSgCKCAFKAIkRgRAIAVBIGpBARDJCAsgBUEgaigCACAFKAIoIgZBkAFsaiAFQeAAaiIHQZABEKIHGiAFIAZBAWo2AiggByABQbABahCNByAFKAI4IgYgBSgCNEYEQCAFQTBqIAZBARD/BSAFKAI4IQYLIAUoAjAgBkEFdGoiASAFKQNgNwMAIAFBCGogBUHoAGoiCykDADcDACABQRBqIAVB8ABqIgwpAwA3AwAgAUEYaiAFQfgAaiINKQMANwMAIAUgBkEBajYCOCAFQQhqIgEgBEG4A2ooAgAiBzYCBCABQQA2AgACQCAFKAIIIgYgBSgCDCIBSQRAIAEgBmshCiAEKAKwAyAGQZABbGohBCAGQQV0IAJqIQEgBiADIAYgA0sbIg4gBmshAiAGIAcgBiAHSxsiDyAGayEIA0AgCEUNBCAFQeAAaiAEQZABEKIHGiAFKAIoIAUoAiRGBEAgBUEgakEBEMkICyAFQSBqKAIAIAUoAigiBkGQAWxqIAVB4ABqQZABEKIHGiAFIAZBAWo2AiggAkUNAiAFQeAAaiABEI0HIAUoAjgiBiAFKAI0RgRAIAVBMGogBkEBEP8FIAUoAjghBgsgBSgCMCAGQQV0aiIJIAUpA2A3AwAgCUEIaiALKQMANwMAIAlBEGogDCkDADcDACAJQRhqIA0pAwA3AwAgBSAGQQFqNgI4IAJBf2ohAiAEQZABaiEEIAFBIGohASAIQX9qIQggCkF/aiIKDQALCyAAIAVBIGoiACAFQTBqIgEQjwUgARDiByAAEOUHIAVB8AFqJAAPCyAOIANB2NrAABDpBQALIAVByABqIAVB7ABqKAIANgIAIAUgBSkCZDcDQEHD2MAAQSsgBUFAa0GA2cAAQbjawAAQvQUACyAPIAdByNrAABDpBQALvwgCCH8HfgJAAkACQAJAAkAgASkDACINUEUEQCANQv//////////H1YNASADRQ0DQaB/IAEvARgiAUFgaiABIA1CgICAgBBUIgEbIgVBcGogBSANQiCGIA0gARsiDUKAgICAgIDAAFQiARsiBUF4aiAFIA1CEIYgDSABGyINQoCAgICAgICAAVQiARsiBUF8aiAFIA1CCIYgDSABGyINQoCAgICAgICAEFQiARsiBUF+aiAFIA1CBIYgDSABGyINQoCAgICAgICAwABUIgEbIA1CAoYgDSABGyINQj+Hp0F/c2oiBWtBEHRBEHVB0ABsQbCnBWpBzhBtIgFB0QBPDQIgAUEEdCIBQdqQwgBqLwEAIQcCfyABQdCQwgBqKQMAIg5C/////w+DIg8gDSANQn+FQj+IhiIQQiCIIhF+IQ0gDkIgiCISIBBC/////w+DIhB+IQ4CQAJAIBEgEn4gDUIgiHwgDkIgiHwgDUL/////D4MgDyAQfkIgiHwgDkL/////D4N8QoCAgIAIfEIgiHwiD0FAIAFB2JDCAGovAQAgBWprIgFBP3GtIg2IpyIGQZDOAE8EQCAGQcCEPUkNASAGQYDC1y9JDQJBCEEJIAZBgJTr3ANJIgUbIQhBgMLXL0GAlOvcAyAFGwwDCyAGQeQATwRAQQJBAyAGQegHSSIFGyEIQeQAQegHIAUbDAMLIAZBCUshCEEBQQogBkEKSRsMAgtBBEEFIAZBoI0GSSIFGyEIQZDOAEGgjQYgBRsMAQtBBkEHIAZBgK3iBEkiBRshCEHAhD1BgK3iBCAFGwshBUIBIA2GIQ4gCCAHa0EQdEGAgARqQRB1IgcgBEEQdEEQdSIJTA0EIA5Cf3wiESAPgyEPIAFB//8DcSELIAcgBGtBEHRBEHUgAyAHIAlrIANJGyIJQX9qIQxBACEBAkACQAJAA0AgBiAFbiEKIAEgA0YNAiAGIAUgCmxrIQYgASACaiAKQTBqOgAAIAEgDEYNCSABIAhGDQEgAUEBaiEBIAVBCkkgBUEKbiEFRQ0AC0HQnMIAQRlBpJ7CABCABwALIAMgAUEBaiIFIAEgA0kbIQEgC0F/akE/ca0hEkIBIRADQCAQIBKIUEUEQCAAQQA2AgAPCyABIAVGDQIgEEIKfiEQIBEgD0IKfiITgyEPIAIgBWogEyANiKdBMGo6AAAgCSAFQQFqIgVHDQALIAAgAiADIAkgByAEIA8gDiAQEPIBDwsgAyADQbSewgAQ6QUACyABIANBxJ7CABDpBQALQY+MwgBBHEHQncIAEIAHAAtB4J3CAEEkQYSewgAQgAcACyABQdEAQZCbwgAQ6QUAC0GsncIAQSFBlJ7CABCABwALIAAgAiADQQAgByAEIA9CCoAgBa0gDYYgDhDyAQ8LIAAgAiADIAkgByAEIAatIA2GIA98IAWtIA2GIA4Q8gEL9ggCBn8BfiMAQfAHayIDJAAgA0HYAGoiBEHgABCzBSADQdAAaiIFIAQoAgA2AgAgBSAEKAIINgIEAkACQAJAIAEoAgQiBiADKAJUIgRPBEAgAygCUCEFIAYgBGshByABKAIAIgYgBGohCAJAIARBAUcEQCAFIAQgBiAEEIkIDAELIAUgBi0AADoAAAsgASAHNgIEIAEgCDYCAAwBC0ERQdC6wABBGxDFByIJQv8Bg0IDUg0BCyADQcgAaiIEIANB2ABqIgUoAgg2AgQgBCAFKAIANgIAAkAgAygCTARAIAMoAkgsAABBAEggAnMNAQJAAkACfwJAAkAgAkUEQCADQegAaiICQeAAELMFIANBQGsiBCACKAIANgIAIAQgAigCCDYCBCABKAIEIgUgAygCRCICSQ0BIAMoAkAhBCAFIAJrIQYgASgCACIFIAJqIQcCQCACQQFHBEAgBCACIAUgAhCJCAwBCyAEIAUtAAA6AAALIAEgBjYCBCABIAc2AgAMAgsgA0H4AGoiARDHCCADQRhqIgJB4AA2AgQgAiABNgIAIAMoAhwhAiADKAIYIANBEGoiBSADQdgAaiIGKAIINgIEIAUgBigCADYCACACIAMoAhAgAygCFBCJCCADQdgEaiABEN4DIAMoAtgEQQFGBEAgA0G4BmogA0HsBGopAgA3AwAgA0GwBmogA0HkBGopAgA3AwAgAyADKQLcBDcDqAYgA0EIaiADQagGahCJBUEMIAMoAgggAygCDBCVBiEJIABBATYCACAAIAk3AgQMBQsgA0GoBmoiASADQeAEakHIARCiBxogA0G4AmoiAiABEOUDIABBCGogAkGgAhCiBxogAEEANgIAIANB2ABqDAILQRFB0LrAAEEbEMUHIglC/wGDQgNSDQILIANBOGoiASADQegAaiICKAIINgIEIAEgAigCADYCACADKAI4IQQgA0HYAGoiASADKAI8IgIQxQggASgCACADKAJgaiAEIAIQogcaIANBADYCcCADIAMoAmAgAmo2AmAgA0H4AGoiAkEAQcABEO0HGiADQTBqIgRBwAE2AgQgBCACNgIAIAMoAjQhBCADKAIwIANBKGoiBiABKAIINgIEIAYgASgCADYCACAEIAMoAiggAygCLBCJCCADQdgEaiACEKoDIAMoAtgEQQFGBEAgA0G4BmogA0HsBGopAgA3AwAgA0GwBmogA0HkBGopAgA3AwAgAyADKQLcBDcDqAYgA0EgaiADQagGahCJBUEMIAMoAiAgAygCJBCVBiEJDAILIANBqAZqIgEgA0HgBGpByAEQogcaIANBuAJqIgIgARDlAyAAQQhqIAJBoAIQogcaIABBADYCACADQegAahCiCCADQdgA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aikDADcDACACQeAAaiACQRhqKQMANwMAIAJB2ABqIAJBEGopAwA3AwAgAiACKQMINwNQIAJBKGogAkHQAGoQswIgAigCKEEBRg0DIAJB6ABqIAJByABqKQMANwMAIAJB4ABqIAJBQGspAwA3AwAgAkHYAGogAkE4aikDADcDACACIAJBMGopAwA3A1BCACEHQQAhAQNAIAAgAWoiAykDACIJIAd8IgcgAkHQAGogAWopAwB8IQggAyAINwMAIAcgCVStIAggB1StfCEHIAFBCGoiAUEgRw0AC0EYIQECQANAIAFBeEcEQCAAIAFqKQMAIgcgAUHo4cEAaikDACIIVA0CIAFBeGohASAHIAhYDQELC0IAIQdBACEBA0AgACABaiIDKQMAIgkgAUHo4cEAaikDACIKfSEIIAMgCCAHfTcDACAJIApUrSAIIAdUrXxCAVGtIQcgAUEIaiIBQSBHDQALCyACQfAAaiQADwsgAiAGOgAoIAIgB0I4iDwALyACIAdCKIg9AC0gAiAHQgiIPgApQYDfwQBBKyACQShqQazfwQBBsODBABC9BQALIAJB2ABqIAJBNGooAgA2AgAgAiACKQIsNwNQQYDfwQBBKyACQdAAakG838EAQcDgwQAQvQUACyACIAE6ACggAiAHQjiIPAAvIAIgB0IoiD0ALSACIAdCCIg+AClBgN/BAEErIAJBKGpBrN/BAEHw4MEAEL0FAAsgAkHYAGogAkE0aigCADYCACACIAIpAiw3A1BBgN/BAEErIAJB0ABqQbzfwQBBgOHBABC9BQAL/QcCCX8BfiMAQfACayICJAAgAkEIaiABQTAQogcaAkACQCACLAAIIgNBf0wEQAJAAkAgA0HAAHFFBEAgAiADQR9xOgAIIAJBOGoiAUEAQTAQ7QcaIAJBMDYCxAIgAiACQQhqNgLAAiABIAJBwAJqELICIgunIgFB/wFxQQNHDQQgAkHAAmoiASACQThqQTAQogcaIAJB2AFqIAEQvANBASEEAn8gAigC2AFBAUYEQCACQdABaiACQeQBaigCADYCACACIAIpAtwBNwPIAUHAs8EAIQZBDAwBCyACQdABaiACQfABaigCADYCACACQcgCaiACQfwBaikCADcDACACQdACaiACQYQCaikCADcDACACQdgCaiACQYwCaigCADYCACACIAJB6AFq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RQ0ACwwECyAJIAxrIAVqIQkgBSEMIAUgC0cNAQsLIANFIAEgA0ZyDQAgAyABTw0CIAAgA2osAABBv39MDQILQQEhByACKAIYIAAgA2ogASADayACKAIcKAIMEQEADQAgAigCGEEiIAIoAhwoAhARAgAhBwsgBw8LIAAgASADIAFB9KbCABB4AAuECQEBfyMAQTBrIgIkAAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAAtAABBAWsOEQIDBAUGBwgJCgsMDQ4PEBEAAQsgASgCGCAAQQRqKAIAIABBCGooAgAgAUEcaigCACgCDBEBAAwRCyACIAAtAAE6AAggAkEsakEBNgIAIAJCAjcCHCACQfiQwQA2AhggAkGCAjYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwQCyACIABBCGopAwA3AwggAkEsakEBNgIAIAJCAjcCHCACQdyQwQA2AhggAkHeATYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwPCyACIABBCGopAwA3AwggAkEsakEBNgIAIAJCAjcCHCACQdyQwQA2AhggAkGDAjYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwOCyACIABBCGopAwA3AwggAkEsakEBNgIAIAJCAjcCHCACQcCQwQA2AhggAkGEAjYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwNCyACIABBBGooAgA2AgggAkEsakEBNgIAIAJCAjcCHCACQaCQwQA2AhggAkGFAjYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwMCyACIABBBGopAgA3AwggAkEsakEBNgIAIAJCATcCHCACQYyQwQA2AhggAkGGAjYCFCACIAJBEGo2AiggAiACQQhqNgIQIAEgAkEYahDuBQwLCyACQSxqQQA2AgAgAkHEjsEANgIoIAJCATcCHCACQfyPwQA2AhggASACQRhqEO4FDAoLIAJBLGpBADYCACACQcSOwQA2AiggAkIBNwIcIAJB6I/BADYCGCABIAJBGGoQ7gUMCQsgAkEsakEANgIAIAJBxI7BADYCKCACQgE3AhwgAkHUj8EANgIYIAEgAkEYahDuBQwICyACQSxqQQA2AgAg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IAMoAjBqQQA6AAAgAyADKAIwQQFqIgQ2AjAgAygCLCAERgRAIANBKGpBARDFCAsgA0EoaigCACADKAIwakEAOgAAIAMgAygCMEEBaiIENgIwIAMgBDYCPCADKAIsIARGBEAgA0EoakEBEMUICyADQShqIgQoAgAgAygCMGpBADoAACADIAMoAjBBAWo2AjAgBCADQSRqQQQQuAggA0EAOgBoIAMgAjYCZCADQQA2AmAgA0FAayICIANB4ABqIgYQpgQgA0EQaiIFIAIoAgg2AgQgBSACKAIANgIAIAMoAhAhAiADKAIUIQUgA0HwAGogA0E8ajYCACADQewAaiADQThqNgIAIAMgBUECdCACajYCZCADIAI2AmAgAyAENgJoIANB0ABqIAYQvAUgA0GQBGogAUGgAhCiBxogAygCWCIBRQ0CIANBsAZqIgIgAygCUCIEQZABEKIHGiADQQhqIAFBf2oiARCgBSADKAIMIQYgAygCCCAEQZABaiABQZABbBCiByEEIANB4ABqIgUgAkGQARCiBxogA0HwAWogA0GQBGpBoAIQogcaIABBCGogBUGwAxCiBxogAEHAA2ogATYCACAAQbwDaiAGNgIAIABBuANqIAQ2AgAgAEEANgIAIANB0ABqEOUHIANBQGsQ/wcgA0EoahCiCAwDCyADQeAAaiIBIAcQnwIgAEEEaiABQSgQogcaIABBATYCACADQShqEKIIDAILIANBADoAkAQgA0HgAGoiASADQZAEahDqBCAAQQRqIAFBKBCiBxogAEEBNgIADAELQQBBAEGc3sAAEOkFAAsgA0HAB2okAAvhBgENfyMAQcABayIFJAACfyACBEBBASABLQAAQS9GDQEaC0EACyEHIAUgBSgAYDYCCCAFIAVB4wBqKAAANgALAn8gBARAQQEgAy0AAEEvRg0BGgtBAAshBiAFQSlqIAUoAGA2AAAgBUEsaiAFQeMAaigAADYAACAFQQY6ACggBSAENgIkIAUgAzYCICAFQYAEOwA9IAUgBjoAPCAFQYQBaiENIAVB4ABqQQRyIQ4gBUHJAGohAyAFQYABaiEGQQIhC0EGIQkCQANAAkAgCUEGRwRAIAVB7wBqIAVBF2ooAAA2AAAgBUHoAGogBUEQaikCADcDACAFIAUpAgg3A2ALIAMgBSkDYDcAACADQQhqIg8gBUHo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QcGhwgBBK0HssMIAEIAHAAsgAiADQdywwgAQ6wUACyADQa8BQdywwgAQ6gUAC0HBocIAQStB7LDCABCABwAL6wUCA38EfiMAQZADayIEJAAgBEEIaiIFIAFBMBCiBxogBRBDIAUgARA7A0AgBEEIaiADaiIFKQMAIgggBnwiBiADQfi0wQBqKQMAfCEHIAUgBzcDACAGIAhUrSAHIAZUrXwhBiADQQhqIgNBMEcNAAtBKCEDAkADQCADQXhHBEAgBEEIaiADaikDACIGIANBwMzBAGopAwAiB1QNAiADQXhqIQMgBiAHWA0BCwtCACEGQQAhAwNAIARBCGogA2oiBSkDACIIIANBwMzBAGopAwAiCX0hByAFIAcgBn03AwAgCCAJVK0gByAGVK18QgFRrSEGIANBCGoiA0EwRw0ACwsgBEE4aiAEQQhqEMAEAkAgBCkDOEIBUgRAIABBAjoAYAwBCyAEQdABaiAEQUBrIgNBMBCiBxogBEGAAmogA0EwEKIHGkEAIQMCQANAIANBMEYNASAEQYACaiADaiADQQhqIQMpAwBQDQALIARB8ABqQcDMwQBBMBCiBxpCACEGQQAhAwNAIARB8ABqIANqIgUpAwAiCCAEQYACaiADaikDACIJfSEHIAUgByAGfTcDACAIIAlUrSAHIAZUrXxCAVGtIQYgA0EIaiIDQTBHDQALIARBgAJqIARB8ABqQTAQogcaCyAEQbACaiABQTAQogcaIARB4AJqIARB0AFqEE8gBEHwAGogBEGAAmoQT0EoIQMCQAJAAkADQCADQXhGBEAgBEGAAmohAyACDQMMBAsgBEHgAmogA2opAwAiBiAEQfAAaiADaikDACIHVA0BIANBeGohAyAGIAdYDQALIARBgAJqIQMgAg0BDAILIARBgAJqIQMgAg0BCyAEQdABaiEDCyAEQeACaiIBIANBMBCiBxogBEHwAGoiAiAEQbACakEwEKIHGiAEQaABaiABQTAQogcaIAAgAkHgABCiByIAQQA6AGAgACAEKADgAjYAYSAAQeQAaiAEQeMCaigAADYAAAsgBEGQA2okAAukBQESfyMAQYAGayICJAAgAiABQeAAEKIHIgIQYyACQeAAaiIFIAFB4ABqIglB4AAQogcaIAUQYyACQcABaiIHIAVB4AAQogcaIAcQYyACQaACaiIDIAVB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8ABqIAFqKQMAfCEFIAMgBTcDACAEIAZUrSAFIARUrXwhBCABQQhqIgFBMEcNAAtBKCEBAkADQCABQXhHBEAgACABaikDACIEIAFBsNvBAGopAwAiBVQNAiABQXhqIQEgBCAFWA0BCwtCACEEQQAhAQNAIAAgAWoiAykDACIGIAFBsNvBAGopAwAiB30hBSADIAUgBH03AwAgBiAHVK0gBSAEVK18QgFRrSEEIAFBCGoiAUEwRw0ACwsgAkGgAWokAA8LIAIgAzoAOCACIARCOIg8AD8gAiAEQiiIPQA9IAIgBEIIiD4AOUH418EAQSsgAkE4akG02MEAQajZwQAQvQUACyACQfgAaiACQcQAaigCADYCACACIAIpAjw3A3BB+NfBAEErIAJB8ABqQaTYwQBBuNnBABC9BQALIAIgAToAOCACIARCOIg8AD8gAiAEQiiIPQA9IAIgBEIIiD4AOUH418EAQSsgAkE4akG02MEAQfjZwQAQvQUACyACQfgAaiACQcQAaigCADYCACACIAIpAjw3A3BB+NfBAEErIAJB8ABqQaTYwQBBiNrBABC9BQAL0gYCBn8BfiMAQYADayIBJAACQAJAAkACQCAAKAIARQRAIAEQowg2AvgBQQJBARC3CCIARQ0CIABBgMAAOwAAIAFCgoCAgCA3AlwgASAANgJYIAFBEGoiACABQdgAaiICKAIANgIAIAAgAigCCDYCBCABQfgBaiABKAIQIAEoAhQQxgggAUEwaiABKAJgNgIAIAEgASkDWDcDKAwBCyABQeAAaiAAQQhqKAIANgIAIAEgACkCADcDWCABQSBqIgIgAUHYAGoiACgCCDYCBCACIAAoAgA2AgAgASgCICEDIAFBGGogASgCJCICQQAQ9AUgAUEANgIwIAEgASkDGDcDKCABQShqKAIAIAMgAhCiBxogASACNgIwIAAQoggLIAFBCGoiACABQShqIgIoAgg2AgQgACACKAIANgIAIAFBOGogASgCCCABKAIMEKgDIAFB2ABqIgAQ5gUgAUGQAmoiAiABQdAAaiIDKQMANwMAIAFBiAJqIgQgAUHIAGoiBSkDADcDACABQYACaiABQUBrIgYpAwA3AwAgASABKQM4NwP4ASAAIAFB+AFqEOYCIAFBADYC8AEgAUIBNwPoASAAIAFB6AFqQQEQtgIiB6ciAEH/AXFBA0cNASABQbgCaiIAIAFB8AFqKAIANgIAIAEgASkD6AE3A7ACIAFB+AJqIAMpAwA3AwAgAUHwAmogBSkDADcDACABQegCaiAGKQMANwMAIAEgASkDODcD4AIgAUHAAmogAUHgAmoiAxD4CCABQagCaiAAKAIANgIAIAQgAUHIAmopAwA3AwAgAiABQdACaikDADcDACABQZgCaiABQdgCaikDADcDACABQgE3A/gBIAEgASkDsAI3A6ACIAEgASkDwAI3A4ACIAEgAUH4AWogAxC9AyABKAIEIQAgASgCAA0CIAFB+AFqENYHIAFBKGoQogggAUGAA2okACAADwtBAkEBQbTIwgAoAgAiAEHaAiAAGxEAAAALIAEgADoA+AEgASAHQjiIPAD/ASABIAdCKIg9AP0BIAEgB0IIiD4A+QFBvJDAAEErIAFB+AFqQfiQwABBmJHAABC9BQALIAEgADYC4AJBvJDAAEErIAFB4AJqQeiQwABBqJHAABC9BQAL0gYCBn8BfiMAQZAEayIBJAACQAJAAkACQCAAKAIARQRAIAEQowg2AogDQQJBARC3CCIARQ0CIABBgMAAOwAAIAFCgoCAgCA3AlwgASAANgJYIAFBEGoiACABQdgAaiICKAIANgIAIAAgAigCCDYCBCABQYgDaiABKAIQIAEoAhQQxgggAUEwaiABKAJgNgIAIAEgASkDWDcDKAwBCyABQeAAaiAAQQhqKAIANgIAIAEgACkCADcDWCABQSBqIgIgAUHYAGoiACgCCDYCBCACIAAoAgA2AgAgASgCICEDIAFBGGogASgCJCICQQAQ9AUgAUEANgIwIAEgASkDGDcDKCABQShqKAIAIAMgAhCiBxogASACNgIwIAAQoggLIAFBCGoiACABQShqIgIoAgg2AgQgACACKAIANgIAIAFBOGogASgCCCABKAIMEKgDIAFB2ABqIgAQ0gMgAUGgA2oiAiABQdAAaiIDKQMANwMAIAFBmANqIgQgAUHIAGoiBSkDADcDACABQZADaiABQUBrIgYpAwA3AwAgASABKQM4NwOIAyAAIAFBiANqEOMCIAFBADYCgAMgAUIBNwP4AiAAIAFB+AJqQQEQtAIiB6ciAEH/AXFBA0cNASABQcgDaiIAIAFBgANqKAIANgIAIAEgASkD+AI3A8ADIAFBiARqIAMpAwA3AwAgAUGABGogBSkDADcDACABQfgDaiAGKQMANwMAIAEgASkDODcD8AMgAUHQA2ogAUHwA2oiAxD4CCABQbgDaiAAKAIANgIAIAQgAUHYA2opAwA3AwAgAiABQeADaikDADcDACABQagDaiABQegDaikDADcDACABQgE3A4gDIAEgASkDwAM3A7ADIAEgASkD0AM3A5ADIAEgAUGIA2ogAxC9AyABKAIEIQAgASgCAA0CIAFBiANqENYHIAFBKGoQogggAUGQBGokACAADwtBAkEBQbTIwgAoAgAiAEHaAiAAGxEAAAALIAEgADoAiAMgASAHQjiIPACPAyABIAdCKIg9AI0DIAEgB0IIiD4AiQNBvJDAAEErIAFBiANqQfiQwABBmJHAABC9BQALIAEgADYC8ANBvJDAAEErIAFB8ANqQeiQwABBqJHAABC9BQAL4AQBCn8jAEHQKGsiAiQAIAIgAUHABBCiByICQaACahDNByACQcAEaiABEJ8DIAAgAikDwARCAVEEfiACQYgJaiIBIAJByARqQcAEEKIHGiACQcgNaiIFIAJBwAQQogcaIAUgARDaBCABIAVBwAQQogcaIAVBAhCEByAFIAEQ2gQgAkGIEmoiCCAFQcAEEKIHGiAIELQEIAJByBZqIgMgCEHABBCiBxogAkKAgISAgIDAgFI3A4gkIAJBkCRqIgQgAyACQYgkaiIHEJ0EIAMgBEHABBCiBxogAkHoGGoiCRDNByACQYgbaiIBIANBwAQQogcaIAJCgICCgICAoIDpADcDiCQgBCABIAcQnQQgASAEQcAEEKIHGiACQagdaiIKEM0HIAJByB9qIgYgBUHABBCiBxogAkHoIWoiCxDNByADIAYQ2gQgCRDNByADIAEQ2gQgASADQcAEEKIHGiACQoCAhICAgMCAUjcDiCQgBCABIAcQnQQgASAEQcAEEKIHGiAKEM0HIAYgAUHABBCiBxogAkKAgISAgIDAgFI3A4gkIAQgBiAHEJ0EIAYgBEHABBCiBxogCxDNByAJEM0HIAYgAxDaBCAJEM0HIANBAxCEByABQQIQhAcgAyABENoEIAEgBkHABBCiBxogAkKAgISAgIDAgFI3A4gkIAQgASAHEJ0EIAEgBEHABBCiBxogChDNByABIAgQ2gQgASAFENoEIAMgARDaBCABIAZBwAQQ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RQRAQZOCwABBCBD1BSEBIABBATYCACAAIAE2AgQgAkGICGoQgwhBACEBDAYLIAIpAowEIQUgAEEIaiACQYgIakHwAxCiBxogAEH8A2ogBTcCACAAQfgDaiABNgIAIABBADYCACACKAIIIgBBJEkNBiAAEAAMBgtBjILAAEEHEPYFIQMgAEEBNgIAIAAgAzYCBAwEC0GTgsAAQQgQ9gUhAyAAQQE2AgAgACADNgIEDAMLQYyCwABBBxD1BSEDIABBATYCACAAIAM2AgQMAgsgAigCBCEDIABBATYCACAAIAM2AgQMAQsgACACKAKMCDYCBCAAQQE2AgALIAIoAogEBEAgAkGIBGoiABCUByAAEN0HCyABQQFzIAIpA9gDQgJRckUEQCACQRhqEIMICyACKAIIIgBBJEkNACAAEAALIAJBgAxqJAAL0wYCAn8BfiMAQfAAayICJAACfwJAAkACQAJAAkACQAJAAkACQCAALQAAQQFrDggCAwQFBgcIAAELIAIgAEEEajYCVCACQThqIgBBmAE2AgQgACACQdQAajYCACACQewAakEBNgIAIAJCATcCXCACQfy/wAA2AlggAiACKQM4NwNAIAIgAkFAazYCaCABIAJB2ABqEO4FDAgLIAJB7ABqQQA2AgAgAkH8v8AANgJoIAJCATcCXCACQbDFwAA2AlggASACQdgAahDuBQwHCyACIABBBGo2AlQgAkEQaiIAQZkBNgIEIAAgAkHUAGoiADYCACACKQMQIQQgAkEIaiIDQZkBNgIEIAMgADYCACACQewAakECNgIAIAIgBDcDQCACQgI3AlwgAkGMxcAANgJYIAIgAikDCDcDSCACIAJBQGs2AmggASACQdgAahDuBQwGCyACIABBBGo2AlQgAkEYaiIAQZkBNgIEIAAgAkHUAGo2AgAgAkHsAGpBATYCACACQgE3AlwgAkHYxMAANgJYIAIgAikDGDcDQCACIAJBQGs2AmggASACQdgAahDuBQwFCyACQewAakEANgIAIAJB/L/AADYCaCACQgE3AlwgAkGgxMAANgJYIAEgAkHYAGoQ7gUMBAsgAkHsAGpBADYCACACQfy/wAA2AmggAkIBNwJcIAJB6MPAADYCWCABIAJB2ABqEO4FDAMLIAIgAEEEajYCVCACQSBqIgBBmAE2AgQgACACQdQAajYCACAC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AksNASADQYgGaiABIARqIAIgBGsQigcgAygCiAZBAUcNAiADQYgMaiIBIANBiAZqQQRyQSgQogcaIANBCGoiAkHjADYCBCACIAE2AgAgA0HUDGpBATYCACADQgE3AsQMIANBkKPAADYCwAwgAyADKQMINwPYDCADIANB2AxqNgLQDCADQbAMaiIBIANBwAxqEJgCIAMgASgCCDYCBCADIAEoAgA2AgAgAygCACADKAIEEAEhAiABEKIIAkAgAy0AiAwiAUEHTQRAIAFBBUcNASADQYgMakEEchCiCAwBCyADQYgMakEEchCiCAsCQCADKAKYDEUEQCADQZwMahCSCAwBCyADQaAMaiIEKAIAIQEgAygCnAwiBRCSCCAFIAEoAggiBUETakEAIAVrcWogASgCABEEACADKAKcDCAEKAIAIgQoAggiBUEEIAVBBEsbIgUgBCgCBGpBE2pBACAFa3FFDQAQegsgACACNgIEQQEMAwtBAiACQfCiwAAQ6gUACyAEIAJBgKPAABDsBQALIANBGGoiAiADQZAGakHwBRCiBxogA0EQaiAEQQAQ9AUgA0EANgKQDCADIAMpAxA3A4gMIANBiAxqKAIAIAEgBBCiBxogAyAENgKQDCADQYgGaiIBIAJB8AUQogcaIANBgAxqIAMoApAMNgIAIAMgAykDiAw3A/gLIABBCGogAUGABhCiBxpBAAs2AgAgA0HgDGokAAvHBAEIfyMAQaABayIEJAAgBEGIAWogAUEIaigCADYCACAEIAEpAgA3A4ABIARBGGogA0EYaikDADcDACAEQRBqIANBEGopAwA3AwAgBEEIaiADQQhqKQMANwMAIAQgAykDADcDACAEQShqIARBgAFqIAIgBBD6ASAEKAJoIQUCQCAEKAIoQQFGBEAgBEHkAGooAgAhBiAEQeAAaigCACEHIARB2ABqKAIAIQggBEEwaigCACEJIARB3ABqKAIAIQIgBCAEQTRqIgtBJBCiByEBAkAgAigC4AIiCgRAIAFBBGohAwNAIAEgAi8BkAM2AnggASAKNgJ0IAEgCEEBajYCcCABQZgBaiADQRhqKQIANwMAIAFBkAFqIANBEGopAgA3AwAgAUGIAWogA0EIaikCADcDACABIAMpAgA3A4ABIAFBKGogAUHwAGogCSABQYABaiAHIAYQ/QEgASgCKEEBRw0CIAEoAmQhBiABKAJgIQcgASgCWCEIIAEoAjAhCSABKAJcIQIgASALQSQQogcaIAIoAuACIgoNAAsLIABBATYCACAAQQhqIAk2AgAgAEEMaiABQSQQogcaIAAgBTYCQCAAQTxqIAY2AgAgAEE4aiAHNgIAIABBNGogAjYCACAAQTBqIAg2AgAMAgsgACAFNgJAIAAgASkCLDcCBCAAQQA2AgAgAEEMaiABQTRqKAIANgIADAELIAAgBTYCQCAAIAQpAiw3AgQgAEEANgIAIABBDGogBEE0aigCADYCAAsgBEGgAWokAAu8BAIEfwJ+IwBBkAZrIgMkACADQQhqIgQgAUHgABCiBxogBBBjIAQgARBrIANB0AFqIgVB+JzBAEEwEKIHGiADQYACakH4nMEAQTAQogchBiAEIAUQogMgA0E4aiAGEKIDIANB6ABqIAQQgQECQCADKQNoQgFSBEAgAEECOgDAAQwBCyADQZADaiADQfAAaiIEQeAAEKIHGiADQfADaiIFIARB4AAQogcaIAUQowQgA0GgBGoiBBCjBCADQdAEaiABQeAAEKIHGiADQbAFaiADQcADahBPIANB0AFqIAQQT0EoIQECQAJAAkACQAJAA0AgAUF4Rg0BIANBsAVqIAFqKQMAIgcgA0HQAWogAWopAwAiCFQNAiABQXhqIQEgByAIWA0ACyADQfADaiEBIAINAwwECyADQbAFaiADQZADahBPIANB0AFqIANB8ANqEE9BKCEBA0AgAUF4RgRAIANB8ANqIQEgAg0EDAULIANBsAVqIAFqKQMAIgcgA0HQAWogAWopAwAiCFQNAiABQXhqIQEgByAIWA0ACyADQfADaiEBIAINAgwDCyADQfADaiEBIAJFDQEMAgsgA0HwA2ohASACDQELIANBkANqIQELIANBsAVqIgIgAUHgABCiBxogA0HQAWoiASADQdAEakHgABCiBxogA0GwAmogAkHgABCiBxogACABQcABEKIHIgBBADoAwAEgACADKACwBTYAwQEgAEHEAWogA0GzBWooAAA2AAALIANBkAZqJAAL5gQBBH8jAEHQDGsiAiQAAkACQCABLQAERQRAIAJBmAhqIAEoAgAQmQMgAigCnAghBCACKAKYCCEDIAJBmARqIAJBoAhqIgVBgAQQogcaAkACQCADQQFHBEAgAkEYaiACQZgEakGABBCiBxogBSACQegDaikDADcDACACQagIaiIEIAJB8ANqKQMANwMAIAJBsAhqIgMgAkH4A2opAwA3AwAgAiACQeADaikDADcDmAggAikD2ANCAVINASACQbgMaiADKQMANwMAIAJBsAxqIAQpAwA3AwAgAkGoDGogAkGgCGoiBSkDADcDACACIAIpA5gINwOgDCACQcAMaiIEIAIoAogEIgMgAkGQBGooAgBBDGwgA2oQ7gYgAkEQaiIDIAQoAgg2AgQgAyAEKAIANgIAIAJBmAhqIAIoAhAgAigCFCACQaAMaiACQRhqEF9BASEDAkAgAigCmAhBAUYEQCACQZgEaiIFIAJBmAhqQQRyQSgQogcaQayYwABBDhABIQQgBRDmAwwBCyACQZgEaiIEIAVB0AEQogcaIAJBCGogBBCIByACKAIMIQQgAigCCA0DQQAhAwsgAkHADGoQ4gcgAkGgDGoQjwggAkHIA2oQ5QcgAkGIBGoiBRCUByAFEN0HDAULDAMLQayYwABBDhABIQQgAkHIA2oQ5QcgAkGIBGoiAxCUByADEN0HDAILIAIgBDYCzAxB7pfAAEErIAJBzAxqQZyYwABB3JjAABC9BQALQaCXwABBI0HMmMAAEIAHAAtBASEDCyABQQE6AAQgACAENgIEIAAgAzYCACACQdAMaiQAC9MEAQl/IwBBEGsiBCQAAkAgACgCCEEBRwRAIAAgARDLASECDAELIABBDGooAgAhBSAEQQxqIAFBDGooAgAiBjYCACAEIAEoAggiAjYCCCAEIAFBBGooAgAiAzYCBCAEIAEoAgAiATYCACAALQAgIQggACgCBCEJAkACfyAALQAAQQhxRQRAIAghByADDAELIAAoAhggASADIABBHGooAgAoAgwRAQANAUEBIQcgAEEBOgAgIABBMDYCBCAEQQA2AgQgBEGEiMIANgIAQQAgBSADayIBIAEgBUsbIQVBAAshASAGBEAgBkEMbCACaiEKA0AgAiIDQQxqIQICfwJAAkACQCADLwEAQQFrDgICAAELIANBCGooAgAMAgsgA0EEaigCAAwBCyADQQJqLwEAIgZB6AdPBEBBBEEFIAZBkM4ASRsMAQtBASAGQQpJDQAaQQJBAyAGQeQASRsLIAFqIQEgAiAKRw0ACwsCfwJAIAUgAUsEQEEAIQIgBSABayIDIQECQAJAAkAgB0EDcUEBaw4DAQABAgsgA0EBdiECIANBAWpBAXYhAQwBC0EAIQEgAyECCyACQQFqIQIDQCACQX9qIgJFDQIgACgCGCAAKAIEIAAoAhwoAhARAgBFDQALDAMLIAAgBBDLAQwBCyAAKAIEIAAgBBDLAQ0BIQMgAUEBaiECIAAoAhwhByAAKAIYIQUDQEEAIAJBf2oiAkUNARogBSADIAcoAhARAgBFDQALQQELIQIgACAIOgAgIAAgCTYCBAwBC0EBIQILIARBEGokACACC7oEAgV/AXwjAEGQAWsiAyQAAkAgABCGCARAQQchAAwBC0EBQQIgACgCABAwIgRBAUYbQQAgBBtB/wFxIgRBAkcEQEEAIQAMAQsgA0EgaiAAEJwHAnwgAykDIKdBAUcEQCADQUBrIAAQwgYCfwJAIAMoAkBFBEAgA0HQAGogABCUBCADKAJQRQ0BIANB6ABqIANB2ABqKAIANgIAIAMgAykDUDcDYCADQRBqIgAgA0HgAGoiBCgCCDYCBCAAIAQoAgA2AgBBASEHIAMoAhQhBCADKAIQIQVBBgwCCyADQThqIANByABqKAIANgIAIAMgAykDQDcDMCADQRhqIgAgA0EwaiIFKAIINgIEIAAgBSgCADYCAEEBIQZBBSEAIAMoAhghBSADNQIcvwwDC0EBIQYgA0GEAWpBATYCACADQgE3AnQgA0Hg7sAANgJwIANB5AA2AowBIAMgADYCiAEgAyADQYgBajYCgAEgA0HgAGogA0HwAGoQmAIgA0E4aiADQegAaigCADYCACADIAMpA2A3AzAgA0EIaiIAIANBMGoiBCgCCDYCBCAAIAQoAgA2AgAgAygCDCEEIAMoAgghBUERCyEAIAStvyIIIAMoAkBFDQEaIANBQGsQoggMAgtBAyEAIAMrAygLIQgLIANB+ABqIAg5AwAgAyAFNgJ0IAMgBDoAcSADIAA6AHAgA0HwAGogASACEN4FIAcEQCADQeAAahCiCAsgBgRAIANBMGoQoggLIANBkAFqJAALpAUBBH8gACABaiECAkACQCAAKAIEQQFxDQAgACgCACEDAkAgAC0ABEEDcQRAIAEgA2ohASAAIANrIgBB7MvCACgCAEcNASACKAIEQQNxQQNHDQJB5MvCACABNgIAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIADwsMAgsgA0GAAk8EQCAAELcCDAELIABBDGooAgAiBCAAQQhqKAIAIgVHBEAgBSAENgIMIAQgBTYCCAwBC0HUyMIAQdTIwgAoAgBBfiADQQN2d3E2AgALAkAgAi0ABEECcUEBdgRAIAIgAigCBEF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIADAELAkBB8MvCACgCACACRwRAQezLwgAoAgAgAkcNAUHsy8IAIAA2AgBB5MvCAEHky8IAKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LQfDLwgAgADYCAEHoy8IAQejLwgAoAgAgAWoiATYCACAAIAFBAXI2AgRB7MvCACgCACAARw0CQeTLwgBBADYCAEHsy8IAQQA2AgAPCyACKAIEQXhxIgMgAWohAQJAIANBgAJPBEAgAhC3AgwBCyACQQxqKAIAIgQgAkEIaigCACICRwRAIAIgBDYCDCAEIAI2AggMAQtB1MjCAEHUyMIAKAIAQX4gA0EDdndxNgIACyAAIAFBAXI2AgQgACABaiABNgIAQezLwgAoAgAgAEcNAEHky8IAIAE2AgAPCyABQYACTwRAIAAgARCsAg8LIAFBA3YiAkEDdEHcyMIAaiEBAn9B1MjCACgCACIDQQEgAnQiAnEEQCABKAIIDAELQdTIwgAgAiADcjYCACABCyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCAsLmQUCA38BfiMAQfAAayIBJAACf0EAIAAoAgAiAkUNABogASAAKQIENwJcIAEgAjYCWCABQThqIgAgAUHYAGoiAykCADcCACAAQQhqIANBCGooAgA2AgAgASgCOCEDAkACQCABKAJAIgJBB00EQCACRQ0CQQAhAANAIAAgA2otAABFDQIgAiAAQQFqIgBHDQALDAILIAFBEGpBACADIAIQkwIgASgCEEUNASABKAIUIQALIAFB4ABqIAEpAjw3AwAgASADNgJcIAEgADYCWEHY98EAQS8gAUHYAGpB7PXBAEGI+MEAEL0FAAsgAUHgAGogAUFAaygCADYCACABIAEpAzg3A1ggAUEIaiABQdgAahDeASABKAIMIQIgASgCCAshA0GgzMIALQAAIQBBoMzCAEEBOgAAIAEgADoAHwJAIABFBEACQEHgxMIAKQMAIgRCf1IEQEHgxMIAIARCAXw3AwAgBEIAUg0BQbD1wQBBK0HI98EAEIAHAAtBgPfBAEE3Qbj3wQAQ+wcAC0GgzMIAQQA6AABBIEEIELcIIgBFDQEgAEIANwMYIAAgAjYCFCAAIAM2AhAgACAENwMIIABCgYCAgBA3AwAgAUHwAGokACAADwsgAUHMAGpB8QE2AgAgAUHEAGpB2QI2AgAgAUE0akEDNgIAIAEgAUEfajYCUCABQcT4wQA2AlQgAUHsAGpBADYCACABQgM3AiQgAUHYgcIANgIgIAFB2QI2AjwgAUGk9MEANgJoIAFCATcCXCABQZyEwgA2AlggASABQThqNgIwIAEgAUHYAGo2AkggASABQdQAajYCQCABIAFB0ABqNgI4IAFBIGpB1ITCABDsBwALQSBBCEG0yMIAKAIAIgBB2gIgABsRAAAAC9oDAQt/IwBBwARrIggkACAAQcABaiEHAkACQANAIAFBMEcEQCABIAdqIAFBCGohASkDAFANAQwCCwsgAEHwAWohAkEAIQEDQCABQTBGDQIgASACaiABQQhqIQEpAwBQDQALCyAIIABB4AAQogciARBjIAFB4ABqIgMgAEHgAGoiCUHgABCiBxogAxBjIAFBwAFqIgQgA0HgABCiBxogBBBjIAFBoAJqIgIgAEHgABCiBxogAiADEKIDIAFB0AJqIgMgAUGQAWoQogMgAhBjIAIgARCjAyADIAFBMGoiChCjAyACIAQQowMgAyABQfABaiIFEKMDIAIQyAMgAxDIAyABQYADaiIGIAFB4AAQogcaIAYQyAMgAUGwA2oiCxDIAyAGIAEQogMgCyAKEKIDIAFB4ANqIgEgBkHgABCiBxogARBjIAcgCRBrIAcQyAMgAEHwAWoQyAMgACABQeAAEKIHIgAgAhCjAyAAQTBqIgEgAxCjAyAAIAIQowMgASADEKMDIAkgAkHgABCiByICIAAQowMgAEGQAWoiACABEKMDIAIgBhBrIAQQyAMgBRDIAyAEEMgDIAUQyAMgBBDIAyAFEMgDIAIgBBCjAyAAIAUQowMLIAhBwARqJAALqwQBBH8jAEEQayIDJAACQAJAAkACQAJAAn8CQAJAAkACQAJAIAJBA08EQCABQfyCwQBHBEAgAS8AAEHfpAFHDQILIAEsAAIiBEG/f0oEQCABQQJqIQVBfgwHCyABIAJBAiACQdyDwQAQeAALIAJBAkcNAyABLQAAQdIARg0BDAMLIAEtAABB0gBHDQELIAEsAAEiBEG/f0oEQCABQQFqIQVBfwwECyABIAJBASACQeyDwQAQeAALIAJBA00NACABQfyDwQBGDQFB/IPBACABQQMQ1gZFDQELIABBADYCAAwFCyABLAADIgRBv39MDQEgAUEDaiEFQX0LIARBv39qQf8BcUEaTwRAIABBADYCAAwECyACaiEEQQAhAQJAA0AgASAERg0BIAEgBWogAUEBaiEBLAAAQQBODQALIABBADYCAAwECyADQQA2AgggAyAENgIEIAMgBTYCACADEL4BRQ0BDAILIAEgAkEDIAJBgITBABB4AAsCQCADKAIEIgIgAygCCCIBTQ0AIAMoAgAgAWotAABBv39qQf8BcUEZSw0AIAMQvgENASADKAIIIQEgAygCBCECCyADKAIAIQYgAUUgASACRnJFBEAgAiABTQ0DIAEgBmosAABBv39MDQMLIAAgBDYCBCAAIAU2AgAgAEEMaiACIAFrNgIAIABBCGogASAGajYCAAwBCyAAQQA2AgALIANBEGokAA8LIAYgAiABIAJBkITBABB4AAudBAEEfyMAQbAFayICJAACQAJAIAEtAMABRQRAIAJBADYCCCACQgg3AwAgAkGwAmogAUHAARCiBxogAkEQaiABQeAAEKIHGiACQdAEaiIDQciewQBBMBCiBxogAkGABWpBAEEwEO0HGiACQfAAaiACQZADakHgABCiBxogAkHQAWogA0HgABCiBxogAkHAADYC2AQgAkKAgIKAgICggOkANwPQBCADEN4GQf8BcSIDQQJGDQEDQAJ/IANB/wFxIgVBAEcgBEEBcUUNABogAkGwAmogAkEQahCgASACKAIIIgMgAigCBEYEQCACIAMQiAYgAigCCCEDCyACKAIAIANBoAJsaiACQbACakGgAhCiBxogAiADQQFqNgIIQQEgBUUNABogAkGwAmogAkEQaiABEIIBIAIoAggiAyACKAIERgRAIAIgAxCIBiACKAIIIQMLIAIoAgAgA0GgAmxqIAJBsAJqQaACEKIHGiACIANBAWo2AghBAQshBCACQdAEahDeBkH/AXEiA0ECRw0ACwwBCyAAQQE6AAwgAEEANgIIIABCCDcCAAwBCyACQbAC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AykDsAE3AgAgACAIOgAMIAAgAykDQDcADSAAIAI2AiggACABNgIkIAAgBDYAICAAQQhqIANBuAFqKAIANgIAIABBFWogA0HIAGopAwA3AAAgAEEcaiADQc8AaigAADYAACAAQSxqIANBgAFqQSQQogcaIABBADoAUCAAIAMvAH07AFEgAEHTAGogA0H/AGotAAA6AAAgAEHUicAAEMwDIAYkAA8LQfSHwABBFRDuCAALQdQAQQRBtMjCACgCACIAQdoCIAAbEQAAAAv3AwIDfwF+IwBBwAhrIgMkACADQegEakG5kcAAQRQQtwECQCADKQPoBEIBUgRAIANBCGoiBCADQfAEakGgAhCiBxogBCABIAIQ2AggA0HoBGoiAiAEQaACEKIHGiADKQPYBSEGIAMgA0GkBmoiBDYCBCADIANB5AVqNgIAIANByAJqIgEgAygCACADKAIEEJYCIAMgBjcDkAcgAyADQeAFaigCADYCmAcgA0GcB2ogAUHAABCiBxogA0H0B2ogA0G8BmopAgA3AgAgA0HsB2ogA0G0BmopAgA3AgAgA0HkB2ogA0GsBmopAgA3AgAgAyAEKQIANwLcByABIAJB8AAQogcaIANBgAhqIgQgARC5AiADQZAHaiIFIARBIBCBAyABIAVB8AAQogcaIANBoAhqIgQgARC5AiADQagCaiIBIAQQjwcgAiABEJwFIAMpA+gEQgFRDQEgA0HIAmoiASADQfAEakGgAhCiBxogAEEYaiADQcACaikDADcAACAAQRBqIANBuAJqKQMANwAAIABBCGogA0GwAmopAwA3AAAgACADKQOoAjcAACAAQSBqIAFBoAIQogcaIANBwAhqJAAPC0HkjsAAQR8gA0GQB2pB8I3AAEGEj8AAEL0FAAtBlI/AAEETIANBkAdqQeCNwABBqI/AABC9BQALpAQCB38BfiMAQRBrIgUkAAJ/AkAgACgCAARAIAUgABCAAyAFKAIAIgMNAQsgAEEANgIAIAAoAgwiACgCGEHdhcEAQQEgAEEcaigCACgCDBEBAAwBCyAFKAIEIgFBEE0EQCAFQgA3AwgCQCABRQ0AIAEgA2ohBANAIANBAWohAQJAIAMsAAAiAkF/SgRAIAJB/wFxIQIgASEDDAELAn8gASAERgRAQQAhBiAEDAELIAMtAAFBP3EhBiADQQJqCyEB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IABB0AVqIAJBMBCiBxogAEEMaiIBIABBzAVqQTQQogcaIAQgBUGAAhCiBxogAEHIBGogAzYCACAAQcwEaiABQTQQogcaQQAhASAAQZAFakEANgIAIABBiAVqQoCABDcDACAAQYAFaiIEQoCABDcDACAAQgE3A8ACA0AgAEHAAmogAWoiAikDACEIIAIgAUGgxcIAaiIDKQMANwMAIAFBqMXCAGoiBSkDACELIAFBsMXCAGoiBikDACEJIAFBuMXCAGoiBykDACEKIAMgCDcDACACQRhqIgMpAwAhCCADIAo3AwAgAkEQaiIDKQMAIQogAyAJNwMAIAJBCGoiAikDACEJIAIgCzcDACAHIAg3AwAgBiAKNwMAIAUgCTcDACABQZkCSSABQSBqIQENAAtB4MfCACAEKQMANwMAQfDHwgAgBEEQaikDADcDAEHox8IAIARBCGopAwA3AwALIABBgAZqJABBqMXCAA8LIAAoAsQCIABByAJqKAIAEKkGAAuKAwEFfwJAAkACQAJAAkAgByAIVgRAIAcgCH0gCFgNBAJAIAcgBn0gBlZBACAHIAZCAYZ9IAhCAYZaG0UEQCAGIAhWBEAgByAGIAh9IgZ9IAZYDQILDAYLIAIgA0kNAgwGCyACIANJDQIgASADaiELIAEhCQJAAkADQCADIApGDQEgCkEBaiEKIAMgCWogCUF/aiINIQlBf2otAABBOUYNAAsgAyANaiIFIAUtAABBAWo6AAAgAyAKa0EBaiADTw0BIAVBAWpBMCAKQX9qEO0HGgwBCwJ/QTEgA0UNABogAUExOgAAQTAgA0EBRg0AGiABQQFqQTAgA0F/ahDtBxpBMAshCSAEQRB0QYCABGpBEHUiBCAFQRB0QRB1TCACIANNcg0AIAsgCToAACADQQFqIQMLIAMgAksNAwwFCwwDCyADIAJB1J7CABDqBQALIAMgAkHknsIAEOoFAAsgAyACQfSewgAQ6gUACyAAQQA2AgAPCyAAIAM2AgQgACABNgIAIABBCGogBDsBAAveAwEIfyMAQaADayICJAAgAkEAOgAIIAJBMGogABCCAiACQSA2AugCIAJBMDYC5AIgAiABNgLgAiACQYADaiIAQQA2AgwgACACQeACaiIBKQIANwIAIABBCGogAUEIaigCADYCACACQdACaiIBIAApAgA3AgAgAUEI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AkAgABD8AUUEQCAAEJ4BRQ0BQQEMAwsgAEEBcmdBAnZBB3OtQoCAgIDQAIQMAQsgAEEBcmdBAnZBB3OtQoCAgIDQAIQLIQVBAwshAiAAIQMMAQsgACEDCwNAIAIhBEHcACEAQQEhAgJAAn4CQAJAAkACQCAEQQFrDgMBBQACCwJAAkACQAJAIAVCIIinQf8BcUEBaw4FAwIBAAYFC0H1ACEAIAVC/////49gg0KAgICAMIQMBgtB+wAhACAFQv////+PYINCgICAgCCEDAULIAMgBaciAkECdEEccXZBD3EiAEEwQdcAIABBCkkbaiEAIAVCf3xC/////w+DIAVCgICAgHCDhCACDQQaIAVC/////49gg0KAgICAEIQMBAtB/QAhACAFQv////+PYIMMAwtBACECIAMhAAwDCyABKAIYQScgASgCHCgCEBECAA8LIAVC/////49gg0KAgICAwACECyEFQQMhAgsgASgCGCAAIAEoAhwoAhARAgBFDQALC0EBC6wDAQV/IwBBkAFrIgQkAAJAIAEoAgQiBS8BkgNBC08EQCAEQdAAaiIGIAEoAggQrAYgBEHYAGooAgAhByAEKAJUIQggASgCACEBIAQgBCgCUDYCWCAEIAU2AlQgBCABNgJQIARBCGogBhDRBQJ/IAhBAUYEQCAEIAQoAjg2AkAgBEE8aigCAAwBCyAEIAQoAjA2AkAgBEE0aigCAAshASAEIAc2AkggBCABNgJEIARB6ABqIANBGGopAwA3AwAgBEHgAGogA0EQaikDADcDACAEQdgAaiADQQhqKQMANwMAIAQgAykDADcDUCAEQUBrIAIgBEHQAGoiARCeAiECIARB1ABqIARBCGpBOBCiBxogAEEBNgIAIABBBGogAUE8EKIHGiAAIAI2AkAMAQsgBEHoAGogA0EYaikDADcDACAEQeAAaiADQRBqKQMANwMAIARB2ABqIANBCGopAwA3AwAgBCADKQMANwNQIAAgASACIARB0ABqEJ4CNgJAIABBCGogBTYCACAAQQA2AgAgAEEMaiABKAIINgIAIAAgASgCADYCBAsgBEGQAWokAAuWAwEHfyMAQSBrIgUkACAAKAIEIgYvAZIDIgdBAWohCCAAKAIIIgRBAWoiCSAHTQRAIAZB5AJqIgogCUECdGogBEECdCAKaiAEQX9zIAhqQQJ0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AXE6ABwgAkEgakIANwIEIAJBMGogAkEYahCSBSACKAI0IQEgAigCMEEBRg0BA0AgAUEBRgRAIAJBIGogAigCOBDCCCACQTBqIAJBGGoQkgUgAigCNCEBIAIoAjBBAUcNAQwDCwsgACACKQMgNwIEIABBADYCACAAQQxqIAJBKGooAgA2AgAgAigCGCIAQSRJDQIgABAADAILIABBATYCACAAIAE2AgQgAigCFCIAQSRJDQIgABAADAILIABBATYCACAAIAE2AgQgAkEgahC4BCACKAIYIgBBJEkNACAAEAALIAIoAhQiAEEkSQ0AIAAQAAsgAkFAayQAC88DAgl/An4jAEGAAmsiAiQAIAEpAwAhCyACQRhqIgMgAUHMAGo2AgQgAyABQQxqNgIAIAJBQGsiAyACKAIYIAIoAhwQlgIgAkEoaiIHIAFB1ABqKQIANwMAIAJBMGoiCCABQdwAaikCADcDACACQThqIgkgAUHkAGopAgA3AwAgAiABKQJMNwMgIAEoAgghBCACQRBqIgUgAUGgAmo2AgQgBSABQeABajYCACACQYABaiIFIAIoAhAgAigCFBCWAiABKQNwIQwgAkEIaiIGIAFBvAFqIgo2AgQgBiABQfwAajYCACACQcABaiIGIAIoAgggAigCDBCWAiAAIAQ2AgggACALNwMAIAFB+ABqKAIAIQQgAEEMaiADQcAAEKIHGiAAQeQAaiAJKQMANwIAIABB3ABqIAgpAwA3AgAgAEHUAGogBykDADcCACAAIAIpAyA3AkwgAEHgAWogBUHAABCiBxogAEH4AGogBDYCACAAIAw3A3AgAEH8AGogBkHAABCiBxogAEHUAWogAUHUAWopAgA3AgAgAEHMAWogAUHMAWopAgA3AgAgAEHEAWogAUHEAWopAgA3AgAgAEG8AWogCikCADcCACACQYACaiQAC60DAQN/IwBBkBBrIgMkACADQYDgADsALgJAAkACQAJAIAFFBEAgA0GgCGoiAUEhELMFIAMQowg2AnAgA0EYaiICIAEoAgA2AgAgAiABKAIINgIEIANB8ABqIAMoAhggAygCHBDGCCADQRBqIgIgASgCADYCACACIAEoAgg2AgQgAygCFCIBQSBNDQIgAygCEEEAOgAgDAELIANBoAhqIgQgAkEBahCzBSADQSBqIgUgBCgCADYCACAF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AgAgAUE0akHZAjYCACABQSRqQQM2AgAgASABQQ9qNgJAIAFBxPjBADYCRCABQdwAakEANgIAIAFCAzcCFCABQdiBwgA2AhAgAUHZAjYCLCABQaT0wQA2AlggAUIBNwJMIAFBnITCADYCSCABIAFBKGo2AiAgASABQcgAajYCOCABIAFBxABqNgIwIAEgAUFAazYCKCABQRBqQdSEwgAQ7AcAC4oDAgZ/BH4jAEHABWsiAiQAIAJBgARqIgMgAUGAARCiBxogASkDiAMhCCABKAKQAyEFIAEpA8ABIQkgAkGABWogAUGAAWpBwAAQogcgACADQcABEKIHIQAgAkGAAWogAUHIAWpBwAAQogcaIAIgAUGIAmpBgAEQogciAkHAAWoiAyABQbAGaiABQbAHahDjBCACQYAEaiIGIAFBmANqQYABEKIHGiABQaAGaikDACEKIAFBqAZqKAIAIQcgAUHYBGopAwAhCyABQZgEakHAABCiBxogAkHAAmoiBCAGQcABEKIHGiAAIAk3A8ABIABByAFqIAJBgAFqQcAAEKIHGiAAQYgCaiACQYABEKIHGiAAIAU2ApADIAAgCDcDiAMgAEGwBmogA0GAARCiBxogAEGYA2ogBEHAARCiBxogAEHYBGogCzcDACAAQeAEaiABQeAEakHAABCiBxogAEGgBWogAUGgBWpBgAEQogcaIABBqAZqIAc2AgAgAEGgBmogCjcDACACQcAFaiQAC9oCAQZ/IwBBMGsiAyQAIANBKGogAUEIaigCADYCACADIAEpAgA3AyAgAyADQSBqIAIQpAIgA0EMaigCACECIANBCGooAgAhASADKAIEIQQgAygCGCEFAkAgAygCAEEBRgRAIANBFGooAgAhBiADQRBqKAIAIQcCQCABKAIAIggEQANAIAMgAS8BMDYCKCADIAg2AiQgAyAEQQFqNgIgIAMgA0EgaiACIAcgBhDNAiADKAIMIQIgAygCCCEBIAMoAgQhBCADKAIAQQFHDQIgAygCFCEGIAMoAhAhByABKAIAIggNAAsLIAAgBTYCGCAAIAQ2AgQgAEEBNgIAIABBFGogBjYCACAAQRBqIAc2AgAMAgsgACAFNgIYIAAgBDYCBCAAQQA2AgAMAQsgACAFNgIYIAAgBDYCBCAAQQA2AgALIABBDGogAjYCACAAQQhqIAE2AgAg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AXRB+qPCAGovAAA7AAAgBEF+aiAGIAdB5ABsa0H//wNxQQF0QfqjwgBqLwAAOwAAIANBfGohAyAAQv/B1y9WIAghAA0ACwsgCKciBEHjAEoEQCAIpyIGQf//A3FB5ABuIQQgA0F+aiIDIAVBCWpqIAYgBEHkAGxrQf//A3FBAXRB+qPCAGovAAA7AAALAkAgBEEKTgRAIANBfmoiAyAFQQlqaiAEQQF0QfqjwgBqLwAAOwAADAELIANBf2oiAyAFQQlqaiAEQTBqOgAACyACIAFBhIjCAEEAIAVBCWogA2pBJyADaxCoASAFQTBqJAALzAICAn8BfiMAQfAAayICJAAgAkEIaiIDQgA3AwAgA0EYakIANwMAIANBEGpCADcDACADQQhqQgA3AwACQCADIAEQ/gEiBKdB/wFxQQNGBEAgAkHoAGogAkEgaikDADcDACACQeAAaiACQRhqKQMANwMAIAJB2ABqIgMgAkEQaikDADcDACACIAIpAwg3A1AgAkEoaiACQdAAahCzAkEBIQECQCACKAIoQQFHBEAgAEEgaiACQcgAaikDADcDACAAQRhqIAJBQGspAwA3AwAgAEEQaiACQThqKQMANwMAIABBCGogAkEwaikDADcDAEEAIQEMAQsgAyACQTRqKAIANgIAIAIgAikCLDcDUCACIAJB0ABqEOIFIABBECACKAIAIAIoAgQQlQY3AgQLIAAgATYCAAwBCyAAQQE2AgAgACAENwIECyACQfAAaiQAC8wCAgJ/AX4jAEHwAGsiAiQAIAJBCGoiA0IANwMAIANBGGpCADcDACADQRBqQgA3AwAgA0EIakIANwMAAkAgAyABEIsCIgSnQf8BcUEDRgRAIAJB6ABqIAJBIGopAwA3AwAgAkHgAGogAkEYaikDADcDACACQdgAaiIDIAJBEGopAwA3AwAgAiACKQMINwNQIAJBKGogAkHQAGoQswJBASEBAkAgAigCKEEBRwRAIABBIGogAkHIAGopAwA3AwAgAEEYaiACQUBrKQMANwMAIABBEGogAkE4aikDADcDACAAQQhqIAJBMGopAwA3AwBBACEBDAELIAMgAkE0aigCADYCACACIAIpAiw3A1AgAiACQdAAahDiBSAAQRAgAigCACACKAIEEJUGNwIECyAAIAE2AgAMAQsgAEEBNgIAIAAgBDcCBAsgAkHwAGokAAvaAgIFfwF+IABBDGohAiAAQcwAaiEDIAApAwAhBgJAAkAgACgCCCIBQcAARgRAIAMgAhA4QQAhASAAQQA2AggMAQsgAUE/Sw0BCyAAQQhqIgQgAWpBBGpBgAE6AAAgACAAKAIIIgVBAWoiATYCCAJAIAFBwQBJBEAgASAEakEEakEAQT8gBWsQ7QcaQcAAIAAoAghrQQhJBEAgAyACEDggACgCCCIBQcEATw0CIABBDGpBACABEO0HGgsgAEHEAGogBkIohkKAgICAgIDA/wCDIAZCOIaEIAZCGIZCgICAgIDgP4MgBkIIhkKAgICA8B+DhIQgBkIIiEKAgID4D4MgBkIYiEKAgPwHg4QgBkIoiEKA/gODIAZCOIiEhIQ3AgAgAyACEDggAEEANgIIDwsgAUHAAEHUrsAAEOwFAAsgAUHAAEHkrsAAEOoFAAsgAUHAAEHErsAAEOkFAAvDAgEHfyMAQTBrIgMkAAJAIAEoAgQiBS8BMkELTwRAIANBCGoiBCABKAIIEKwGIANBEGoiCCgCACEGIAMoAgwhByABKAIAIQEgAyADKAIINgIoIAMgBTYCJCADIAE2AiAgBCADQSBqEJMEIANBGGoiCSAEQQRyIAdBAUYbKAIAIgEvATIiBEEBaiEFIAZBAWoiByAETQRAIAFBBGoiBCAHQQJ0aiAGQQJ0IARqIAZBf3MgBWpBAnQQwwUaCyAGQQJ0IAFqQQRqIAI2AgAgASAFOwEyIABBATYCACAAIAMpAwg3AgQgAEEMaiAIKQMANwIAIABBFGogCSgCADYCACAAIAE2AhgMAQsgACABIAIQ0gU2AhggAEEIaiAFNgIAIABBADYCACAAQQxqIAEoAgg2AgAgACABKAIANgIECyADQTBqJAALzgICBH8BfiMAQUBqIgQkAAJAAkACQCACIANqIgMgAk8EQCABKAIEIQYgBEEYakKBgICAEDcDACAEKAIcIgJBf2ohBSACRUEAIAJrIgcgBCgCGCAFanGtIAZBAXQiBiADIAYgA0sbIgNBCCADQQhLG61+IghCIIincg0BIAJpQQFGBEAgCKcgBWogB3EhAwwDC0HI78AAQSsgBEEwakH078AAQbjvwAAQvQUACyAEQQhqIgFBADYCBCABIAM2AgAgACAEKQMINwIEQQEhAgwCC0EAIQILIARBMGoiBSABEM8HIARBIGogAyACIAUQtQRBASECIARBKGooAgAhAyAEKAIkIQUgBCgCIEEBRwRAIAEgAzYCBCABIAU2AgBBACECDAELIARBEGoiASADNgIEIAEgBTYCACAAIAQpAxA3AgQLIAAgAjYCACAEQUBrJAALzgICBH8BfiMAQUBqIgQkAAJAAkACQCACIANqIgMgAk8EQCABKAIEIQYgBEEYakKBgICAEDcDACAEKAIcIgJBf2ohBSACRUEAIAJrIgcgBCgCGCAFanGtIAZBAXQiBiADIAYgA0sbIgNBCCADQQhLG61+IghCIIincg0BIAJpQQFGBEAgCKcgBWogB3EhAwwDC0HQzcEAQSsgBEEwakH8zcEAQcDNwQAQvQUACyAEQQhqIgFBADYCBCABIAM2AgAgACAEKQMINwIEQQEhAgwCC0EAIQILIARBMGoiBSABEM8HIARBIGogAyACIAUQtQRBASECIARBKGooAgAhAyAEKAIkIQUgBCgCIEEBRwRAIAEgAzYCBCABIAU2AgBBACECDAELIARBEGoiASADNgIEIAEgBTYCACAAIAQpAxA3AgQLIAAgAjYCACAEQUBrJAALYgEDf0GEzMIAKAIAIgBFBEBBlMzCAEH/HzYCAEEADwsDQCAAIgEoAgghACABKAIEGiABKAIAGiABQQxqKAIAGiACQQFqIQIgAA0AC0GUzMIAIAJB/x8gAkH/H0sbNgIAQQALpgICA38EfiMAQfAAayIDJAAgAyACNgIEIAMgATYCAEEBIQEgA0HIAGogAxChAiADQTBqIgIgA0HcAGopAgA3AwAgA0E4aiIEIANB5ABqKQIANwMAIANBQGsiBSADQewAaigCADYCACADIANB1ABqKQIANwMoIAMpAkwhBgJAIAMoAkhBAUcEQCADQSBqIAUoAgAiATYCACADQRhqIAQpAwAiBzcDACADQRBqIAIpAwAiCDcDACADIAMpAygiCTcDCCAAQQhqIAZCIIg+AgAgAEEMaiAJNwIAIABBFGogCDcCACAAQRxqIAc3AgAgAEEkaiABNgIAQQAhAQwBCyADQcgAaiICIAYQnwIgAEEEaiACQSgQogcaCyAAIAE2AgAgA0HwAGokAAvKAgEEfyMAQdAAayICJAACQAJ/IAEtAABBBHFBAnYiAyEFIANFBEAgACgCCCIEIAAoAgwiA0kNAiAEIANrIQQgACgCACADQRxsaiEAQQAMAQsgACgCCCEEIAAoAgAhAEEBCyEDIAJBCGoQrgMgAkEgaiACQRBqKQMANwMAIAIgBToAKCACIAIpAwg3AxggAkE8akGc+8AANgIAIAIgAzoAQEEAIQMgAkEANgI0IAIgATYCMCACIAJBGGo2AjgCQAJAIAQEQCAEQRxsIQEDQCACQQA2AkwgAiACQTBqNgJIIAJByABqIAAQ9gMNAiAAQRxqIQAgAigCSCIEIAQoAgRBAWo2AgQgAUFkaiIBDQALCwwBC0EBIQMgAigCSCIAIAAoAgRBAWo2AgQLIAJBGGoQ2QUgAkHQAGokACADDwsgAyAEQYz7wAAQ7AUAC7wCAQJ/IwBBEGsiAiQAAn8CQCABKAIIQQFHBEAgASgCEEEBRw0BCyAAKAIAIQAgAkEANgIMAkACQCAAQYABTwRAIABBgBBJDQEgAkEMaiEDIABBgIAETw0CIAIgAEE/cUGAAXI6AA4gAiAAQQx2QeABcjoADCACIABBBnZBP3FBgAFyOgANIAEgA0EDEIMBDAQLIAIgADoADCABIAJBDGpBARCDAQwDCyACIABBP3FBgAFyOgANIAIgAEEGdkHAAXI6AAwgASACQQxqQQIQgwEMAgsgAiAAQT9xQYABcjoADyACIABBEnZB8AFyOgAMIAIgAEEGdkE/cUGAAXI6AA4gAiAAQQx2QT9xQYABcjoADSABIANBBBCDAQwBCyABKAIYIAAoAgAgAUEcaigCACgCEBECAAsgAkEQaiQAC4IDAQV/IwBBEGsiAyQAEAwhBUGsyMIAKAIAIQFBsMjCACgCACECQazIwgBCADcCACADIAI2AgQgAyABQQFGNgIAAkAgAygCAARAIAMgAygCBDYCDCADQQE2AgggA0EIaiIBKAIAGiABKAIEIgFBJE8EQCABEAALIABBCGoQmwcoAgBBkO3BAEEGEA02AgAgAEIANwIADAELIAMgBTYCDCADQQA2AgggBRAOIQIgBRAPIQQCQAJAAkAgAhAJQQFGBEAgBBAJQQFHDQEgAEKBgICA8ICAgIB/NwIAIAJBJE8EQCACEAALIARBJEkNAyAEEAAMAwsgAiEBIARBJEkNASAEEAAMAQsgBCEBIAJBJEkNACACEAALIAEQECICEAkgAkEkTwRAIAIQAAtBAUcEQCAAQQxqQYACECo2AgAgAEEIaiABNgIAIABCgICAgBA3AgAMAQsgAEKBgICAgIGAgIB/NwIAIAFBJEkNACABEAALIAVBJEkNACAFEAALIANBEGokAAvAAgEEfyAAQgA3AhAgACIDAn9BACABQQh2IgJFDQAaQR8gAUH///8HSw0AGiABQQYgAmciAmtBH3F2QQFxIAJBAXRrQT5qCyIENgIcIARBAnRB5MrCAGohACADIQICQAJAAkACQEHYyMIAKAIAIgNBASAEQR9xdCIFcQRAQQBBGSAEQQF2ayAEQR9GGyEDIAAoAgAiACgCBEF4cSABRw0BIAAhAwwCC0HYyMIAIAMgBXI2AgAgACACNgIADAMLIAEgA0EfcXQhBANAIARBHXZBBHEgAGpBEGoiBSgCACIDRQ0CIARBAXQhBCADIgAoAgRBeHEgAUcNAAsLIAMoAggiACACNgIMIAMgAjYCCCACIAM2AgwgAiAANgIIIAJBADYCGA8LIAUgAjYCAAsgAiAANgIYIAIgAjYCCCACIAI2AgwLsQICAX8DfiMAQdAAayIEJAAgBCABIAIQwAMgAAJ+IAQoAgBBAUcEQCAEQShqIARBFGooAgA2AgAgBEEgaiAEQQxqKQIANwMAIAQgBCkCBDcDGCAEQcgAaiADQRhqKQMANwMAIARBQGsgA0EQaikDADcDACAEQThqIANBCGopAwA3AwAgBCADKQMANwMwIARBGGogBEEwahCPAkIADAELIARBCGooAgAgBEEMaigCAEEFdGoiASkDECEFIAEgAykDEDcDECABKQMIIQYgASADKQMINwMIIAEpAwAhByABIAMpAwA3AwAgAEEYaiAFNwMAIABBEGogBjcDACAAIAc3AwggAUEYaiIBKQMAIQUgASADQRhqKQMANwMAIABBIGogBTcDAEIBCzcDACAEQdAAaiQAC4oCAQl/IwBBgANrIgIkACACIABB4ABqIgZB4AAQogciAiABEGsgAkHgAGoiAyABQeAAEKIHGiACQaACaiIEIAZB4AAQogcaIAQgAEHAAWoiCBCiAyACQdACaiIJIABB8AFqEKIDIAMgBBBrIAMgAhCjAyACQZABaiIHIAJBMGoiChCjAyACQcABaiIFIANBMBCiBxogAyAHEKMDIAcgBRCiAyAFIAFB4AAQogcaIAQgAEHgABCiBxogBCAGEKIDIAkgAEGQAWoQogMgBSAEEGsgBSACEKMDIAJB8AFqIAoQowMgACADQeAAEKIHGiAGIAVB4AAQogcaIAggAkHgABCiBxogAkGAA2okAAu1AgEDfyMAQYABayIEJAACQAJAAn8CQCABKAIAIgNBEHFFBEAgACgCACECIANBIHENASACrUEBIAEQoAIMAgsgACgCACECQQAhAANAIAAgBGpB/wBqIAJBD3EiA0EwciADQdcAaiADQQpJGzoAACAAQX9qIQAgAkEEdiICDQALIABBgAFqIgJBgQFPDQIgAUEBQfijwgBBAiAAIARqQYABakEAIABrEKgBDAELQQAhAANAIAAgBGpB/wBqIAJBD3EiA0EwciADQTdqIANBCkkbOgAAIABBf2ohACACQQR2IgINAAsgAEGAAWoiAkGBAU8NAiABQQFB+KPCAEECIAAgBGpBgAFqQQAgAGsQqAELIARBgAFqJAAPCyACQYABQeijwgAQ7AUACyACQYABQeijwgAQ7AUAC6wCAQF/IwBBMGsiAyQAIAMgAjoADCADIAE2AgggA0EAEKYDIANBADYCGCADIAMpAwA3AxAgA0EgaiADQQhqEJIFIAMoAiQhAQJAAkACfyADKAIgQQFHBEADQCABQQFHDQMgAygCKCEBIAMoAhggAygCFEYEQCADQRBqQQEQzggLIANBEGooAgAgAygCGEECdGogATYCACADIAMoAhhBAWo2AhggA0EgaiADQQhqEJIFIAMoAiQhASADKAIgQQFHDQALIANBEGoMAQsgA0EQagsgAEEBNgIAIAAgATYCBBD/ByADKAIIIgBBJEkNASAAEAAMAQsgACADKQMQNwIEIABBADYCACAAQQxqIANBGGooAgA2AgAgAygCCCIAQSRJDQAgABAACyADQTBqJAALuwIBBn8jAEFAaiICJAAgAkEIaiABEJsGAkAgAigCCARAIAJBOGoiBSACKAIMIgNBGGopAwA3AwAgAkEwaiIGIANBEGopAwA3AwAgAkEoaiIHIANBCGopAwA3AwAgAiADKQMANwMgIAJBfyABKAIYIgNBAWoiBCAEIANJGxCvBSACKAIEIQQgAigCACIDIAIpAyA3AwAgA0EYaiAFKQMANwMAIANBEGogBikDADcDACADQQhqIAcpAwA3AwAgAkEBNgIYIAIgBDYCFCACIAM2AhAgBSABKAIYNgIAIAYgAUEQaikCADcDACAHIAFBCGopAgA3AwAgAiABKQIANwMgIAJBEGogAkEgahDlAiAAQQhqIAIoAhg2AgAgACACKQMQNwIADAELIABBADYCCCAAQgg3AgALIAJBQGskAAu8AgIEfwJ+IwBBMGsiAiQAQSghAwJ+AkADQCACQgA3AygCQCABKAIEIgRBCE8EQCACQShqQQggASgCACIFQQgQiQggASAEQXhqNgIEIAEgBUEIajYCAAwBCyACQcDXwQBBGxDlBEERIAIoAgAgAigCBBCVBiIGQv8Bg0IDUg0CCyACIAIpAygiBkI4hiAGQiiGQoCAgICAgMD/AIOEIAZCGIZCgICAgIDgP4MgBkIIhkKAgICA8B+DhIQgBkIIiEKAgID4D4MgBkIYiEKAgPwHg4QgBkIoiEKA/gODIAZCOIiEhIQ3AhwgAkEQaiACQSBqKAIANgIAIAIgAikDGDcDCCAAIANqIAIpAgw3AwAgA0F4aiIDQXhHDQALQgMhB0IADAELIAZC/wGDIQcgBkKAfoMLIAJBMGokACAHhAu9AgICfwJ+IwBB0ABrIgIkAEEYIQMgAkEYaiABQRhqKQMANwMAIAJBEGogAUEQaikDADcDACACQQhqIAFBCGopAwA3AwAgAiABKQMANwMAIAACfwJAA0AgA0F4RwRAIAIgA2opAwAiBCADQejhwQBqKQMAIgVUDQIgA0F4aiEDIAQgBVgNAQsLIAJBxABqQQE2AgAgAkIBNwI0IAJBnOHBADYCMCACQacCNgJMIAIgAkHIAGo2AkAgAiACNgJIIAJBIGogAkEwahCYAiAAQQxqIAJBKGooAgA2AgAgACACKQMgNwIEQQEMAQsgAkHI4cEAEFIgAEEgaiACQRhqKQMANwMAIABBGGogAkEQaikDADcDACAAQRBqIAJBCGopAwA3AwAgAEEIaiACKQMANwMAQQALNgIAIAJB0ABqJAALtQIBAn8jAEGABWsiAyQAIANBMGogABCHCAJAIAJFBEAgA0G4A2oiACADQTBqQcgBEKIHGiADQfgBaiICIAAQ+AEgA0EoaiIEQcABNgIEIAQgAjYCACADKAIoIQQgA0EgaiADKAIsIgJBABD0BSADQQA2AsADIAMgAykDIDcDuAMMAQsgA0G4A2oiACADQTBqQcgBEKIHGiADQfgBaiICIAAQ2gEgA0EYaiIEQeAANgIEIAQgAjYCACADKAIYIQQgA0EQaiADKAIcIgJBABD0BSADQQA2AsADIAMgAykDEDcDuAMLIAAoAgAgBCACEKIHGiADIAI2AsADIANBCGoiAiADQbgDaiIEKAIINgIEIAIgBCgCADYCACABIAMoAgggAygCDBC4CCAAEKIIIANBgAVqJABCAwvFAgIEfwF+IwBBIGsiAiQAIABBADYCCCAAQgE3AgAgAUGQAWogAEEAELYCIganIgNB/wFxQQNHBEAgAiADOgAQIAIgBkI4iDwAFyACIAZCKIg9ABUgAiAGQgiIPgARQYvPwABBKyACQRBqQcjPwABB2NPAABC9BQALIAJBEGoiAyABQbADahCHAyACQQhqIgQgAygCCDYCBCAEIAMoAgA2AgAgAigCCCEFIAAgAigCDCIEEMUIIAAoAgAgACgCCGogBSAEEKIHGiAAIAAoAgggBGo2AgggAkEANgIYIAMQogggAyABQdgEahCHAyACIAMoAgg2AgQgAiADKAIANgIAIAIoAgAhBCAAIAIoAgQiARDFCCAAKAIAIAAoAghqIAQgARCiBxogACAAKAIIIAFqNgIIIAJBADYCGCADEKIIIAJBIGokAAu0AgECfyMAQeACayIDJAAgA0EwaiAAEIgIAkAgAkUEQCADQfgBaiIAIANBMGpB6AAQogcaIANBmAFqIgIgABCDAyADQShqIgRB4AA2AgQgBCACNgIAIAMoAighBCADQSBqIAMoAiwiAkEAEPQFIANBADYCgAIgAyADKQMgNwP4AQwBCyADQfgBaiIAIANBMGpB6AAQogcaIANBmAFqIgIgABD2ASADQRhqIgRBMDYCBCAEIAI2AgAgAygCGCEEIANBEGogAygCHCICQQAQ9AUgA0EANgKAAiADIAMpAxA3A/gBCyAAKAIAIAQgAhCiBxogAyACNgKAAiADQQhqIgIgA0H4AWoiBCgCCDYCBCACIAQoAgA2AgAgASADKAIIIAMoAgwQuAggABCiCCADQeACaiQAQgMLuAIBBX8gACgCGCEEAkACQCAAKAIMIABGBEBBFEEQIABBFGoiASgCACIDGyAAaigCACICDQFBACEBDAILIAAoAggiAiAAKAIMIgE2AgwgASACNgIIDAELIAEgAEEQaiADGyEDA0Ag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ADYCDCABQYAQSQ0BIAFBgIAESQRAIAIgAUE/cUGAAXI6AA4gAiABQQx2QeABcjoADCACIAFBBnZBP3FBgAFyOgANQQMMAwsgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEEDAILIAAoAggiAyAAKAIERgRAIAAgA0EBEIcGCyAAKAIAIAAoAghqIAE6AAAgACAAKAIIQQFqNgIIDAILIAIgAUE/cUGAAXI6AA0gAiABQQZ2QcABcjoADEECCyEAIAMgBCACQQxqIABqEMYHCyACQRBqJABBAAv7AgEHfyMAQZABayIBJAAgAUKjl6GAgAI3A4gBIAFCsMGSgPABNwOAASABQs2ojYDgATcDeCABQp/Xg4DQATcDcCABQoyHgoDAATcDaCABQvqFgYCwATcDYCABQtyygICgATcDWCABQoibgICQATcDUCABQuqJgICAATcDSCABQsKEgIDwADcDQCABQu+BgIDgADcDOCABQumAgIDQADcDMCABQquAgIDAADcDKCABQpSAgIAwNwMgIAFCgoCAgCA3AxggAUKBgICAEDcDECABQQhqIgJBEDYCBCACQQE2AgAgASgCCCICIAEoAgwiAyACIANLGyEGIAJBECACQRBLGyEFIAJBA3QgAWpBBGohAwJAAkACfwNAQRAgAiAGRg0BGiACIAVGDQIgAkEBaiECIANBDGogA0EIaiIHIQMoAgAgAE0NAAsgAkF+akEPSw0CIAcoAgALIAFBkAFqJAAPCyAFQRBBuMvBABDpBQALQX9BEEG4y8EAEOkFAAu8AgIFfwF+IwBB0ARrIgIkACACQRBqIgUgARCCAiACKQOAASEHIAJBCGoiAyACQcwBaiIENgIEIAMgAkGMAWo2AgAgAkHgA2oiAyACKAIIIAIoAgwQlgIgAiAHNwOwAiACIAJBiAFqKAIANgK4AiACQbwCaiADQcAAEKIHGiACQZQDaiACQeQBaikCADcCACACQYwDaiACQdwBaikCADcCACACQYQDaiACQdQBaikCADcCACACIAQpAgA3AvwCIAMgBUHwABCiBxogAkGgA2oiBCADELkCIAJBsAJqIgYgBEEgEIEDIAMgBkHwABCiBxogAkHAA2oiBCADELkCIAAgBBCPByABEIkH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AXFFBEADQCAEQoACg1ANAiADKAIYIAMoAhRGBEAgA0EQakEBEMUICyADQRBqKAIAIAMoAhhqIARCEIg8AAAgAyADKAIYQQFqNgIYIANBCGoQlQQiBEIBg1ANAAsLIABBATYCACAAIARCIIg+AgQgA0EQahCiCCADKAIIIgBBJEkNASAAEAAMAQsgACADKQMQNwIEIABBADYCACAAQQxqIANBGGooAgA2AgAgAygCCCIAQSRJDQAgABAACyADQSBqJAALrQIBAX8jAEHgAGsiAyQAIAMgATYCJCADIAA2AiAgA0EYaiADQSBqENwGAkAgAygCGCIABEAgAygCHCEBA0AgA0EANgIwIANCATcDKCADIAE2AjwgAyAANgI4IANBATYCVCADQgE3AkQgA0Hwu8AANgJAIANBkgE2AlwgAyADQdgAajYCUCADIANBOGo2AlggA0EoaiADQUBrEJQGDQIgA0HIAGogA0EwaigCADYCACADIAMpAyg3A0AgA0EQaiIBIANBQGsiACgCCDYCBCABIAAoAgA2AgAgAiADKAIQIAMoAhQQuAggABCiCCADQQhqIANBIGoQ3AYgAygCDCEBIAMoAggiAA0ACwsgA0HgAGokAA8LQfi7wABBNyADQUBrQbi9wABB/LzAABC9BQALpAIBBn8jAEHQA2siAyQAQcgDQQgQtwgiAgRAIAIgA0HwAGoiBEHgAhCiByICQQA2AuACIAJB5AJqIANBQGtBLhCiBxogAkEAOwGSAyACQZQDaiADQQxqQTQQogcaIAQgASACEPwCIAJBmANqIAEoAgQiByABKAIIQQJ0akGcA2ogAi8BkgMiBEECdEEEahCiBxogASgCACEBA0ACQCAFQQJ0IAJqQZgDaigCACIGIAU7AZADIAYgAjYC4AIgBSAESSIGIAVqIgUgBEsNACAGDQELCyAAIANB8ABqQSgQogciAEE0aiACNgIAIAAgATYCMCAAQSxqIAc2AgAgACABNgIoIANB0ANqJAAPC0HIA0EIQbTIwgAoAgAiAEHaAiAAGxEAAAALyAIBBH8jAEFAaiIDJAAgA0EgaiIEIAIoAgg2AgQgBCACKAIANgIAIAMoAiAhBCADKAIkIQUQFyEGIANBMGoiAiABNgIEIAJBADYCACACQQhqIAY2AgAgAygCNCECAn8CQAJAAkAgAygCMEEBRgRAIAIhAQwBCyADIAI2AiggAyADQThqKAIAIgI2AiwgA0EYaiIBIAQgBWo2AgQgASAENgIAIAMoAhgiASADKAIcIgRGDQIDQAJAIAMgATYCMCADQRBqIANBKGogA0EwahC2BSADKAIQDQAgBCABQQFqIgFHDQEMAwsLIAMoAhQhASADKAIsIgJBJEkNACACEAALQQEMAgsgAygCLCECIAMoAigaCyADQQhqIgEgAjYCBCABQQA2AgAgAygCDCEBIAMoAggLIQIgACABNgIEIAAgAjYCACADQUBrJAALiwICBH8CfiMAQeAOayICJAAgAiABEI0CIAJByAtqIgMgAkGYA2pBgAEQogcaIAJBoAZqKQMAIQYgAkGoBmooAgAhBSACQdgEaikDACEHIAJByAxqIAJBmARqQcAAEKIHGiACQbAHaiIEIANBwAEQogcaIAIgBzcD8AggAkH4CGogAkHgBGpBwAAQogcaIAJBuAlqIAJBoAVqQYABEKIHGiACIAU2AsAKIAIgBjcDuAogAyACQZgDEKIHGiACQcgKaiIFIAMQ0AcgBCAFQcAAEOACIAMgBEGYAxCiBxogAkGIC2oiBCADENAHIAAgBBDPCCABEPEHIAEgAUGwBmpBgAEQ4AIgAkHgDmokAAueAgEDfyMAQUBqIgEkACAAKAIAIgIoAgAhAyACIAAoAgQ2AgAgASADQQNxIgA2AgwgAEECRgRAAkAgA0F8cSIABEADQCAAKAIEIAAoAgAhAiAAQQA2AgAgAkUNAiAAQQE6AAggASACNgIQIAJBGGoQjAIgAiACKAIAIgBBf2o2AgAgAEEBRgRAIAFBEGoQjAYLIgANAAsLIAFBQGskAA8LQbD1wQBBK0G4/MEAEIAHAAsgAUE0akHYAjYCACABQSRqQQI2AgAgAUIDNwIUIAFBiPXBADYCECABQdgCNgIsIAEgAUEMajYCOCABQaT8wQA2AjwgASABQShqNgIgIAEgAUE8ajYCMCABIAFBOGo2AiggAUEQakGo/MEAEOwHAAvsAQIBfwJ+IAApA8ABIgSnQf8AcSEDAkBBACAEUEUgAxtFBEAgACADaiABIAJBgAEgA2siAyADIAJLGyIDEKIHGiAAKQPAASIEIAOtfCIFIARUDQEgACAFNwPAASACIANrIQIgASADaiEBCyACQYABTwRAA0AgAEIAEDYgACABQYABEKIHIgMpA8ABIgRCgAF8IgUgBFQNAiADIAU3A8ABIAFBgAFqIQEgAkGAf2oiAkGAAU8NAAsLIAIEQCAAQgAQNiAAIAEgAhCiByIAKQPAASIEIAKtfCIFIARUDQEgACAFNwPAAQsPCxC6BgAL/QEBAn8jAEEQayICJAAgACgCACACQQA2AgwCfwJAAkAgAUGAAU8EQCABQYAQSQ0BIAJBDGohACABQYCABE8NAiACIAFBP3FBgAFyOgAOIAIgAUEMdkHgAXI6AAwgAiABQQZ2QT9xQYABcjoADUEDDAMLIAIgAToADCACQQxqIQBBAQwCCyACIAFBP3FBgAFyOgANIAIgAUEGdkHAAXI6AAwgAkEMaiEAQQIMAQsgAiABQT9xQYABcjoADyACIAFBEnZB8AFyOgAMIAIgAUEGdkE/cUGAAXI6AA4gAiABQQx2QT9xQYABcjoADUEECyEBIAAgARC6ASACQRBqJAALhgIBBn8jAEHQA2siAyQAIAEoAgghByABKAIAIQggASgCFCEFIAEoAhAhBCAAIAJBkAEQogchBiAEIAVJBEAgBSAEayECIARBBXQgB2ohASAEQZABbCAIaiEAIANBkAFqIQUDQCADQaACaiIEIABBkAEQogcaIANByANqIAFBGGopAwA3AwAgA0HAA2ogAUEQaikDADcDACADQbgDaiABQQhqKQMANwMAIAMgASkDADcDsAMgBCADQbADahDmAiADIAZBkAEQogciBCAFIARBoAJqQZABEKIHEEcgBiAEQZABEKIHGiABQSBqIQEgAEGQAWohACACQX9qIgINAAsLIANB0ANqJAAL3wEBA38jAEHwAmsiAiQAIAIQwAYgAkHgAmogAUEYaikDADcDACACQdgCaiABQRBqKQMANwMAIAJB0AJqIAFBCGopAwA3AwAgAiABKQMANwPIAiACQaACaiIBIAJByAJqIgMQ+wggAyABEP0GIAEgAxDKCCADIAFBKBCiBxogAxC0BkH/AXEiAUECRwRAA0AgAUH/AXEhASAEBH8gAhDIAUEBBSABQQBHCyEEIAEEQCACIAAQiQELIAJByAJqELQGQf8BcSIBQQJHDQALCyAAIAJBoAIQogcaIAJB8AJqJAAL2QEBBn9BMCEFIwBBgAlrIgMkACADQQA6AAggA0HQAGogABCNAiAD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AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQYSLwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQYSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQZSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQeSJwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQfSJwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQbSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQcSJwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQZSLwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQdSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQfSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQaSKwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALsAIBA38jAEFAaiIDJAAgACgCACIALQAEIQQgAEEDOgAEIAAoAgAhBSADIABBDGopAAA3AB8gAyAAKQAFNwMYAkAgBEEDRwRAIAMgAykAHzcAByADIAMpAxg3AwAgAyADKQMANwMwIAMgAykABzcAN0E0QQQQtwgiAEUNASAAIAQ6AAQgACAFNgIAIAAgAykDMDcABSAAIAI2AhggACABNgIUIAAgAykCGDcCHCAAQQA6ADAgACADLwAVOwAxIABBDGogAykANzcAACAAQSRqIANBIGopAgA3AgAgAEEsaiADQShqKAIANgIAIABBM2ogA0EXai0AADoAACAAQaSLwAAQzAMgA0FAayQADwtB9IfAAEEVEO4IAAtBNEEE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IwBBMGsiASQAIAFBKGpCADcDACABQSBqQgA3AwAgAUEYakIANwMAIAFCADcDECABQQhqIAFBEGoQ9QYgAAJ/IAEoAggiAkUEQCABKQMQIQUgASkDGCEGIAEpAyAhByABKQMoIQgjAEHQAGsiAiQAIAJBBDYCHEHQksEAKAAAIQMgAkHQAGokACMAQdAAayICJAAgAkEENgIcQdSSwQAoAAAhBCACQdAAaiQAIABBNGogBDYCACAAQTBqIAM2AgAgAEEoakIANwMAIABBIGogCDcDACAAQRhqIAc3AwAgAEEQaiAGNwMAIABBCGogBTcDAEEADAELIAEoAgwhAyAAIAI2AgQgAEEIaiADNgIAQQELNgIAIAFBMGokAAv8AQEFfyMAQeAAayICJAAgAiABNwMQIAJBCGoiA0HiADYCBCADIAJBEGoiAzYCACACQdQAaiIEQQE2AgAgAkIBNwJEIAJBtODAADYCQCACIAIpAwg3AyggAiACQShqIgU2AlAgAkEYaiACQUBrIgYQmAIgBRD5AiAAQQE2AgAgACACKQMYNwIEIABBDGogAkEgaigCADYCACACQcwAaiACKQIoNwIAIAQgAkEwaikCADcCACACQdwAaiACQThqKAIANgIAIAJCADcCRCACQbTgwAA2AkAgAiAGENkEIABBFGogAikDADcCACAAQQE2AhAgAxCuBiACQeAAaiQAC+EBAQZ/IwBBIGsiASQAAkACQAJ/QQEgACgCBCIFIAAoAggiAk0NABogACgCACACai0AAEHCAEYEQCAAIAJBAWo2AgggAUEQaiAAEIUGIAEoAhBFDAELIAAoAgAiBiACai0AACAAIAJBAWoiBDYCCEGff2oiA0EYTQRAQQEgA3RBhqWhCHENA0EBIAN0QYHSkARxDQJBACADQQ9GDQEaC0EBCyABQSBqJAAPCyAFIARNDQAgBCAGai0AAEHuAEcNACAAIAJBAmo2AggLIAFBCGogABCAAyABKAIIIAFBIGokAEULzQIBA39Bl4XBACECQQQhAwJAAkACfwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAUH/AXFBn39qDhoDFQAQAQ8WCQgOFgULBw0SFhYECgITFgYMERYLQZOFwQAhAgwUC0GQhcEADBILQY6FwQAhAkECIQMMEgtB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ACACKAIEEAEhAyABEKIIIAIoApwEIgFBJE8EQCABEAALIAAgAzYCBEEBDAELIABBCGogAkEYakGABBCiBxpBAAs2AgAgAkHQBGokAAvkAQEGfyMAQRBrIgYkAAJAAkAgAS0ACEEARyABKAIEIgMgASgCACIESXIiBw0AIAMgBGsiAkEBaiIFIAJPDQAgBkEIaiABQQhqKAIANgIAIAYgASkCADcDACAAIAYQ2gMMAQsgACAFEM4IIAAoAgAhASAAKAIIIQICQCAHDQAgAkECdCABaiEBAkAgAyAESwRAIAQhBQNAIAEgBTYCACABQQRqIQEgBUEBaiIFIANHDQALIAMgBGsgAmohAgwBCyADIARHDQELIAEgAzYCACACQQFqIQILIAAgAjYCCAsgBkEQaiQAC/UBAQJ/IwBBQGoiAyQAIANBOGogAkEIaigCADYCACADIAIpAgA3AzAgA0EgaiADQTBqEMgGAkACQCAALQAQDQAgACgCAA0AIANBGGogAygCICIEIAMoAiggACgCBCAAQQxqKAIAEI0BIAMoAhgiAEUNACADQRBqIgIgAygCHDYCBCACIAA2AgAgAyADKQMQNwMwIANBMGogARChByECIAMoAiRFDQEgBBB6DAELIAMoAiAhACADQQhqIgIgAygCKDYCBCACIAA2AgAgAyADKQMINwMwIANBMGogARChByECIAMoAiRFDQAgABB6CyADQUBrJAAgAgvNAQEFfyMAQdANayICJAAgAkEIaiIEIAFBoAIQogcaIAQQ2QEgAkGoAmoiAyABQaACaiIFQaACEKIHGiADENkBIAMQkgIgBCADEMoGIAJByARqIAQQqwEgACACKQPIBEIBUQR+IAJBsAtqIgMgAkHQBGoiBkGgAhCiBxogAkHwBmoiBCAGQaACEKIHGiACQZAJaiADQaACEKIHIQMgBCABELABIAMgBRCwASADEM0HIABBCGogBEHABBCiBxpCAQVCAAs3AwAgAkHQDWokAAuIAgIBfwF+IwBB0ABrIgIkAAJ/IAAoAgBBAUYEQCACIABBBGo2AjQgAkGYATYCBCACIAJBNGo2AgAgAkHMAGpBATYCACACQgE3AjwgAkGk4sAANgI4IAIgAikDADcDICACIAJBIGo2AkggASACQThqEO4FDAELIAIgAEEEajYCHCACIABBCGo2AjQg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KAKgAyEBIAJB1AFqIANBBHJBzAEQogcaAkAgAUEBRwRAIAJBCGoiASACQdgBakHIARCiBxogAAJ/IAEQtgMEQCAAQQhqIAJBCGpByAEQogcaQQAMAQsgAEEBNgIEQQELNgIADAELIAAgAikC1AE3AgQgAEEBNgIAIABBFGogAkHkAWopAgA3AgAgAEEMaiACQdwBaikCADcCAAsgAkHwBGokAAu/AQECfyMAQdACayICJAAgAkHgAWoiAyABEIUBIAIoAuABIQEgAkH0AGogA0EEckHsABCiBxoCQCABQQFHBEAgAkEIaiIBIAJB+ABqQegAEKIHGiAAAn8gARClBARAIABBCGogAkEIakHoABCiBxpBAAwBCyAAQQE2AgRBAQs2AgAMAQsgACACKQJ0NwIEIABBATYCACAAQRRqIAJBhAFqKQIANwIAIABBDGogAkH8AGopAgA3AgALIAJB0AJqJAALywEBA38jAEHwAGsiAyQAIAMgASACEKgCQQEhBAJAIAMoAgBBAUYEQCADQTBqIgUgA0EEckEoEKIHGiADQeAAaiACNgIAIAMgATYCXCADQQY6AFggA0HYAGogA0HoAGpB1LPAABC0BSEBIAUQ5gMgACABNgIEDAELIABBIGogA0EgaikDADcDACAAQRhqIANBGGopAwA3AwAgAEEQaiADQRBqKQMANwMAIABBCGogA0EIaikDADcDAEEAIQQLIAAgBDYCACADQfAAaiQAC8sBAQN/IwBB8ABrIgMkACADIAEgAhCoAkEBIQQCQCADKAIAQQFGBEAgA0EwaiIFIANBBHJBKBCiBxogA0HgAGogAjYCACADIAE2AlwgA0EGOgBYIANB2ABqIANB6ABqQbSzwAAQtAUhASAFEOYDIAAgATYCBAwBCyAAQSBqIANBIGopAwA3AwAgAEEYaiADQRhqKQMANwMAIABBEGogA0EQaikDADcDACAAQQhqIANBCGopAwA3AwBBACEECyAAIAQ2AgAgA0HwAGokAAvfAQICfwF+IwBBIGsiAiQAIAJBEGoiAyAAQSBqNgIEIAMgADYCACACKAIQIQAgAkEIaiIDIAIoAhQ2AgQgAyAANgIAIAIoAgwiACACKAIIIgNHBEADQCACIABBeGoiACkDACIEQjiGIARCKIZCgICAgICAwP8Ag4QgBEIYhkKAgICAgOA/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IAAoAgggAWo2AgggAkEANgIoIAMQogggAkEwaiQAC6UBAQV/IwBBEGsiBCQAIARBCGoiAkEENgIEIAJBADYCAAJAIAQoAggiAiAEKAIMIgNJBEAgAyACayEFIAEgAkEDdCIBaiEDIAAgAWohACACQQQgAkEESxsiBiACayEBA0AgAUUNAiAAIAMpAwA3AwAgAUF/aiEBIANBCGohAyAAQQhqIQAgBUF/aiIFDQALCyAEQRBqJAAPCyAGQQRB7LfAABDpBQALsgEBA38jAEFAaiIBJAAgAUE0akEBNgIAIAFCATcCJCABQcznwAA2AiAgAUHUATYCPCABIAA2AjggASABQThqNgIwIAFBEGoiAiABQSBqEJgCIAFBCGoiAyACKAIINgIEIAMgAigCADYCACABKAIIIAEoAgwQASACEKIIAkAgAC0AACICQQdNBEAgAkEFRw0BIABBBGoQoggMAQsgAEEEahCiCAsgAEEQahCKBSABQUBrJAALsAEBBX8jAEFAaiIDJAAgASgCECICQYz7wAAgAhshBCABQRhqKAIAQQAgAhsiBUEwbCECAkADQAJAIAJFBEBBACECIAUNAyABKAIAIQQgASgCCCEBIANBBDYCECADQQI2AjAgAEEAIAQgAUECRhsgA0EIaiADQTBqQQBBAEEAQQAQYg0BDAMLIAJBUGohAiAAIAEgBBChAyAEQTBqIQRFDQELC0EBIQILIANBQGskACACC6wBAQR/IwBBoAJrIgMkAAJ/QQEgAC0AwAENABogAyAAQeAAakHgABCiByIBEGMgAUHgAGoiAiAAQeAAEKIHGiACEGMgAiAAEGsgAUHAAWoiAEH4nMEAQTAQogcaIAFB8AFqQficwQBBMBCiByEEIAIgABCiAyABQZABaiIAIAQQogMCQCABIAJBMBDWBg0AIAFBMGogAEEwENYGDQBBAQwBC0EACyADQaACaiQAC7cBAQZ/IwBBEGsiBCQAIARBCGoiAyABKAIEIgUvATIiBjYCBCADQQA2AgAgBCgCCCIBIAQoAgwiAyABIANLGyEHIAFBAnQgBWpBBGohAyACKAIAIQICQAJAA0AgASAHRg0CIAMoAgAhBSADQQRqIQMgAUEBaiEBAkBBfyACIAVHIAIgBUkbDgIAAQILCyABQX9qIQZBASEIDAELIAFBf2ohBgsgACAIOgAE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QQxqEOwGIAIoAgQhAQJAIAIoAgBFBEAgAigCDCIDQSRPBEAgAxAACyAAIAEQswMMAQsgAEEBNgIAIAAgATYCBCACKAIMIgBBJEkNACAAEAALIAJBEGokAA8LQfCAwABBK0H8gcAAEIAHAAu2AQEDfyMAQRBrIgIkACABQQhqKAIAIgQEQCABKAIEIQMgASAEQX9qNgIIIAEgA0EIajYCBCACIAMoAgAgAygCBBDMBzYCDCACIAEgAkEMahDsBiACKAIEIQECQCACKAIARQRAIAIoAgwiA0EkTwRAIAMQAAsgACABELQDDAELIABBATYCACAAIAE2AgQgAigCDCIAQSRJDQAgABAACyACQRBqJAAPC0HwgMAAQStB/IHAABCABwALtgEBA38jAEEQayICJAAgAUEIaigCACIEBEAgASgCBCEDIAEgBEF/ajYCCCABIANBCGo2AgQgAiADKAIAIAMoAgQQzAc2AgwgAiABIAJBDGoQ7AYgAigCBCEBAkAgAigCAEUEQCACKAIMIgNBJE8EQCADEAALIAAgARDuBAwBCyAAQQE2AgAgACABNgIEIAIoAgwiAEEkSQ0AIAAQAAsgAkEQaiQADwtB8IDAAEErQfyBwAAQgAcAC7YBAQN/IwBBEGsiAiQAIAFBCGooAgAiBARAIAEoAgQhAyABIARBf2o2AgggASADQQhqNgIEIAIgAygCACADKAIEEMwHNgIMIAIgASACQQxqEOwGIAIoAgQhAQJAIAIoAgBFBEAgAigCDCIDQSRPBEAgAxAACyAAIAEQ8wQMAQsgAEEBNgIAIAAgATYCBCACKAIMIgBBJEkNACAAEAALIAJBEGokAA8LQfCAwABBK0H8gcAAEIAHAAu2AQEDfyMAQRBrIgIkACABQQhqKAIAIgQEQCABKAIEIQMgASAEQX9qNgIIIAEgA0EIajYCBCACIAMoAgAgAygCBBDMBzYCDCACIAEgAkEMahDsBiACKAIEIQECQCACKAIARQRAIAIoAgwiA0EkTwRAIAMQAAsgACABEOwEDAELIABBATYCACAAIAE2AgQgAigCDCIAQSRJDQAgABAACyACQRBqJAAPC0HwgMAAQStB/IHAABCABwALrQEBBX8jAEEgayICJAAgASgCACEEIAJBCGogASgCCCIGEJ0FIAIoAgghASACKAIMIQMgAEEANgIIIAAgAzYCBCAAIAE2AgACQCADRQ0AIAZBDGwhBQNAIAVFDQEgAkEQaiAEELcGIAFBCGogAkEYaigCADYCACABIAIpAxA3AgAgAUEMaiEBIAVBdGohBSAEQQxqIQQgA0F/aiIDDQALCyAAIAY2AgggAkEgaiQAC6cBAQV/IwBBIGsiASQAIAFBGGogAEEIaigCADYCACABIAApAgA3AxAgASABQRBqELkFIAEoAggiBEEBaiECIAEoAgQiAyAEQQJ0akEEaigCACABKAIAIgUEQCACQQJ0IANqQTRqKAIAIQMgBUF/aiICBEADQCADKAI0IQMgAkF/aiICDQALC0EAIQILIAAgAjYCCCAAIAM2AgQgAEEANgIAIAFBIGokAAvDAQECfyMAQUBqIgEkACABQQA2AhAgAUIBNwMIIAEgADYCFCABQeYBNgIcIAEgAUEUajYCGCABIAFBCGo2AiQgAUE8akEBNgIAIAFCATcCLCABQYTwwAA2AiggASABQRhqNgI4IAFBJGpBgOzAACABQShqELYBBEBBjPDAAEE3IAFBKGpBoPHAAEGQ8cAAEL0FAAsgASABQQhqIgAoAgg2AgQgASAAKAIANgIAIAEoAgAgASgCBBAcIAAQogggAUFAayQAC7oBAQF/IwBBMGsiAiQAAn8gACgCAEEBRgRAIAIgAEEEajYCDCACQSRqQQE2AgAgAkIBNwIUIAJBjPLAADYCECACQe0BNgIsIAIgAkEoajYCICACIAJBDGo2AiggASACQRBqEO4FDAELIAIgAEEEajYCDCACQSRqQQE2AgAgAkIBNwIUIAJBjPLAADYCECACQesBNgIsIAIgAkEoajYCICACIAJBDGo2AiggASACQRBqEO4FCyACQTBqJAALsgEBAX8jAEEwayIDJAAgAyACNgIMIAMgATYCCCADIANBCGoQ3AYCQAJAIAMoAgAiAUUEQCADQQA2AhAMAQsgA0EQaiABIAMoAgQQqwUgAygCEEUNACADQShqIgEgA0EYaigCADYCACADIAMpAxA3AyAgAygCCCADKAIMIANBIGoQ2wIgAEEIaiABKAIANgIAIAAgAykDIDcCAAwBCyAAQQA2AgggAEIBNwIACyADQTBqJAALtwEBBn8jAEEQayIEJAAgASgCBCIDIAJPBEACQCADRQ0AIANBAnQhAyABKAIAIQUC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AgAhAyAAKAIIIQUgASACRwRAIAVBBXQgA2ohAwNAIAQgARDgByADQRhqIARBGGopAwA3AwAgA0EQaiAEQRBqKQMANwMAIANBCGogBEEIaikDADcDACADIAQpAwA3AwAgBUEBaiEFIANBIGohAyACIAFBDGoiAUcNAAsLIAAgBTYCCCAEQSBqJAALpgEBAn8jAEHAA2siBiQAIAZBqAJqIgcgASACIAMgBCAFENcBIAYoAqgCIQMgBkGUAWogB0EEckGUARCiBxpBASECAkAgA0EBRwRAIAYgBkGYAWpBkAEQogciAkGoAmoiAyABQZABEKIHGiADEKQDIAIgAxBHIAAgAhCWBzoAAUEAIQIMAQsgAEEEaiAGQZQBakEoEKIHGgsgACACOgAAIAZBwANqJAALpQEBAn8jAEEQayIDJAAgAEHInsEAQTAQogciBEEwakEAQfABEO0HGiAEQaACakEAQaACEO0HGiADQcAANgIMIAMgAjYCCCADQQhqENQGQf8BcSICQQJHBEBBACEAA0AgAkH/AXEhAiAAQQFxBH8gBBC0BEEBBSACQQBHCyEAIAIEQCAEIAEQ2gQLIANBCGoQ1AZB/wFxIgJBAkcNAAsLIANBEGokAAusAQIDfwF+IwBBEGsiBSQAIAUgARC4BkEBIQQgBSkCBCEHAkACQCAFKAIAQQFHBEAgB6chBgJAIAdCIIinIgQgAyAEIANJGyIEQQFHBEAgAiAEIAYgBBCJCAwBCyADRQ0DIAIgBi0AADoAAAsgACAENgIEIAEgASkDACAErXw3AwBBACEEDAELIAAgBzcCBAsgACAENgIAIAVBEGokAA8LQQBBAEH0n8EAEOkFAAusAQIBfwF+IwBBMGsiAiQAIABCADcAACAAQRhqQgA3AAAgAEEQakIANwAAIABBCGpCADcAACACQSA2AgwgAiAANgIIIAJBEGoiACABEG4gACACQQhqEJcCIgOnIgBB/wFxQQNHBEAgAiAAOgAQIAIgA0I4iDwAFyACIANCKIg9ABUgAiADQgiIPgARQZywwABBKyACQRBqQdiwwABBlLPAABC9BQALIAJBMGokAAusAQIBfwF+IwBBMGsiAiQAIABCADcAACAAQRhqQgA3AAAgAEEQakIANwAAIABBCGpCADcAACACQSA2AgwgAiAANgIIIAJBEGoiACABEG4gACACQQhqEJcCIgOnIgBB/wFxQQNHBEAgAiAAOgAQIAIgA0I4iDwAFyACIANCKIg9ABUgAiADQgiIPgARQZywwABBKyACQRBqQdiwwABBpLPAABC9BQALIAJBMGokAAusAQIBfwF+IwBBMGsiAiQAIABCADcAACAAQRhqQgA3AAAgAEEQakIANwAAIABBCGpCADcAACACQSA2AgwgAiAANgIIIAJBEGoiACABEG4gACACQQhqEJcCIgOnIgBB/wFxQQNHBEAgAiAAOgAQIAIgA0I4iDwAFyACIANCKIg9ABUgAiADQgiIPgARQZywwABBKyACQRBqQdiwwABBxLPAABC9BQALIAJBMGokAAusAQIBfwF+IwBBMGsiAiQAIABCADcAACAAQRhqQgA3AAAgAEEQakIANwAAIABBCGpCADcAACACQSA2AgwgAiAANgIIIAJBEGoiACABEG4gACACQQhqEJcCIgOnIgBB/wFxQQNHBEAgAiAAOgAQIAIgA0I4iDwAFyACIANCKIg9ABUgAiADQgiIPgARQezbwABBKyACQRBqQajcwABB8N7AABC9BQALIAJBMGokAAuWAQIEfwR+IwBBMGsiAyQAAkADQCABQTBGDQEgACABaiABQQhqIQEpAwBQDQALIANB+J7BAEEwEKIHIQJBACEBA0AgASACaiIEKQMAIgcgACABaikDACIIfSEFIAQgBSAGfTcDACAHIAhUrSAFIAZUrXxCAVGtIQYgAUEIaiIBQTBHDQALIAAgAkEwEKIHGgsgA0EwaiQAC6EBAQR/IwBBoAVrIgQkACAEIABBoAIQogciBCABIAIQ0wEgBEGgAmoiBiAAQaACaiIFQaACEKIHGiAGIAMQrgIgBEHABGoiByACQeAAEKIHGiAHIAMQogMgBEHwBGogA0EwahCiAyAFIAAQyQYgBSABIAcQ0wEgBSAEEMoGIAUgBhDKBiAAIAZBoAIQogciABCSAiAAIAQQyQYgBEGgBWokAAunAQEDfyMAQcABayIBJAACf0EAIAAQnAJFDQAaIAFBsAFqQYDiwQApAwA3AwAgAUGoAWpB+OHBACkDADcDACABQaABakHw4cEAKQMANwMAIAFB6OHBACkDADcDmAEgAUGAAjYCuAEgAUEIaiAAIAFBmAFqEJEFIAFB6ABqIQADQEEBIAJBMEYNARogACACaiACQQhqIQIpAwBQDQALQQALIAFBwAFqJAALnQEBBH8jAEEgayICJAACQAJAIAEtAAgNACABKAIEIgQgASgCACIFSQ0AIAQgBWsiBEEBaiIDIARPDQAgAEEENgIAQQAhAwwBCyACQQhqIAMQpgMgAigCDCEDIAAgAigCCDYCAAsgAEEANgIIIAAgAzYCBCACQRhqIAFBCGooAgA2AgAgAiABKQIANwMQIAAgAkEQahCdAyACQSBqJAALigEBA38gACgCAARAIABBBGoQoggLIAAoAhBFBEAgAEEUahCSCA8LIABBGGoiASgCACECIAAoAhQiAxCSCCADIAIoAggiA0ETakEAIANrcWogAigCABEEACAAKAIUIQAgASgCACICKAIIIgFBBCABQQRLGyIBIAIoAgRqQRNqQQAgAWtxBEAgABB6CwvEAQIDfwJ+IwBBMGsiAyQAIANBKGoiBCABQQhqKQIANwMAIAMgASkCADcDICADQRBqIgUgA0EgaiIBKQMINwMIIAUgASkDADcDACADQRhqKQMAIQcgAykDECEGIAQgAkEIaikCADcDACADIAIpAgA3AyAgAyABKQMINwMIIAMgASkDADcDACADKQMAIAaFIQYgASADQQhqKQMAIAeFNwMIIAEgBjcDACAAQQhqIAQpAwA3AgAgACADKQMgNwIAIANBMGokAAuYAQECfyMAQUBqIgMkACAAQciewQBBMBCiByIEQTBqQQBBMBDtBxogA0EIaiIAIAJBMBCiBxogA0GAAzYCOCAAELMGQf8BcSICQQJHBEBBACEAA0AgAkH/AXEhAiAAQQFxBH8gBBBjQQEFIAJBAEcLIQAgAgRAIAQgARBrCyADQQhqELMGQf8BcSICQQJHDQALCyADQUBrJAALqAEBBn8jAEEQayIFJAAgACAAKAIIIAEQgAYgACgCACEEIAAoAgghAyAFQQhqIgYgATYCBCAGQQE2AgAgA0GQAWwgBGohBCAFKAIIIgYgBSgCDCIHSQRAIAcgBmshCANAIAQgAkGQARDDBUGQAWohBCAIQX9qIggNAAsgAyAHaiAGayEDCyAAIAEEfyAEIAJBkAEQwwUaIANBAWoFIAMLNgIIIAVBEGokAAu3AQICfwF+IwBBMGsiACQAIABB8QARBAAgAEEoakH4xMIAKAIANgIAIABBIGpB8MTCACkCADcDAEHoxMIAKQIAIQJB6MTCACAAKQMANwIAQfDEwgAgAEEIaikDADcCAEH4xMIAIABBEGooAgA2AgAgACACNwMYIAKnBEAgAEEYahC9BiAAKAIcIgFBJE8EQCABEAALIABBIGoiASgCABACBEAgAUEEahCYBwsLIABBMGokAEHoxMIAC6UBAQN/IwBB4AFrIgMkACADQQhqIAEgAhDYA0EBIQQCQCADKAIIQQFGBEAgA0GgAWoiBSADQQhqQQRyQSgQogcaIANB0AFqIAI2AgAgAyABNgLMASADQQY6AMgBIANByAFqIANB2AFqQYSzwAAQtAUhASAFEOYDIAAgATYCBAwBCyAAQQhqIANBEGpBkAEQogcaQQAhBAsgACAENgIAIANB4AFqJAALwgEBBH8jAEHQA2siAyQAQcgDQQgQtwgiAkUEQEHIA0EIQbTIwgAoAgAiAEHaAiAAGxEAAAALIAIgA0HwAGpB4AIQogciAkEANgLgAiACQeQCaiADQUBrQS4QogcaIAJBADsBkgMgAkGUA2ogA0EMakE0EKIHGiACIAEoAgQiBDYCmAMgASgCACEFIARBADsBkAMgBCACNgLgAiABIAI2AgQgASAFQQFqIgE2AgAgACACNgIEIAAgATYCACADQdADaiQAC6UBAQN/IwBBoAJrIgMkACADQQhqIAEgAhCpAUEBIQQCQCADKAIIQQFGBEAgA0HgAWoiBSADQQhqQQRyQSgQogcaIANBkAJqIAI2AgAgAyABNgKMAiADQQY6AIgCIANBiAJqIANBmAJqQdzbwAAQtAUhASAFEOYDIAAgATYCBAwBCyAAQQhqIANBEGpB0AEQogcaQQAhBAsgACAENgIAIANBoAJqJAALpQEBA38jAEGgAmsiAyQAIANBCGogASACEKkBQQEhBAJAIAMoAghBAUYEQCADQeABaiIFIANBCGpBBHJBKBCiBxogA0GQAmogAjYCACADIAE2AowCIANBBjoAiAIgA0GIAmogA0GYAmpBvNvAABC0BSEBIAUQ5gMgACABNgIEDAELIABBCGogA0EQakHQARCiBxpBACEECyAAIAQ2AgAgA0GgAmokAAulAQEDfyMAQfACayIDJAAgA0EIaiABIAIQ3ANBASEEAkAgAygCCEEBRgRAIANBsAJqIgUgA0EIakEEckEoEKIHGiADQeAC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BEAgA0EIakKAgICAgAQ3AwAgAygCCCEEIAMoAgwMAQsgA0EQaiIEIAJBCGoQogQgAyAEQSAQ2wYgAygCACEEIAMoAgQLIQIgBEUEQCABQQRqQb+TwABBCRDMByACEMQIQQAMAQsgAiEBQQELIQIgACABNgIEIAAgAjYCACADQTBqJAALjAECA38BfiMAQRBrIgQkAAJAIAEoAgwiAkEBaiIDIAJJBEAQnwggBCkDCCEFIABBATYCACAAIAU3AgQMAQsgAyABKAIAIgIgAkEBakEDdkEHbCACQQhJGyICQQF2SwRAIAAgASADIAJBAWoiACADIABLGxDuAQwBCyABEK8BIABBADYCAAsgBEEQaiQAC6cBAQJ/IwBBIGsiASQAAkAgAC0AEEECRwRAIAFBCGogAEEQahCwAyABKAIIQQFGDQEgASABKAIMIgI2AhggASABQRBqLQAAOgAcIAItAAJFBEAgABCIAyACQQE6AAILIAFBGGoQ1wcgACECCyABQSBqJAAgAg8LIAEgASgCDDYCGCABIAFBEGotAAA6ABxBlPLAAEErIAFBGGpBwPLAAEG088AAEL0FAAunAQECfyMAQUBqIgMkACADIAAoAgAQKCIENgIIIAMgAjYCDCACIARGBEAgACABEPYGIANBQGskAA8LIANBNGpBigI2AgAgA0EkakECNgIAIANCAzcCFCADQcDuwQA2AhAgA0GKAjYCLCADIANBCGo2AjggAyADQShqNgIgIAMgA0E8ajYCMCADIANBOGo2AiggAyADQQxqNgI8IANBEGpB9O3BABDsBwALkwEBA38jAEEwayICJAAgACAAKAIIIAEoAgQgASgCAGtBAnYQgAYgACgCACEEIAAoAgghAyACQRhqIAFBEGooAgA2AgAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQShqIAM2AgAgAiAAQQhqNgIkIAIgA0GQAWwgBGo2AiAgAkEIaiACQSBqEJoCIAJBMGokAAvCAQECfyMAQeAAayICJAAgAkKm8//yqI+RwAY3A1ggAkK11suG2b2645J/NwNQIAJCr4mF55Pc9I5ZNwNIIAJCifuw7YOVjeZZNwNAIAJC///T4vr/v9UHNwM4IAJCqtX/////779uNwMwIAIgASACQTBqIgMQ1gQgAyACQTAQogcaIAMQRCADIAEQ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aiQAQoD+A4MgBoQgBYQLsQECA38DfiMAQRBrIgIkAAJ+QoAGIABBCGooAgAiAUUNABogACgCBEEAIAEbIgAoAgAhASACQQhqIgMgACgCBDYCBCADIAE2AgAgAigCCCIAIAIoAgwiAUG2k8AAQQkQ2AcEfkIABUKAAkKABCAAIAFBv5PAAEEJENgHGwsiBKdBAXFFBEAgBEKAfoMMAQtCASEFIARCIIinrUIghiIGCyACQRBqJABCgP4DgyAGhCAFhAuVAQEEfyMAQRBrIgEkACABIAAoAgggAEEMaigCACAAKAIEIAAoAgAQkwUgAUEMaigCACEEIAEoAgghACABKAIEIgMEQCABKAIAIQIgA0ECdCEDA0AgAhC2BCACQQRqIQIgA0F8aiIDDQALCyAEBEAgBEECdCECA0AgABC2BCAAQQRqIQAgAkF8aiICDQALCyABQRBqJAALrQEBA38jAEHQAWsiASQAIAFBQGsiAkEEckEAQcAAEO0HGiABQcAANgJAIAFBiAFqIgMgAkHEABCiBxogASADQQRyQcAAEKIHIQEgAEEANgIIIABCADcDACAAQQxqIAFBwAAQogcaIABB5ABqQdyswAApAgA3AgAgAEHcAGpB1KzAACkCADcCACAAQdQAakHMrMAAKQIANwIAIABBxKzAACkCADcCTCABQdABaiQAC6gBAQJ/IwBB8AZrIgIkACACQQhqEOAEIAJB0ANqEIYDIAIpA9ADQgFRBEBBnLDAAEErIAJBOGpByLDAAEGQssAAEL0FAAsgAkE4aiIDIAJB2ANqQZgDEKIHGiACIAEoAgg2AgQgAiABKAIANgIAIAMgAigCACACKAIEEO8IIAJB0ANqIgEgA0GYAxCiBxogASACQQhqIgEQnwYgACABEIQBIAJB8AZqJAALjQEBAn8jAEFAaiIDJAAgAEGQ3MEAQTAQogchBCADQQhqIgAgAkEwEKIHGiADQYADNgI4IAAQswZB/wFxIgJBAkcEQEEAIQADQCACQf8BcSECIABBAXEEfyAEEERBAQUgAkEARwshACACBEAgBCABED0LIANBCGoQswZB/wFxIgJBAkcNAAsLIANBQGskAAucAQIDfwF+IwBBIGsiAiQAIAJBCGogARCgB0EAIQEgAigCDCEDAkACQAJAAkACQCACKAIIDgMBAAIACyAAIAM2AgRBASEBDAMLIAJBEGogAxCxAyACKAIUIQQgAigCEEEBRg0BIAJBGGopAwAhBQsgACAENgIEIABBCGogBTcCAAwBCyAAIAQ2AgRBASEBCyAAIAE2AgAgAkEgaiQAC5sBAQN/IwBBEGsiASQAIAAoAgBFBEAgAEF/NgIAIAAgACgCBCICBH8gAEEAOgAUIAEgAEEEaiIDQQAgAhsiAkEIajYCBCACKAIAIAFBBGogAigCBCgCDBECAEUEQCADELYGIANBADYCAAsgACgCAEEBagVBAAs2AgAgAUEQaiQADwtB1KfAAEEQIAFBCGpB5KfAAEGMqcAAEL0FAAuuAQEBfyMAQfAAayICJAAgAUEIahDkBhogAkECOgAQIAJBLGogAUEYaikCADcCACACQSRqIAFBEGopAgA3AgAgAkEcaiABKQIINwIAIAIgASkCADcCFCACQThqIAJBNBCiBxpBNEEEELcIIgFFBEBBNEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALIAEgAkE4akE0EKIHIQEgAEHAzMAANgIEIAAgATYCACACQfAAaiQAC5UBAQV/IwBB4AZrIgIkACACIABBoAIQogciAiABELABIAJBoAJqIgQgAEGgAmoiA0GgAhCiBxogBCABQaACaiIGELABIAJBwARqIgUgAUGgAhCiBxogBSAGEMkGIAMgABDJBiADIAUQsAEgAyACEMoGIAMgBBDKBiAAIARBoAIQogciABCSAiAAIAIQyQYgAkHgBmokAAuPAQEDfyMAQYABayIDJAAgAC0AACECQQAhAANAIAAgA2pB/wBqIAJBD3EiBEEwciAEQdcAaiAEQQpJGzoAACAAQX9qIQAgAkEEdiICDQALIABBgAFqIgJBgQFPBEAgAkGAAUHoo8IAEOwFAAsgAUEBQfijwgBBAiAAIANqQYABakEAIABrEKgBIANBgAFqJAALjgEBA38jAEGAAWsiAyQAIAAtAAAhAkEAIQADQCAAIANqQf8AaiACQQ9xIgRBMHIgBEE3aiAEQQpJGzoAACAAQX9qIQAgAkEEdiICDQALIABBgAFqIgJBgQFPBEAgAkGAAUHoo8IAEOwFAAsgAUEBQfijwgBBAiAAIANqQYABakEAIABrEKgBIANBgAFqJAALtAEBA38jAEGgAWsiASQAIAFBADYCACABQdgAaiICQQA2AgggAiABQcQAajYCBCACIAFBBHI2AgAgAUHIAGoiAyACKQIANwIAIANBCGogAkEIaigCADYCACABKAJIIgIgASgCTCIDRwRAA0AgAkHcADoAACABIAEoAgBBAWo2AgAgAyACQQFqIgJHDQALCyABQdgAaiICIAFBxAAQogcaIAAgAkEEckHAABCiBxogAUGgAWokAAuzAQEDfyMAQaABayIBJAAgAUEANgIAIAFB2ABqIgJBADYCCCACIAFBxABqNgIEIAIgAUEEcjYCACABQcgAaiIDIAIpAgA3AgAgA0EIaiACQQhqKAIANgIAIAEoAkgiAiABKAJMIgNHBEADQCACQTY6AAAgASABKAIAQQFqNgIAIAMgAkEBaiICRw0ACwsgAUHYAGoiAiABQcQAEKIHGiAAIAJBBHJBwAAQogcaIAFBoAFqJAALtgEBA38jAEGgAmsiASQAIAFBADYCACABQZgBaiICQQA2AgggAiABQYQBajYCBCACIAFBBHI2AgAgAUGIAWoiAyACKQIANwIAIANBCGogAkEIaigCADYCACABKAKIASICIAEoAowBIgNHBEADQCACQdwAOgAAIAEgASgCAEEBajYCACADIAJBAWoiAkcNAAsLIAFBmAFqIgIgAUGEARCiBxogACACQQRyQYABEKIHGiABQaACaiQAC68BAQN/IwBBgAFrIgEkACABQQA2AgAgAUHIAGoiAkEANgIIIAIgAUE0ajYCBCACIAFBBHI2AgAgAUE4aiIDIAIpAgA3AgAgA0EIaiACQQhqKAIANgIAIAEoAjgiAiABKAI8IgNHBEADQCACQQA6AAAgASABKAIAQQFqNgIAIAMgAkEBaiICRw0ACwsgAUHIAGoiAiABQTQQogcaIAAgAkEEckEwEKIHGiABQYABaiQAC7UBAQN/IwBBoAJrIgEkACABQQA2AgAgAUGYAWoiAkEANgIIIAIgAUGEAWo2AgQgAiABQQRyNgIAIAFBiAFqIgMgAikCADcCACADQQhqIAJBCGooAgA2AgAgASgCiAEiAiABKAKMASIDRwRAA0AgAkEAOgAAIAEgASgCAEEBajYCACADIAJBAWoiAkcNAAsLIAFBmAFqIgIgAUGEARCiBxogACACQQRyQYABEKIHGiABQaACaiQAC7UBAQN/IwBBoAJrIgEkACABQQA2AgAgAUGYAWoiAkEANgIIIAIgAUGEAWo2AgQgAiABQQRyNgIAIAFBiAFqIgMgAikCADcCACADQQhqIAJBCGooAgA2AgAgASgCiAEiAiABKAKMASIDRwRAA0AgAkE2OgAAIAEgASgCAEEBajYCACADIAJBAWoiAkcNAAsLIAFBmAFqIgIgAUGEARCiBxogACACQQRyQYABEKIHGiABQaACaiQAC4oBAQJ/IwBBkAJrIgMkACADQQA2AgACQCACIAFrIgJBgAEgAkGAAUkbIgJFDQAgA0EEciABIAIQogcaA0AgAiAEQQFqIgRHDQALIAMgBDYCACAEQYABSQ0AIANBiAFqIgEgA0GEARCiBxogACABQQRyQYABEKIHGiADQZACaiQADwsgBEGAARDnBQALmwEBAn8jAEHgAGsiBCQAIABBAEHgABDtByEDIARByJ7BAEEwEKIHIgBBMGpBAEEwEO0HGiADQeAAaiAAQeAAEKIHGiADQcABakEAQeAAEO0HGiAAIAJBKBCiByICELQGQf8BcSIAQQJHBEADQCADEMgBIABB/wFxBEAgAyABEI8BCyACELQGQf8BcSIAQQJHDQALCyACQeAAaiQAC6sBAQF/IwBBMGsiAyQAIANBCGogAkEAEPQFIANBADYCGCADIAMpAwg3AxAgA0EQaigCACABIAIQogcaIAMgAjYCGCADQShqIgEgAjYCACADIAMpAxA3AyBBDEEEELcIIgJFBEBBDEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALIAIgAykDIDcCACACQQhqIAEoAgA2AgAgAEGwrMEANgIEIAAgAjYCACADQTBqJAALlAEBAX8jAEFAaiICJAAgAkIANwM4IAJBOGogACgCABAxIAJBHGpBATYCACACIAIoAjwiADYCMCACIAA2AiwgAiACKAI4NgIoIAJB1wI2AiQgAkICNwIMIAJBlPHBADYCCCACIAJBKGo2AiAgAiACQSBqNgIYIAEgAkEIahDuBSACKAIsBEAgAigCKBB6CyACQUBrJAALjAEBAX8jAEEwayICJAAgAiABNgIMIAJBEGogAkEMahCUBAJAIAIoAhAEQCACQShqIAJBGGooAgA2AgAgAiACKQMQNwMgIAAgAkEgahCjBwwBCyACQQxqIAJBIGpBwIDAABDFASEBIABBATYCACAAIAE2AgQLIAIoAgwiAEEkTwRAIAAQAAsgAkEwaiQAC5IBAQF/IwBBIGsiAiQAIAIgATYCDAJAIAJBDGoQhggEQCAAQgA3AgAgAigCDCIAQSRJDQEgABAADAELIAJBEGogAigCDBCxA0EBIQECQCACKAIQQQFGBEAgACACKAIUNgIEDAELIAAgAikCFDcCBCAAQQxqIAJBHGooAgA2AgBBACEBCyAAIAE2AgALIAJBIGokAAuqAQEEfyMAQeAAayIDJABB5ABBBBC3CCICRQRAQeQAQQRBtMjCACgCACIAQdoCIAAbEQAAAAsgAkEANgIAIAJBBGogA0EwakEuEKIHGiACQQA7ATIgAkE0aiADQTAQogcaIAIgASgCBCIENgI0IAEoAgAhBSAEQQA7ATAgBCACNgIAIAEgAjYCBCABIAVBAWoiATYCACAAIAI2AgQgACABNgIAIANB4ABqJAALkgEBAX8jAEFAaiICJAAgAkEMahD5AiAAQQhqIAFBCGopAgA3AgAgACABKQIANwIAIAJBLGogAikCDDcCACACQTRqIAJBFGopAgA3AgAgAkE8aiACQRxqKAIANgIAIAJCADcCJCACQfy/wAA2AiAgAiACQSBqENkEIABBFGogAikDADcCACAAQQE2AhAgAkFAayQAC5ABAQJ/IAAgACgCCCACIAFrQQV2EP8FIAAoAgghBCABIAJHBEAgACgCACAEQQV0aiEDA0AgAyABKQMANwMAIANBGGogAUEYaikDADcDACADQRBqIAFBEGopAwA3AwAgA0EIaiABQQhqKQMANwMAIARBAWohBCADQSBqIQMgAiABQSBqIgFHDQALCyAAIAQ2AggLjAEBAX8jAEEwayICJAAgAiABNgIMIAJBEGogAkEMahCUBAJAIAIoAhAEQCACQShqIAJBGGooAgA2AgAgAiACKQMQNwMgIAAgAkEgahCnBwwBCyACQQxqIAJBIGpBlOjAABDFASEBIABBATYCACAAIAE2AgQLIAIoAgwiAEEkTwRAIAAQAAsgAkEwaiQAC4wBAQF/IwBBMGsiAiQAIAIgATYCDCACQRBqIAJBDGoQlAQCQCACKAIQBEAgAkEoaiACQRhqKAIANgIAIAIgAikDEDcDICAAIAJBIGoQpQcMAQsgAkEMaiACQSBqQaTowAAQxQEhASAAQQE2AgAgACABNgIECyACKAIMIgBBJE8EQCAAEAALIAJBMGokAAuMAQEBfyMAQTBrIgIkACACIAE2AgwgAkEQaiACQQxqEJQEAkAgAigCEARAIAJBKGogAkEYaigCADYCACACIAIpAxA3AyAgACACQSBqEKYHDAELIAJBDGogAkEgakH058AAEMUBIQEgAEEBNgIAIAAgATYCBAsgAigCDCIAQSRPBEAgABAACyACQTBqJAALjAEBAX8jAEEwayICJAAgAiABNgIMIAJBEGogAkEMahCUBAJAIAIoAhAEQCACQShqIAJBGGooAgA2AgAgAiACKQMQNwMgIAAgAkEgahCrBwwBCyACQQxqIAJBIGpB1OjAABDFASEBIABBATYCACAAIAE2AgQLIAIoAgwiAEEkTwRAIAAQAAsgAkEwaiQAC4wBAQF/IwBBMGsiAiQAIAIgATYCDCACQRBqIAJBDGoQlAQCQCACKAIQBEAgAkEoaiACQRhqKAIANgIAIAIgAikDEDcDICAAIAJBIGoQqQcMAQsgAkEMaiACQSBqQYTowAAQxQEhASAAQQE2AgAgACABNgIECyACKAIMIgBBJE8EQCAAEAALIAJBMGokAAuMAQEBfyMAQTBrIgIkACACIAE2AgwgAkEQaiACQQxqEJQEAkAgAigCEARAIAJBKGogAkEYaigCADYCACACIAIpAxA3AyAgACACQSBqEKwHDAELIAJBDGogAkEgakHE6MAAEMUBIQEgAEEBNgIAIAAgATYCBAsgAigCDCIAQSRPBEAgABAACyACQTBqJAALjAEBAX8jAEEwayICJAAgAiABNgIMIAJBEGogAkEMahCUBAJAIAIoAhAEQCACQShqIAJBGGooAgA2AgAgAiACKQMQNwMgIAAgAkEgahCkBwwBCyACQQxqIAJBIGpB5OfAABDFASEBIABBATYCACAAIAE2AgQLIAIoAgwiAEEkTwRAIAAQAAsgAkEwaiQAC4wBAQF/IwBBMGsiAiQAIAIgATYCDCACQRBqIAJBDGoQlAQCQCACKAIQBEAgAkEoaiACQRhqKAIANgIAIAIgAikDEDcDICAAIAJBIGoQqAcMAQsgAkEMaiACQSBqQbTowAAQxQEhASAAQQE2AgAgACABNgIECyACKAIMIgBBJE8EQCAAEAALIAJBMGokAAuMAQEBfyMAQTBrIgIkACACIAE2AgwgAkEQaiACQQxqEJQEAkAgAigCEARAIAJBKGogAkEYaigCADYCACACIAIpAxA3AyAgACACQSBqEKoHDAELIAJBDGogAkEgakHU58AAEMUBIQEgAEEBNgIAIAAgATYCBAsgAigCDCIAQSRPBEAgABAACyACQTBqJAALlAEBAX8gACABQZABEKIHIgIQSSACIAEQR0ECIQADQCACEEkgAEF/aiIADQALIAIgARBHQQMhAANAIAIQSSAAQX9qIgANAAsgAiABEEdBCSEAA0AgAhBJIABBf2oiAA0ACyACIAEQR0EgIQADQCACEEkgAEF/aiIADQALIAIgARBHQRAhAANAIAIQSSAAQX9qIgANAAsLjwEBA38jAEGAAWsiAyQAIAAoAgAhAkEAIQADQCAAIANqQf8AaiACQQ9xIgRBMHIgBEHXAGogBEEKSRs6AAAgAEF/aiEAIAJBBHYiAg0ACyAAQYABaiICQYEBTwRAIAJBgAFB6KPCABDsBQALIAFBAUH4o8IAQQIgACADakGAAWpBACAAaxCoASADQYABaiQAC44BAQN/IwBBgAFrIgMkACAAKAIAIQJBACEAA0AgACADakH/AGogAkEPcSIEQTByIARBN2ogBEEKSRs6AAAgAEF/aiEAIAJBBHYiAg0ACyAAQYABaiICQYEBTwRAIAJBgAFB6KPCABDsBQALIAFBAUH4o8IAQQIgACADakGAAWpBACAAaxCoASADQYABaiQAC5QBAQJ/IwBBoAZrIgMkACADIAEgAhDAASAAAn8gAygCAEEBRgRAIAMoAgQhBCADQZAGaiACNgIAIAMgATYCjAYgA0EGOgCIBiADQYgGaiADQZgGakGso8AAELQFIQEgBEEkTwRAIAQQAAsgACABNgIEQQEMAQsgAEEIaiADQQhqQYAGEKIHGkEACzYCACADQaAGaiQAC4IBAQF/IAAgASgCDCACKAIEIgNBD3cgA0ENd3MgA0EKdnNqIgM2AgwgACABKAIIIAIoAgAiAkEPdyACQQ13cyACQQp2c2oiAjYCCCAAIAEoAgQgA0EPdyADQQ13cyADQQp2c2o2AgQgACABKAIAIAJBD3cgAkENd3MgAkEKdnNqNgIAC38BAX8gACABKAIMIAEoAggiA0EZdyADQQN2cyADQQ53c2o2AgwgACADIAEoAgQiA0EZdyADQQN2cyADQQ53c2o2AgggACABKAIAIgFBGXcgAUEDdnMgAUEOd3MgA2o2AgQgACACKAIMIgBBGXcgAEEDdnMgAEEOd3MgAWo2AgALqwEDAX8CfgF8IwBBEGsiAiQAIAIgARCcBwJAIAIoAgBBAUcNACACKwMIIQUgASgCABAgRQ0AAn4gBUT////////fQ2VFIAVEAAAAAAAA4MNmIgFBAXNyRQRAIAWwDAELQv///////////wBCgICAgICAgICAfyABGyIDIANCACAFRP///////99DZRsgARsLIQNCASEECyAAIAM3AwggACAENwMAIAJBEGokAAuZAQEFfyMAQRBrIgIkACABQQxqKAIAIQQgASgCACEFIAEoAgghBiABKAIAIQMCQCABLQAAQQRxQQJ2RQ0AIAEgA0EIciIDNgIAIAEoAghBAUYNACABQoGAgICgATcCCAsgASADQQRyNgIAIAIgACgCADYCDCACQQxqIAEQ9gQgASAENgIMIAEgBjYCCCABIAU2AgAgAkEQaiQAC5gBAQR/IwBBEGsiAiQAAkACQAJAAkAgAS0AEEEBaw4DAwIBAAsgASABKQIANwIICyACQQhqIAFBCGoiAxBYIAIoAgwhBCACKAIIIQUCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIAAgBUEARzYCACACQRBqJAAPCwALQaCXwABBI0GgncAAEIAHAAuZAQEEfyMAQRBrIgIkAAJAAkACQAJAIAEtABBBAWsOAwMCAQALIAEgASkCADcCCAsgAkEIaiABQQhqIgMQtwMgAigCDCEEIAIoAgghBQJAIAEtAAwNACADKAIAIgNBJEkNACADEAALIAFBAToAECAAIAQ2AgQgACAFQQBHNgIAIAJBEGokAA8LAAtBoJfAAEEjQZCcwAAQgAcAC5kBAQR/IwBBEGsiAiQAAkACQAJAAkAgAS0AEEEBaw4DAwIBAAsgASABKQIANwIICyACQQhqIAFBCGoiAxCyASACKAIMIQQgAigCCCEFAkAgAS0ADA0AIAMoAgAiA0EkSQ0AIAMQAAsgAUEBOgAQIAAgBDYCBCAAIAVBAEc2AgAgAkEQaiQADwsAC0Ggl8AAQSNB9JrAABCABwALmQEBBH8jAEEQayICJAACQAJAAkACQCABLQAQQQFrDgMDAgEACyABIAEpAgA3AggLIAJBCGogAUEIaiIDEIYBIAIoAgwhBCACKAIIIQUCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIAAgBUEARzYCACACQRBqJAAPCwALQaCXwABBI0HUmsAAEIAHAAuYAQEEfyMAQRBrIgIkAAJAAkACQAJAIAEtABBBAWsOAwMCAQALIAEgASkCADcCCAsgAkEIaiABQQhqIgMQViACKAIMIQQgAigCCCEFAkAgAS0ADA0AIAMoAgAiA0EkSQ0AIAMQAAsgAUEBOgAQIAAgBDYCBCAAIAVBAEc2AgAgAkEQaiQADwsAC0Ggl8AAQSNB5KHAABCABwALmQEBBH8jAEEQayICJAACQAJAAkACQCABLQAQQQFrDgMDAgEACyABIAEpAgA3AggLIAJBCGogAUEIaiIDEI4BIAIoAgwhBCACKAIIIQUCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIAAgBUEARzYCACACQRBqJAAPCwALQaCXwABBI0GUocAAEIAHAAuZAQEEfyMAQRBrIgIkAAJAAkACQAJAIAEtABBBAWsOAwMCAQALIAEgASkCADcCCAsgAkEIaiABQQhqIgMQwwEgAigCDCEEIAIoAgghBQJAIAEtAAwNACADKAIAIgNBJEkNACADEAALIAFBAToAECAAIAQ2AgQgACAFQQBHNgIAIAJBEGokAA8LAAtBoJfAAEEjQeyYwAAQgAcAC5gBAQR/IwBBEGsiAiQAAkACQAJAAkAgAS0AEEEBaw4DAwIBAAsgASABKQIANwIICyACQQhqIAFBCGoiAxB2IAIoAgwhBCACKAIIIQUCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIAAgBUEARzYCACACQRBqJAAPCwALQaCXwABBI0G8n8AAEIAHAAuZAQEEfyMAQRBrIgIkAAJAAkACQAJAIAEtABBBAWsOAwMCAQALIAEgASkCADcCCAsgAkEIaiABQQhqIgMQiwEgAigCDCEEIAIoAgghBQJAIAEtAAwNACADKAIAIgNBJEkNACADEAALIAFBAToAECAAIAQ2AgQgACAFQQBHNgIAIAJBEGokAA8LAAtBoJfAAEEjQZygwAAQgAcAC5gBAQR/IwBBEGsiAiQAAkACQAJAAkAgAS0AEEEBaw4DAwIBAAsgASABKQIANwIICyACQQhqIAFBCGoiAxByIAIoAgwhBCACKAIIIQUCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIAAgBUEARzYCACACQRBqJAAPCwALQaCXwABBI0HEosAAEIAHAAuZAQEEfyMAQRBrIgIkAAJAAkACQAJAIAEtABBBAWsOAwMCAQALIAEgASkCADcCCAsgAkEIaiABQQhqIgMQqgEgAigCDCEEIAIoAgghBQJAIAEtAAwNACADKAIAIgNBJEkNACADEAALIAFBAToAECAAIAQ2AgQgACAFQQBHNgIAIAJBEGokAA8LAAtBoJfAAEEjQeCbwAAQgAcAC5gBAQF/AkAgACgCAEF/aiACRgRAIAAoAgQiBC8BMiICQQpNDQFB5LPAAEEgQbC1wAAQgAcAC0HwtMAAQTBBoLXAABCABwALIAQgAkEBaiIEOwEyIAAoAgQgAkECdGpBBGogATYCACAEQQJ0IgEgACgCBGpBNGogAzYCACAAKAIEIgAgAWpBNGooAgAiASAEOwEwIAEgADYCAAucAQEDfyMAQSBrIgIkACACQRhqIgMgAUEQaikCADcDACACQRBqIgQgAUEIaikCADcDACACIAEpAgA3AwhBGEEEELcIIgFFBEBBGEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALIAEgAikDCDcCACABQRBqIAMpAwA3AgAgAUEIaiAEKQMANwIAIABBiLbAADYCBCAAIAE2AgAgAkEgaiQAC3oBA38gACgCAEUEQCAAQQRqEJIIDwsgAEEIaiIBKAIAIQIgACgCBCIDEJIIIAMgAigCCCIDQRNqQQAgA2txaiACKAIAEQQAIAAoAgQhACABKAIAIgIoAggiAUEEIAFBBEsbIgEgAigCBGpBE2pBACABa3EEQCAAEHoLC48BAQJ/IwBBIGsiASQAAkAgAAJ/QQIQjAcNABoQlQcQggcgAUEIakGYxcIAKAIAEPgCIAEoAghBAUYNASABKAIMIQIgAUEQai0AAAs6AAQgACACNgIAIAFBIGokAA8LIAEgASgCDDYCGCABIAFBEGotAAA6ABxBqPzAAEErIAFBGGpB1PzAAEHA/cAAEL0FAAt+AgJ/An4jAEEQayIDJAACfkIAIAEoAgQgASgCCCIETQ0AGkIAIAEoAgAgBGotAAAgAkH/AXFHDQAaIAEgBEEBajYCCCADIAEQwwJCASADKQMApw0AGiADKQMIIgVCAXwiBiAFVK0LIQUgACAGNwMIIAAgBTcDACADQRBqJAALiQEBAn8jAEEQayIDJAACQCABLQAABEBBAiEEDAELIANBCGogAhD/BiADKAIMIQIgAygCCARAQQEhBCABQQE6AAAMAQsCfyACEBRFBEAgAhAVIQFBAAwBCyABQQE6AABBAgshBCACQSRPBEAgAhAACyABIQILIAAgAjYCBCAAIAQ2AgAgA0EQaiQAC5IBAQJ/IAAtAAghASAAKAIEIgIEQCAAAn9BASABQf8BcQ0AGgJAIAJBAUcNACAALQAJRQ0AIAAoAgAiAS0AAEEEcQ0AQQEgASgCGEHIo8IAQQEgAUEcaigCACgCDBEBAA0BGgsgACgCACIAKAIYQcmjwgBBASAAQRxqKAIAKAIMEQEACyIBOgAICyABQf8BcUEARwuaAQEDfyMAQbABayIDJAAgAyABKAIINgIEIAMgASgCADYCACADKAIEIQEgAygCACEEIANBFGogAigCACIFIAIoAggiAkEFdGo2AgAgA0EANgIYIAMgBTYCECADIAQ2AgggAyACIAEgASACSxs2AhwgAyABQZABbCAEajYCDCADQSBqIgEQ+AcgACADQQhqIAEQ4gIgA0GwAWokAAuYAQEDfwJ/AkACQCABKAIAIgJFDQADQAJAIAEoAgQgASgCCCIETQ0AIAIgBGotAABBxQBHDQAgASAEQQFqNgIIDAILIAMEQCABKAIMIgIoAhhB4oXBAEECIAJBHGooAgAoAgwRAQANAwsgARBUDQIgA0EBaiEDIAEoAgAiAg0ACwtBAAwBC0EBCyEBIAAgAzYCBCAAIAE2AgALhAEBAn8jAEEwayIDJAAgAEEAQTAQ7QciAEEwakGQzMEAQTAQogcaIABB4ABqQQBBMBDtBxogA0EIaiIEIAJBKBCiBxogBBC0BkH/AXEiAkECRwRAA0AgABBJIAJB/wFxBEAgACABEEALIANBCGoQtAZB/wFxIgJBAkcNAAsLIANBMGokAAuOAQEEfyMAQRBrIgIkACACQQhqIAEQoAdBACEBIAIoAgwhAwJAAkACQAJAAkAgAigCCA4DAQACAAsgACADNgIEQQEhAQwDCyACIAMQkgQgAigCBCEEIAIoAgANAUEBIQULIAAgBTYCBCAAQQhqIAQ2AgAMAQsgACAENgIEQQEhAQsgACABNgIAIAJBEGokAAuNAQEBfyMAQRBrIgUkAAJAAkAgBCADSwRAIAIgBEkNAiAAIARBAnQgAWo2AgAgAiAEayEEDAELIAVBCGogASACIAQgAxDnBiAFKAIMIQQgACAFKAIINgIAQQAhAwsgACABNgIIIAAgBDYCBCAAQQxqIAM2AgAgBUEQaiQADwtBpKTAAEEjQZSlwAAQgAcAC5UBAQN/IwBBEGsiAyQAIAAoAgAiAigCCEUEQCACQX82AgggAkEMaiABEJEGIAJBHGoiAS0AACEEIAFBAToAACACIAIoAghBAWo2AggCQCAEQQFxDQAgAEEEaigCACAAQQhqKAIAECMiAEEkSQ0AIAAQAAsgA0EQaiQADwtB2KrAAEEQIANBCGpB6KrAAEHwq8AAEL0FAAtwAQN/IwBBEGsiAyQAA0AgA0EIaiAAENAGIAMoAghBAUYNAAsCQCAAKAIEIgFFDQAgASgCACECIAAoAgAgARB6IAJFDQBBAWohAQNAIAIoAgAhACACEHogAEEARyABaiEBIAAiAg0ACwsgA0EQaiQAC6QBAQN/IwBBEGsiASQAIAAoAgAiAkEUaigCACEDAkACfwJAAkAgAigCBA4CAAEDCyADDQJBACECQaT0wQAMAQsgAw0BIAIoAgAiAygCBCECIAMoAgALIQMgASACNgIEIAEgAzYCACABQYz+wQAgACgCBCgCCCAAKAIIEMIDAAsgAUEANgIEIAEgAjYCACABQfj9wQAgACgCBCgCCCAAKAIIEMIDAAuTAQEDfyMAQRBrIgIkAAJAAkACQAJAIAEtACBBAWsOAwMCAQALIAEgASkCADcCECABQRhqIAFBCGopAgA3AgALIAJBCGogAUEQaiIDEKUGIAIoAgwhBCABLQAcRQRAIAMQqggLIAFBAToAICAAIAQ2AgQgAEEANgIAIAJBEGokAA8LAAtBoJfAAEEjQaCewAAQgAcAC5MBAQN/IwBBEGsiAiQAAkACQAJAAkAgAS0AIEEBaw4DAwIBAAsgASABKQIANwIQIAFBGGogAUEIaikCADcCAAsgAkEIaiABQRBqIgMQpgYgAigCDCEEIAEtABxFBEAgAxCqCAsgAUEBOgAgIAAgBDYCBCAAQQA2AgAgAkEQaiQADwsAC0Ggl8AAQSNBwJ7AABCABwALjgEBAn8jAEEQayIDJAAgASgCACEEAn8gAigCAEUEQCADQoCAgICABDcDACADKAIAIQQgAygCBAwBCyADQQhqIAQgAhDdAiADKAIIIQQgAygCDAshAgJ/IARFBEAgAUEEakG2k8AAQQkQzAcgAhDECEEADAELQQELIQEgACACNgIEIAAgATYCACADQRBqJAALhAEBA38gACAAKAIIIAAoAgQiAyAAIAEQwQUiBGoiBS0AAEEBcWs2AgggBSABp0EZdiIFOgAAIAAoAgAgBEF8anEgA2pBBGogBToAAEEAIARrQQxsIANqIgNBdGoiBEEIaiACQQhqKAIANgIAIAQgAikCADcCACAAIAAoAgxBAWo2AgwgAwutAQIDfwJ+IwBBMGsiACQAAkBB/MTCACgCAEEBRg0AQfzEwgAoAgAhAUH8xMIAQQE2AgBBgMXCACkCACEDQYDFwgBCADcCAEGIxcIAKQIAIQRBiMXCAEHghcIANgIAQZDFwgAoAgAhAkGMxcIAQgA3AgAgAEEMaiAENwIAIABBFGogAjYCACAAIAE2AgAgACADNwIEIAFFDQAgAEEIahDdAwsgAEEwaiQAQYDFwgALcwEBfyMAQdAEayICJAAgAkGoAmogAUEgELcBIAIpA6gCQgFSBEAgAkEIaiIBIAJBsAJqQaACEKIHGiAAQQhqIAFBoAIQogcaIABCADcDACACQdAEaiQADwtB5I7AAEEfIAJBCGpB8I3AAEG4j8AAEL0FAAtmAgF/AX4CQCABrUIMfiIDQiCIpw0AIAOnIgFBf0wNAAJAIAEEQCABQQQQtwgiAg0BIAFBBEG0yMIAKAIAIgBB2gIgABsRAAAAC0EEIQILIAAgAjYCACAAIAFBDG42AgQPCxDRCAALbwEDfyMAQTBrIgMkAANAIAMgABDXBSADKQMAQgFRDQALAkAgACgCBCIBRQ0AIAEoAuACIQIgACgCACABEHogAkUNAEEBaiEBA0AgAigC4AIhACACEHogAEEARyABaiEBIAAiAg0ACwsgA0EwaiQAC3QBAX8jAEHwDmsiAiQAIAJBuAdqIAFBwAAQ0gEgAikDuAdCAVIEQCACQQhqIgEgAkHAB2pBsAcQogcaIABBCGogAUGwBxCiBxogAEIANwMAIAJB8A5qJAAPC0Hvx8AAQR8gAkEIakHAxsAAQcTIwAAQvQUAC2gCAX8BfgJAIAGtQpABfiIDQiCIpw0AIAOnIgFBf0wNAAJAIAEEQCABQQgQtwgiAg0BIAFBCEG0yMIAKAIAIgBB2gIgABsRAAAAC0EIIQILIAAgAjYCACAAIAFBkAFuNgIEDwsQ0QgAC2gCAX8BfgJAIAGtQugAfiIDQiCIpw0AIAOnIgFBf0wNAAJAIAEEQCABQQgQtwgiAg0BIAFBCEG0yMIAKAIAIgBB2gIgABsRAAAAC0EIIQILIAAgAjYCACAAIAFB6ABuNgIEDwsQ0QgAC40BAQF/IwBBMGsiASQAIAEgAjcDCCAAAn8gAkKAgICAgICAEFoEQCABQd4BNgIEIAEgAUEIajYCACABIAEpAwA3AxAgAUEsakEBNgIAIAFCAjcCHCABQfDrwAA2AhggASABQRBqNgIoQQEhAyABQRhqEI4EDAELIAK6EAQLNgIEIAAgAzYCACABQTBqJAALOQEBf0HgAEEIELcIIgFFBEBB4ABBCEG0yMIAKAIAIgBB2gIgABsRAAAACyAAIAE2AgAgAEECNgIEC4QBAQF/IwBBIGsiBiQAIAEEQCAGIAEgAyAEIAUgAigCDBEJACAGQRhqIAZBCGooAgAiATYCACAGIAYpAwA3AxAgBigCFCABSwRAIAZBEGogARDhBiAGKAIYIQELIAYoAhAhAiAAIAE2AgQgACACNgIAIAZBIGokAA8LQdjvwQBBMBDuCAALjwEBA38jAEEQayICJAACQAJAAkACQCABLQAQQQFrDgMDAgEACyABIAEpAgA3AggLIAJBCGogAUEIaiIDEIoBIAIoAgwhBAJAIAEtAAwNACADKAIAIgNBJEkNACADEAALIAFBAToAECAAIAQ2AgQgAEEANgIAIAJBEGokAA8LAAtBoJfAAEEjQfCdwAAQgAcAC48BAQN/IwBBEGsiAiQAAkACQAJAAkAgAS0AEEEBaw4DAwIBAAsgASABKQIANwIICyACQQhqIAFBCGoiAxC1ASACKAIMIQQCQCABLQAMDQAgAygCACIDQSRJDQAgAxAACyABQQE6ABAgACAENgIEIABBADYCACACQRBqJAAPCwALQaCXwABBI0HEmcAAEIAHAAuCAQEEfyMAQRBrIgIkACACQQhqIgNBwAA2AgQgAyABNgIAIAIoAgwhBSACIAAQ5QUCQCACKAIAIgNFDQAgAyACKAIEIgQoAgARBAAgBCgCCBogBCgCBEUNACADEHoLIABBADYCQCAAIAApAzAgBUECdK19NwM4IAAgARA1IAJBEGokAAuEAQICfwF+IwBBEGsiBCQAAkACQCABLQAgRQRAIAQgASACIAMQsgQgBCkCBCEGIAQoAgBBAUYNAUEAIAMgBqciBRtFBEAgAEEANgIAIAAgBTYCBAwDCyABQQE6ACALIAAgAUEQaiACIAMQngQMAQsgAEEBNgIAIAAgBjcCBAsgBEEQaiQAC4QBAgJ/AX4jAEEQayIEJAACQAJAIAEtAChFBEAgBCABIAIgAxCzBCAEKQIEIQYgBCgCAEEBRg0BQQAgAyAGpyIFG0UEQCAAQQA2AgAgACAFNgIEDAMLIAFBAToAKAsgACABQRhqIAIgAxCeBAwBCyAAQQE2AgAgACAGNwIECyAEQRBqJAALqQEAAkACQAJAAkACQCAAKAIALQAAQQFrDgQCAwQAAQsgASgCGEGnvcIAQQQgAUEcaigCACgCDBEBAA8LIAEoAhhBor3CAEEFIAFBHGooAgAoAgwRAQAPCyABKAIYQfK9wgBBDCABQRxqKAIAKAIMEQEADwsgASgCGEHnvcIAQQsgAUEcaigCACgCDBEBAA8LIAEoAhhB3L3CAEELIAFBHGooAgAoAgwRAQALjgEBAX8jAEEwayIDJAAgAEEANgIIIABCATcCACADIAI2AgwgAyABNgIIIANBJGpBATYCACADQgE3AhQgA0H8v8AANgIQIANBkgE2AiwgAyADQShqNgIgIAMgA0EIajYCKCAAIANBEGoQlAYEQEGEwMAAQTcgA0EQakGYwcAAQYjBwAAQvQUACyADQTBqJAALgAEBBH8jAEHwAGsiBCQAIAAgACgCCCACIAFrQZABbhCCBiAAKAIIIQMgASACRwRAIAAoAgAgA0HoAGxqIQUDQCAEQQhqIgYgARCICCADQQFqIQMgBSAGQegAEKIHQegAaiEFIAIgAUGQAWoiAUcNAAsLIAAgAzYCCCAEQfAAaiQAC4MBAQN/IAEoAgQiAyACTwRAAkAgA0UNACABKAIAIQQCQAJAIAJFBEBBASEDIAQQegwBCyAEIANBASACEK8IIgNFDQELIAEgAjYCBCABIAM2AgAMAQsgACACNgIEIABBCGpBATYCAEEBIQULIAAgBTYCAA8LQdTwwQBBJEH48MEAEIAHAAtmAQF/AkAgAUH/////A3EgAUcNACABQQJ0IgFBf0wNAAJAIAEEQCABQQQQtwgiAg0BIAFBBEG0yMIAKAIAIgBB2gIgABsRAAAAC0EEIQILIAAgAjYCACAAIAFBAnY2AgQPCxDRCAALZQEBfwJAIAFB////P3EgAUcNACABQQV0IgFBf0wNAAJAIAEEQCABQQgQtwgiAg0BIAFBCEG0yMIAKAIAIgBB2gIgABsRAAAAC0EIIQILIAAgAjYCACAAIAFBBXY2AgQPCxDRCAALhgECAX8BfiMAQRBrIgIkACAAQQBBMBDtByEAIAJBMDYCBCACIAA2AgAgASACQQEQ9wEiA6ciAEH/AXFBA0cEQCACIAA6AAggAiADQjiIPAAPIAIgA0IoiD0ADSACIANCCIg+AAlBnLDAAEErIAJBCGpB2LDAAEHgssAAEL0FAAsgAkEQaiQAC4gBAgF/AX4jAEEQayICJAAgAEEAQeAAEO0HIQAgAkHgADYCBCACIAA2AgAgASACQQAQ9wEiA6ciAEH/AXFBA0cEQCACIAA6AAggAiADQjiIPAAPIAIgA0IoiD0ADSACIANCCIg+AAlBnLDAAEErIAJBCGpB2LDAAEHgssAAEL0FAAsgAkEQaiQAC4UBAQJ/IwBB4ABrIgIkACABLQBgIQMgAiABQeAAEKIHIQECQCADRQRAIAAgAUEwEKIHIgBBMGogAUEwakEwEKIHGiAAQeAAakGQzMEAQTAQogcaDAELIABBAEEwEO0HIgBBMGpBkMzBAEEwEKIHGiAAQeAAakEAQTAQ7QcaCyABQeAAaiQACzQCAX8BfiMAQSBrIgIkACACIAFBARD0BSACKQMAIQMgACABNgIIIAAgAzcCACACQSBqJAALjwECAX8BfiMAQUBqIgMkACADIAI2AhQgAyABNgIQIANBCGoiAUGTATYCBCABIAA2AgAgAykDCCEEIANBlAE2AgQgAyADQRBqNgIAIANBLGpBAjYCACADIAQ3AzAgA0ICNwIcIANB5L3AADYCGCADIAMpAwA3AzggAyADQTBqNgIoIANBGGoQvwYgA0FAayQAC3MBBH4gAkL/////D4MiAyABQv////8PgyIEfiIFQiCIIAMgAUIgiCIGfnwhASAEIAJCIIgiA34gAUL/////D4N8IQIgACADIAZ+QgB8QgB8IAFCIIh8IAJCIIh8NwMIIAAgBUL/////D4MgAkIghoQ3AwALhQEBAX8jAEEQayIDJAAgASgCABogAyACKAIALQAAuBAENgIEIANBADYCACADKAIEIQICfyADKAIARQRAIAMgAjYCDCABQQRqKAIAIANBDGooAgAQGRogAygCDCIBQSRPBEAgARAAC0EADAELQQELIQEgACACNgIEIAAgATYCACADQRBqJAALfQEDfyMAQRBrIgIkAAJAAkACQCABEJYHDQAgAUGQAWoQ2AUNACABQbgDaigCAEGQAWwhAyABKAKwAyEBA0AgA0UNAiADQfB+aiEDIAEQlgcgAUGQAWohAUUNAAsLIAJBBDoAACAAIAIQ6gQMAQsgAEECNgIQCyACQRBqJAALdQEEfyABKAIAIQMCQCABKAIIIgQgASgCBCIBLwGSA0kEQCABIQUgAyECDAELA0AgASgC4AIiBQRAIAEvAZADIQQgA0EBaiECCyABEHogAiEDIAQgBSIBLwGSA08NAAsLIAAgBDYCCCAAIAU2AgQgACACNgIAC3EBBH8gASgCACEDAkAgASgCCCIEIAEoAgQiAS8BMkkEQCABIQUgAyECDAELA0AgASgCACIFBEAgAS8BMCEEIANBAWohAgsgARB6IAIhAyAEIAUiAS8BMk8NAAsLIAAgBDYCCCAAIAU2AgQgACACNgIAC2cBAn8gACgCCCIBBEAgACgCACIAIAFBMGxqIQEDQAJAIAAoAgAiAkUNACAAQQRqKAIARQ0AIAIQegsCQCAAQRRqKAIAIgJFDQAgAEEYaigCAEUNACACEHoLIAEgAEEwaiIARw0ACwsLewEBfyMAQTBrIgEkACABQfUBNgIEIAFBADYCECABQgQ3AwggAUEANgIYIAEgAUEYajYCKCABIAFBBGo2AiQgASABQQhqNgIgELsGIABBCGogASgCEDYCACAAIAEpAwg3AgAgACABKAIcQQAgASgCGBs2AgwgAUEwaiQAC3ICAX8BfiMAQSBrIgIkACACIAEoAgQgASgCAGtBAnYQoAUgAikDACEDIABBADYCCCAAIAM3AgAgAkEYaiABQRBqKAIANgIAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggACACQQhqEL8EIAJBIGokAAuAAQEBfyMAQUBqIgUkACAFIAE2AgwgBSAANgIIIAUgAzYCFCAFIAI2AhAgBUEsakECNgIAIAVBPGpBgQM2AgAgBUICNwIcIAVB+KHCADYCGCAFQf0CNgI0IAUgBUEwajYCKCAFIAVBEGo2AjggBSAFQQhqNgIwIAVBGGogBBDsBwALbwECfyMAQTBrIgMkACABKAIAGiADQRBqIgQgAhCgBCADQQhqIARBIBDbBiADKAIMIQICfyADKAIIRQRAIAFBBGpBkIXAAEENEMwHIAIQxAhBAAwBC0EBCyEBIAAgAjYCBCAAIAE2AgAgA0EwaiQAC28BAn8jAEEwayIDJAAgASgCABogA0EQaiIEIAIQoQQgA0EIaiAEQSAQ2wYgAygCDCECAn8gAygCCEUEQCABQQRqQZ2FwABBDhDMByACEMQIQQAMAQtBAQshASAAIAI2AgQgACABNgIAIANBMGokAAtvAQJ/IwBBQGoiAyQAIAEoAgAaIANBEGoiBCACELAFIANBCGogBEEwENsGIAMoAgwhAgJ/IAMoAghFBEAgAUEEakHxhMAAQQoQzAcgAhDECEEADAELQQELIQEgACACNgIEIAAgATYCACADQUBrJAALcQEFfyAAKAIEIQIgAachAyAAKAIAIQRBACEAA0AgAEEEaiIAIAMgBHEiBWohAyACIAVqKAAAQYCBgoR4cSIGRQ0ACyAGaEEDdiAFaiAEcSIAIAJqLAAAQQBOBEAgAigCAEGAgYKEeHFoQQN2IQALIAALdAEDfyMAQSBrIgIkAAJAIAAgARCvAg0AIAFBHGooAgAhAyABKAIYIAJBHGpBADYCACACQYSIwgA2AhggAkIBNwIMIAJBoKHCADYCCCADIAJBCGoQtgENACAAQQRqIAEQrwIgAkEgaiQADwsgAkEgaiQAQQELbwEBfwJAIAEgAE8EQCACRQ0BIAAhAwNAIAMgAS0AADoAACABQQFqIQEgA0EBaiEDIAJBf2oiAg0ACwwBCyACRQ0AIAFBf2ohASAAQX9qIQMDQCACIANqIAEgAmotAAA6AAAgAkF/aiICDQALCyAAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpBtIvAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpByIvAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpB3IvAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpB8IvAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpBhIzAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpBmIzAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpBrIzAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpBwIzAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIAIAFBEGogAEEIaikCADcDACABIAApAgA3AwggASABQQhqNgIcIAFBHGpB1IzAABD9CCABLQAMQQNHBEAgAUEIahD3BgsgAUEgaiQAC2gBAX8jAEEgayIBJAAgAUEYaiAAQRBqKAIANgIA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NwIMIAJBvOfAADYCCCACIAA2AiggAkHSATYCJCACIABBEGo2AiAgAiACQSBqNgIYIAEgAkEIahDuBSACQTBqJAALcAEBfyMAQTBrIgMkACADIAI2AgQgAyABNgIAIANBFGpBlAE2AgAgA0GTATYCDCADIAA2AgggAyADNgIQIANBLGpBAjYCACADQgI3AhwgA0HM8cAANgIYIAMgA0EIajYCKCADQRhqEI4EIANBMGokAAtfAgF/An4jAEEwayIBJAAgASAAEE9BKCEAAn8DQAJAIABBeEcEQCAAIAFqKQMAIgIgAEGY2sEAaikDACIDWg0BC0EADAILIABBeGohACACIANYDQALQQELIAFBMGokAAtqAQR/IwBBEGsiAiQAIABCADcCBCABKAIEIQQgASgCACEFIAEoAggiAyABKAIMIgFHBEADQCAAIAMoAgAQwgggASADQQRqIgNHDQALCyACIAQ2AgwgAiAFNgIIIAJBCGoQ/wcgAkEQaiQAC2gBA38jAEEQayICJAAgAEIANwIEIAEoAgAiAyABKAIEIgRJBEAgASgCCEGQBmohAQNAIAIgAzYCDCADQQFqIQMgASACQQxqEMMIRQRAIAAgAigCDBDCCAsgAyAERw0ACwsgAkEQaiQAC30BAn8jAEEQayICJAAgAkEIaiIDIAFBCGooAgA2AgAgAiABKQIANwMAQQxBBBC3CCIBRQRAQQxBBEG0yMIAKAIAIgBB2gIgABsRAAAACyABIAIpAwA3AgAgAUEIaiADKAIANgIAIABBsLbAADYCBCAAIAE2AgAgAkEQaiQAC1oBAX8jAEEwayICJAAgAiAAIAEQvwMgAigCAEEBRwRAIAJBKGogAkEUaigCADYCACACQSBqIAJBDGopAgA3AwAgAiACKQIENwMYIAJBGGoQ2QMLIAJBMGokAAt1AQF/IwBBwAJrIgIkACACQeAANgK0AiACIAE2ArACIAJBCGogAkGwAmpBARB/IAIoAghBAUYEQCACIAIpAgw3A7gCQezbwABBKyACQbgCakGo3MAAQbTfwAAQvQUACyAAIAJBEGpBoAIQogcaIAJBwAJqJAALZAECfyMAQUBqIgIkACACQQhqEIsDAn8gAigCCEEBRgRAIAJBEGooAgAhASACKAIMDAELIAEgASkDMDcDOCABIAJBEGpBMBCiBxpBAAsh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QRBqJAALbwEBfyMAQRBrIgMkAAJAIAAoAgQgAWsgAk8EQCADQQA2AgAMAQsgAyAAIAEgAhDHAiADKAIAQQFHDQAgA0EIaigCACIABEAgAygCBCAAQbTIwgAoAgAiAEHaAiAAGxEAAAALENEIAAsgA0EQaiQAC28BAX8jAEEQayIDJAACQCAAKAIEIAFrIAJPBEAgA0EANgIADAELIAMgACABIAIQwgIgAygCAEEBRw0AIANBCGooAgAiAARAIAMoAgQgAEG0yMIAKAIAIgBB2gIgABsRAAAACxDRCAALIANBEGokAAtvAQF/IwBBEGsiAyQAAkAgACgCBCABayACTwRAIANBADYCAAwBCyADIAAgASACEM8CIAMoAgBBAUcNACADQQhqKAIAIgAEQCADKAIEIABBtMjCACgCACIAQdoCIAAbEQAAAAsQ0QgACyADQRBqJAALbwEBfyMAQRBrIgMkAAJAIAAoAgQgAWsgAk8EQCADQQA2AgAMAQsgAyAAIAEgAhDBAiADKAIAQQFHDQAgA0EIaigCACIABEAgAygCBCAAQbTIwgAoAgAiAEHaAiAAGxEAAAALENEIAAsgA0EQaiQAC1oBAX8jAEEgayICJAAgAiAAKAIANgIEIAJBGGogAUEQaikCADcDACACQRBqIAFBCGopAgA3AwAgAiABKQIANwMIIAJBBGpBgOzAACACQQhqELYBIAJBIGokAAtvAQF/IwBBEGsiAyQAAkAgACgCBCABayACTwRAIANBADYCAAwBCyADIAAgASACEKUCIAMoAgBBAUcNACADQQhqKAIAIgAEQCADKAIEIABBtMjCACgCACIAQdoCIAAbEQAAAAsQ0QgACyADQRBqJAALZwICfwF+IwBBEGsiAiQAIAEoAgghAyACIAEQwwICQCACKAIARQRAIAIpAwgiBCADQX9qrVQEQCAAQQhqIAQ+AgAgACABKQIANwIADAILIABBADYCAAwBCyAAQQA2AgALIAJBEGokAAtaAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQYSgwQAgAkEIahC2ASACQSBqJAALbwEBfyMAQRBrIgMkAAJAIAAoAgQgAWsgAk8EQCADQQA2AgAMAQsgAyAAIAEgAhCmAiADKAIAQQFHDQAgA0EIaigCACIABEAgAygCBCAAQbTIwgAoAgAiAEHaAiAAGxEAAAALENEIAAsgA0EQaiQAC20BAX8jAEEQayICJAACQCAAKAIEIAFrQQFPBEAgAkEANgIADAELIAIgACABEMUCIAIoAgBBAUcNACACQQhqKAIAIgAEQCACKAIEIABBtMjCACgCACIAQdoCIAAbEQAAAAsQ0QgACyACQRBqJAALbQEBfyMAQRBrIgIkAAJAIAAoAgQgAWtBAU8EQCACQQA2AgAMAQsgAiAAIAEQxAIgAigCAEEBRw0AIAJBCGooAgAiAARAIAIoAgQgAEG0yMIAKAIAIgBB2gIgABsRAAAACxDRCAALIAJBEGokAAtvAQF/IwBBEGsiAyQAAkAgACgCBCABayACTwRAIANBADYCAAwBCyADIAAgASACEPoCIAMoAgBBAUcNACADQQhqKAIAIgAEQCADKAIEIABBtMjCACgCACIAQdoCIAAbEQAAAAsQ0QgACyADQRBqJAALWgEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakH888EAIAJBCGoQtgEgAkEgaiQAC1cBAn8CQCAAKAIAIgEoAhAiAgRAIAJBADoAACABQRRqKAIABEAgASgCEBB6CyAAKAIAIQELIAFBf0YNACABIAEoAgQiAEF/ajYCBCAAQQFHDQAgARB6CwtaAQF/IwBBIGsiAiQAIAIgACgCADYCBCACQRhqIAFBEGopAgA3AwAgAkEQaiABQQhqKQIANwMAIAIgASkCADcDCCACQQRqQeSFwgAgAkEIahC2ASACQSBqJAALWgEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakHEpcIAIAJBCGoQtgEgAkEgaiQAC2ABAX8jAEEQayIDJAAgA0EIaiACIAEoAgAQsAYgAygCDCECAn8gAygCCEUEQCABQQRqQbaTwABBCRDMByACEMQIQQAMAQtBAQshASAAIAI2AgQgACABNgIAIANBEGokAAtgAQF/IwBBEGsiAyQAIANBCGogAiABKAIAEK0GIAMoAgwhAgJ/IAMoAghFBEAg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aiAAQQhqKQIANwMAIAEgACkCADcDCCABQQhqEI4EIAFBIGokAAtZAQF/IwBB4ABrIgEkACAAQQBB4AAQ7QchACABQciewQBBMBCiByIBQTBqQQBBMBDtBxogAEHgAGogAUHgABCiBxogAEHAAWpBAEHgABDtBxogAUHgAGokAAtmAQJ/IAEoAgAhAiABQQA2AgACQCACBEAgASgCBCEDQQhBBBC3CCIBRQ0BIAEgAzYCBCABIAI2AgAgAEHQ48EANgIEIAAgATYCAA8LAAtBCEEEQbTIwgAoAgAiAEHaAiAAGxEAAAALUwECfyMAQRBrIgIkACACQQhqIAEoAgAQLwJAIAIoAggiAQRAIAAgAigCDCIDNgIEIAAgATYCACAAQQhqIAM2AgAMAQsgAEEANgIACyACQRBqJAALSgECfyMAQTBrIgEkACABQQhqIgIgAEEkEKIHGiABIAI2AiwgAUEsakH8jMAAEP0IIAEtABRBA0cEQCABQQhqENUHCyABQTBqJAALSgECfyMAQTBrIgEkACABQQhqIgIgAEEkEKIHGiABIAI2AiwgAUEsakHMjcAAEP0IIAEtABRBA0cEQCABQQhqENUHCyABQTBqJAALSAECfyMAQRBrIgEkACABIABBeGo2AgggAEEUaiIALQAAIABBAToAACABIAFBCGo2AgxBAXFFBEAgAUEMahCXBgsgAUEQaiQAC3ABAX8jAEEgayIBJAAgAUIANwMAIAFBGGpCADcDACABQRBqQgA3AwAgAUEIakIANwMAIABCADcDACAAQQhqIAFBCGopAwA3AwAgAEEQaiABQRBqKQMANwMAIABBGGogAUEYaikDADcDACABQSBqJAALRgECfyMAQRBrIgIkAAJ/IAAoAgQiAwRAIAIgACgCACADIAEQzQNBACACQQhqKAIAIAIoAgBBAUYbDAELQQALIAJBEGokAAtaAQF/IwBBEGsiAiQAAkAgASgCAA0AIAIgASgCBCABQQhqKAIAEJkBIAIoAgANACAAIAIoAgQgAkEIaigCABChBiACQRBqJAAPC0HbgMEAQShB4IHBABCABwALUgAgACABEKIDIABBMGogAUEwahCiAyAAQeAAaiABQeAAahCiAyAAQZABaiABQZABahCiAyAAQcABaiABQcABahCiAyAAQfABaiABQfABahCiAwtSACAA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AQsgACgCAEEAOgAACwtLAgF/AX4jAEEQayIDJAAgA0EIaiACQQAQ9AUgAykDCCEEIABBADYCCCAAIAQ3AgAgACgCACABIAIQogcaIAAgAjYCCCADQRBqJAALdAEDfyMAQRBrIgMkACABKAIAIAIoAgAQHSEBQazIwgAoAgAhAkGwyMIAKAIAIQRBrMjCAEIANwIAIANBCGoiBSAENgIEIAUgAkEBRjYCACAAIAMoAggiAkEARzYCACAAIAMoAgwgASACGzYCBCADQRBqJAALdAEDfyMAQRBrIgMkACABKAIAIAIoAgAQLSEBQazIwgAoAgAhAkGwyMIAKAIAIQRBrMjCAEIANwIAIANBCGoiBSAENgIEIAUgAkEBRjYCACAAIAMoAggiAkEARzYCACAAIAMoAgwgASACGzYCBCADQRBqJAALRwEBfyMAQRBrIgMkACADIAEgAhCZASADKAIEIQEgAygCACECIAAgA0EIaigCADYCBCAAQQAgASACQQFGGzYCACADQRBqJAALRAIBfwF+IwBBEGsiAyQAIANBCGogAiABa0EMbhCvBSADKQMIIQQgAEEANgIIIAAgBDcCACAAIAEgAhCbBCADQRBqJAALRAIBfwF+IwBBEGsiAyQAIANBCGogAiABa0EFdhCuBSADKQMIIQQgAEEANgIIIAAgBDcCACAAIAEgAhCTBiADQRBqJAALRAIBfwF+IwBBEGsiAyQAIANBCGogAiABa0EFdhCvBSADKQMIIQQgAEEANgIIIAAgBDcCACAAIAEgAhDrBCADQRBqJAALRQIBfwF+IwBBEGsiAyQAIANBCGogAiABa0GQAW4QoAUgAykDCCEEIABBADYCCCAAIAQ3AgAgACABIAIQkgYgA0EQaiQAC0UCAX8BfiMAQRBrIgMkACADQQhqIAIgAWtBkAFuEKEFIAMpAwghBCAAQQA2AgggACAENwIAIAAgASACEKwFIANBEGokAAtEAgF/AX4jAEEQayIDJAAgA0EIaiACIAFrQQV2EK8FIAMpAwghBCAAQQA2AgggACAENwIAIAAgASACEJ0GIANBEGokAAtFAgF/AX4jAEEQayIDJAAgA0EIaiACIAFrQdAAbhCvBSADKQMIIQQgAEEANgIIIAAgBDcCACAAIAEgAhDnAyADQRBqJAALWAEBfwJAAkAgARCFByICRQRAQQAhAQwBC0EEQQQQtwgiAUUNASABIAI2AgALIABB/OPBADYCBCAAIAE2AgAPC0EEQQRBtMjCACgCACIAQdoCIAAbEQAAAAs/AQN/EDMiAxAkIgQQJiECIARBJE8EQCAEEAALIAIgACgCACABECcgAkEkTwRAIAIQAAsgA0EkTwRAIAMQAAsLSQACQAJAAkAgAC0AEA4EAAICAQILIAAtAAQNASAAKAIAIgBBJEkNASAAEAAPCyAAQQxqLQAADQAgACgCCCIAQSRJDQAgABAACwtAAQJ/IAAoAgQiAUUEQEEADwsgACgCCCIABEAgASAAbiICIAEgACACbGtBAEdqDwtB0K3AAEEZQbStwAAQgAcACzUBAX8CQCAALQAAIgFBB00EQCABQQVHDQEgAEEEahCiCAwBCyAAQQRqEKIICyAAQRBqEIoFC2MBAX8jAEEQayICJAAgAiABrUKAgICAEEIAIAEoAhhBuMXAAEEIIAFBHGooAgAoAgwRAQAbhDcDACACIAA2AgwgAkHAxcAAQQUgAkEMakHIxcAAEIoCGiACENMFIAJBEGokAAtBACAAQQA2AhAgACADNgIIIAAgAjYCBCAAIAE2AgAgAEEMaiAENgIAIAAgBCADayIAIAIgAWsiASABIABLGzYCFAtjAQF/IwBBEGsiAiQAIAIgAa1CgICAgBBCACABKAIYQYTjwABBCiABQRxqKAIAKAIMEQEAG4Q3AwAgAiAANgIMIAJBjuPAAEEFIAJBDGpBlOPAABCKAhogAhDTBSACQRBqJAALRAAgAEGAAjYCICAAIAEpAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwALSwEBfwJAIAFBgICAgHhzIgFBC0sEQEEAIQEMAQsgAUECdCICQdTpwQBqKAIAIQEgAkGk6cEAaigCACECCyAAIAI2AgQgACABNgIAC28BBH8jAEEQayICJAAgASgCABAfIQFBrMjCACgCACEDQbDIwgAoAgAhBEGsyMIAQgA3AgAgAkEIaiIFIAQ2AgQgBSADQQFGNgIAIAAgAigCCCIDQQBHNgIAIAAgAigCDCABIAMbNgIEIAJBEGokAAtIAQF/IwBBIGsiAyQAIANBFGpBADYCACADQYSIwgA2AhAgA0IBNwIEIAMgATYCHCADIAA2AhggAyADQRhqNgIAIAMgAhDsBwALPQEBfyMAQRBrIgEkACABIAAQsAcCQCABKAIAIgBFDQAgASgCBEUNACABQQhqKAIAGiAAEHoLIAFBEGokAAs7AQF/IwBBEGsiACQAQZzFwgAoAgBBA0cEQCAAQQE6AAsgACAAQQtqNgIMIABBDGoQtAELIABBEGokAAs+AgF/AXwgAS0AAEEBdEECcSECIAArAwAhAyABKAIQQQFHBEAgASADIAIQdQ8LIAEgAyACIAFBFGooAgAQbQtBAQF/IAAgARC5BiAAQaACaiICIAEQuQYgAiABQQxwQeAAbEH4oMEAaiIBEGsgAEGAA2ogARBrIABB4ANqIAEQawsqAQF/IwBBEGsiASQAIAFBIDYCDCABIAA2AgggAUEIahCIAiABQRBqJAALLwEBfyAAQbADahDlByAAQcADaiIBEJQHIAEQ3QcgAEHMA2oQ/wcgAEHYA2oQoggLNgECfyMAQYABayICJAAgAkEIaiIDIAEQhQIgAiADQfAAENsGIAAgAikDADcDACACQYABaiQACzYBAn8jAEGAAWsiAiQAIAJBCGoiAyABEIYCIAIgA0HwABDbBiAAIAIpAwA3AwAgAkGAAWokAAtQACAAQgA3AwAgAEEANgIIIABBxKzAACkCADcCTCAAQdQAakHMrMAAKQIANwIAIABB3ABqQdSswAApAgA3AgAgAEHkAGpB3KzAACkCADcCAAs9AQF/IwBBEGsiAyQAIAMgAjYCDCADIAE2AgggAyADQQhqKQIANwMAIAAgAygCACADKAIEEHwgA0EQaiQACz4BAX8jAEEQayICJAAgAiABQdzxwABBBRDTByACIAA2AgwgAiACQQxqQeTxwAAQ0QIaIAIQjgUgAkEQaiQAC0UBAn8jAEEQayIBJABB5PzAACgCABEHACIARQRAQYr2wABBxgAgAUEIakGw98AAQaD3wAAQvQUACyAALQAAIAFBEGokAAs8ACAAIAEpAwA3AwAgAEEYaiABQRhqKQMANwMAIABBEGogAUEQaikDADcDACAAQQhqIAFBCGopAwA3AwALPgEBfyMAQRBrIgIkACACIAFBtOPBAEEKENMHIAIgADYCDCACIAJBDGpBwOPBABDRAhogAhCOBSACQRBqJAALPAAgACABKQAANwAAIABBGGogAUEYaikA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NgIAIAAgAigCCCACKAIMELAEIAEQogggAkEQaiQAC0EBAn8jAEEQayICJAAgAkEIaiIDIAEoAgg2AgQgAyABKAIANgIAIAAgAigCCCACKAIMEOoDIAEQogggAkEQaiQACzUBAX8jAEEQayICJAAgAkEIaiABQRBqEOgGIAAgAigCCDYCACAAIAIoAgw2AgQgAkEQaiQACzUBAX8jAEEQayICJAAgAkEIaiABQQhqEOgGIAAgAigCCDYCACAAIAIoAgw2AgQgAkEQaiQACzoBAX8jAEEQayICJAAgAkEIaiABQbTCwAAoAgARAAAgACACKAIINgIAIAAgAigCDDYCBCACQRBqJAALNAEBfyABKAIEIgIEQCAAQQhqQQQ2AgAgACACQRxsNgIEIAAgASgCADYCAA8LIABBADYCAAsvACADIAEgBCACQQJ0IgEgASAESxsiARCiBxogACABNgIEIAAgAUEDakECdjYCAAsvAQF/AkAgACgCACIAEAdBAUcNACAAEBMiABASQQFGIQEgAEEkSQ0AIAAQAAsgAQstAAJAIABBfE0EQCAARQRAQQQhAAwCCyAAIABBfUlBAnQQtwgiAA0BCwALIAALMAAgACgCCEEBRgR/IAAoAgAiAEHa88AARgRAQQEPCyAAQdrzwABBARDWBkUFQQALCysBAX8jAEEgayIBJAAgAUEAOgAYIAEgAK03AwggAUEIahDLBSABQSBqJAALKwEBfyMAQSBrIgEkACABQQA6ABggASAArTcDCCABQQhqEMUFIAFBIGokAAsrAQF/IwBBIGsiASQAIAFBADoAGCABIACtNwMIIAFBCGoQzAUgAUEgaiQACysBAX8jAEEgayIBJAAgAUEAOgAYIAEgAK03AwggAUEIahDNBSABQSBqJAALKwEBfyMAQSBrIgEkACABQQA6ABggASAArTcDCCABQQhqEMQFIAFBIGokAAsrAQF/IwBBIGsiASQAIAFBADoAGCABIACtNwMIIAFBCGoQyAUgAUEgaiQACysBAX8jAEEgayIBJAAgAUEAOgAYIAEgAK03AwggAUEIahDPBSABQSBqJAALKwEBfyMAQSBrIgEkACABQQA6ABggASAArTcDCCABQQhqEMcFIAFBIGokAAsrAQF/IwBBIGsiASQAIAFBADoAGCABIACtNwMIIAFBCGoQxgUgAUEgaiQACysBAX8jAEEgayIBJAAgAUEAOgAYIAEgAK03AwggAUEIahDOBSABQSBqJAALKwEBfyMAQSBrIgEkACABQQA6ABggASAArTcDCCABQQhqEMkFIAFBIGokAAsrAQF/IwBBIGsiASQAIAFBADoAGCABIACtNwMIIAFBCGoQygUgAUEgaiQACysBAX8jAEEgayIBJAAgAUEAOgAYIAEgAK03AwggAUEIahDQBSABQSBqJAALLwEBfyMAQRBrIgIkACAABEAgAiABNgIMIAIgADYCCCACQQhqEJgHCyACQRBqJAALRgECfyMAQRBrIgIkACACQQhqIgMgASgCACIBKAIINgIEIAMgASgCADYCACAAIAIoAgg2AgAgACACKAIMNgIEIAJBEGokAAszACAAIAAoAgggAiABayICEIQGIAAoAgAgACgCCGogASACEKIHGiAAIAAoAgggAmo2AggLMQIBfwF+IwBBEGsiAyQAIANBCGogASACEOUEIAAgAygCCCADKAIMEJUGIANBEGokAAszACAAIAAoAgggAiABayICEIcGIAAoAgAgACgCCGogASACEKIHGiAAIAAoAgggAmo2AggLQQECfyMAQRBrIgIkACACQQhqIgMgACgCACIAKAIINgIEIAMgACgCADYCACACKAIIIAIoAgwgARCHASACQRBqJAALQQECfyMAQRBrIgIkACACQQhqIgMgACgCACIAKAIINgIEIAMgACgCADYCACACKAIIIAIoAgwgARDyCCACQRBqJAALKgECfxAzIgIQJCIDIAAgARAlIAJBJE8EQCACEAALIANBJE8EQCADEAALCzIBAn8gAUF4aiICKAIAQQFqIgNBAU0EQAALIAIgAzYCACAAQfyowAA2AgQgACABNgIACzwBAn8jAEEQayICJAAgAkEIaiIDIAAoAgg2AgQgAyAAKAIANgIAIAIoAgggAigCDCABEPIIIAJBEGokAAsqAQF/IwBBEGsiAiQAIAIgATYCDCACIAA2AgggAkEIahDDAyACQRBqJAALMwAgABCjBCAAQTBqEKMEIABB4ABqEKMEIABBkAFqEKMEIABBwAFqEKMEIABB8AFqEKMECz4AIAAoAgAhACABLQAAQRBxQQR2RQRAIAEtAABBIHFBBXZFBEAgACABENMIDwsgACABEPcEDwsgACABEPYECzEB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pOvAAEEQENMHIAAQjgUgAEEQaiQACyUAIwBBEGsiACQAIAAgAUG068AAQQ0Q0wcgABCOBSAAQRBqJAALKwAgAEHInsEAQTAQogciAEEwakEAQfABEO0HGiAAQaACakEAQaACEO0HGgspACAAQQBBMBDtByIAQTBqQZDMwQBBMBCiBxogAEHgAGpBAEEwEO0HGgslACMAQRBrIgAkACAAIAFBpfLBAEEQENMHIAAQjgUgAEEQaiQACyUAIwBBEGsiACQAIAAgAUG18sEAQREQ0wcgABCOBSAAQRBqJAALKAEBfyMAQRBrIgMkACADIAI2AgggAyABNgIEIAMgADYCACADEOoHAAszAQF/QRAhAQJAAkACQCAALQAAQQFrDgIAAQILIAAtAAEPCyAAQQRqKAIALQAIIQELIAELLAEBfyMAQRBrIgEkACABIAApAgA3AwggAUEIakHA/sEAQQAgACgCCBDCAwALJQAgAARAIAAgAiADIAQgBSABKAIMERAADwtB2O/BAEEwEO4IAAseAQF/IAAoAgQiAUUgAUECdEVyRQRAIAAoAgAQegsLIAACQCABQXxLDQAgACABQQQgAhCvCCIARQ0AIAAPCwALIAEBfwJAIAAoAgAiAUUNACAAQQRqKAIARQ0AIAEQegsLIAEBfwJAIAAoAgQiAUUNACAAQQhqKAIARQ0AIAEQegsLHwAgAEGwA2oQ5QcgACkDwANQRQRAIABByANqEI8ICwsdACAAKAIARQRAIABBuANqEOUHDwsgAEEEahDmAwsaACAAKAIABEAgAEEEahCiCAsgAEEQahCKBQsbACAAKAIAIgAQCEEBRwR/IAAQCUEBRgVBAQsLJwEBfyMAQaACayICJAAgACACIAFBoAIQogciABDWASAAQaACaiQACycBAX8jAEGQAWsiAiQAIAAgAiABQZABEKIHIgAQkAIgAEGQAWokAAsdACABIANGBEAgACACIAEQogcaDwsgASADEO8FAAsjACAABEAgACACIAMgBCABKAIMEQYADwtB2O/BAEEwEO4IAAsjACAABEAgACACIAMgBCABKAIMEQ4ADwtB2O/BAEEwEO4IAAsjACAABEAgACACIAMgBCABKAIMERoADwtB2O/BAEEwEO4IAAsjACAABEAgACACIAMgBCABKAIMERkADwtB2O/BAEEwEO4IAAsfAQF/IABBBGohASAAKAIARQRAIAEQ4gcPCyABEOYDCx0BAX8DQCAAIAFqQgA3AwAgAUEIaiIBQSBHDQALCyEAIAAEQCAAIAIgAyABKAIMEQMADwtB2O/BAEEwEO4IAAsgAQJ+IAApAwAiAkI/hyIDIAIgA3yFIAJCf1UgARCgAgsXACAALQAQQQJHBEAgABDTBiAAEIEHCwsfACAABEAgACACIAEoAgwRAAAPC0H0o8AAQTAQ7ggACx8AIAAEQCAAIAIgASgCDBEAAA8LQZSswABBMBDuCAALHwAgAARAIAAgAiABKAIMEQIADwtB2O/BAEEwEO4IAAscACAAQShqEKoIIAApAwBQRQRAIABBCGoQjwgLCxoAIAAgASABQQxqIgAQwgQgARDlByAAEOIHCxUAIAAoAgBBAkYEQCAAQQxqEKIICwspAEGAyMIAKAIAQQFHBEBBiMjCAEECNgIAQYDIwgBCATcCAAtBhMjCAAskACAALQAARQRAIAFB3KbCAEEFEIMBDwsgAUHYpsIAQQQQgwELFAAgACgCsAMEQCAAQbADahDlBwsLGgAgAEEIahADNgIAIAAgATYCBCAAQQA2AgALFwAgACABRgRAQQEPCyAAIAFBMBDWBkULHQAgASgCAEUEQAALIABB0OPBADYCBCAAIAE2AgALEgBB5ITCAEEcQdCFwgAQgAcACxYAQejEwgAoAgAEf0HoxMIABRCrBAsLGgAgACgCABC9BCIARQRAQQAPCyAAIAEQqQILEQAgACgCBARAIAAoAgAQegsLHwEBfxCaByIARQRAQZCUwQBBK0GclcEAEIAHAAsgAAsdACABKAIARQRAAAsgAEGw/sEANgIEIAAgATYCAAsfAEHYxMIALQAAQQJGBEBB2MTCAEEAOgAAC0HYxMIACxwAIAEoAhhBqKHCAEELIAFBHGooAgAoAgwRAQALHAAgASgCGEGzocIAQQ4gAUEcaigCACgCDBEBAAscACABKAIYQY++wgBBBSABQRxqKAIAKAIMEQEACxQAIAAoAgAEQCAAEJQHIAAQ3QcLCw8AIAAoAgAEQCAAEKIICwsPACAAKAIABEAgABD/BwsLEwAgACgCACIAQSRPBEAgABAACwsZACAAKAIAIgAoAgAgASAAKAIEKAIwEQIACxkAIAAoAgAiACgCACABIAAoAgQoAiQRAgALDQAgACABIAIgAxCTAQsWACAAIAEoAgg2AgQgACABKAIANgIACxMAIAAoAgAgASABIAJqEMQHQQALEwAgACgCACABIAEgAmoQxgdBAAsTACAAKAIAIAEgASACahDZAkEACxQAIAAoAgAgASAAKAIEKAIsEQIACxQAIAAoAgAgASAAKAIEKAIgEQIACxQAIAAoAgAgASAAKAIEKAIMEQIACwkAIAAgARCEAgsOACAAIAEgASACahDEBwsRACAAKAIAIAAoAgQgARDyCAsRACAAKAIAIAAoAgQgARCHAQsTACAAQRs2AgQgAEHo4sEANgIACxMAIABBKDYCBCAAQaTkwQA2AgALFgBBsMjCACAANgIAQazIwgBBATYCAAsRACAAKAIAIAAoAgggARDyCAsRACAAKAIAIAAoAgggARCHAQsTACAAQbD+wQA2AgQgACABNgIACxEAIAEgACgCACAAKAIEEIMBCwkAIAAgARDjBQsMACAAIAEQxwZBAEcLDQAgACgCACABIAIQBQsOACAAIAAoAgggARCEBgsOACAAKAIAIAEgAhCPAwsNACAAQQBB4AAQ7QcaCwwAIAAgACgCCBD6BQsOACAAIAAoAgggARCABgsMACAAIAFBKBCiBxoLDAAgAEEAQTAQ7QcaCw0AIAAgAUHoABCiBxoLDAAgACgCABAYQQBHCw4AIAAgACgCCCABEIoGCw0AIAAgAUHAABCiBxoLDgAgACgCACABEOABQQALEgBB4IfCAEERQfSHwgAQgAcACw4AIAAoAgAaA0AMAAsACw4AIAA1AgBBASABEKACCw4AIAAoAgAgASACELoBCw4AIAApAwBBASABEKACCxwAIAEoAhhBmKPAAEETIAFBHGooAgAoAgwRAQALHAAgASgCGEHqo8AAQQogAUEcaigCACgCDBEBAAsLACAAIAEgAhCBAwscACABKAIYQfCywABBEyABQRxqKAIAKAIMEQEACwcAIAAQoggLCgAgAEEIahCKBQsMACAAKAIAIAEQzwMLHAAgASgCGEGo28AAQRMgAUEcaigCACgCDBEBAAscACABKAIYQYDfwABBEyABQRxqKAIAKAIMEQEACxwAIAEoAhhBpOPAAEETIAFBHGooAgAoAgwRAQALCgAgAEEQahDkBgsMACAAKAIAIAEQ0wgLCgAgAEEIahDkBgsMACAAKAIAIAEQ7QULDAAgACgCACABEMQDCw4AQdj1wABBGSABEIcBCw4AQfH1wABBGSABEIcBCwwAIAAoAgAgARCaCAsMACAAKAIAIAEQuggLCwAgAEGgAmoQzQcLDAAgACgCACABEI4HCwwAIAAoAgAgARCbAgsMACAAKAIAIAEQqgYLDAAgACgCACABEOYECwkAIAAgARAyAAsLACAAIAEgAhDgAgsMACAAKAIAIAEQ0wILDgBByPzBAEEZIAEQhwELCwAgAiAAIAEQgwELDgAgAUGEp8IAQQIQgwELHAAgASgCGEGIkcEAQQIgAUEcaigCACgCDBEBAAscACABKAIYQYqRwQBBBSABQRxqKAIAKAIMEQEACwkAIAAgARC7AwsJACAAQQA2AgALCQAgACABEI0HCwkAIAAgARDwBAsHACAAELsFCwgAIAAgARBuCwkAIAAoAgAQGwsIACAAIAEQIQsJACAAKAIAECYLCQAgACgCABAsCwkAIAAgARCRAgsHACAAEL0GCwcAIAAQ1wcLDABC6sfR+I7bnpoxCwwAQsK0g9reys7SfgsEAEEACw0AQrTB1fO86LK9gX8LDABCm8T8/drGsLVXCw0AQtS8p4Hp2K21/gALDABCpcipxeLLzdBDCw0AQvT5nubuo6r5/gALDQBCm9HXsMHprKWafwsNAEL32e3Bq8Gn2a9/Cw0AQsqDiYuhnsnFgn8LAwABCwMAAQsL4b0CJQBBgIDAAAuVFwEAAAAAAAAAAQAAAAIAAAADAAAAAAAAAAEAAAAEAAAABQAAAAAAAAABAAAABgAAAAcAAAAAAAAAAQAAAAgAAAAJAAAAAAAAAAEAAAAKAAAACwAAAAAAAAABAAAADAAAAA0AAAAAAAAAAQAAAA4AAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3NlcmRlLXdhc20tYmluZGdlbi0wLjEuMy9zcmMvZGUucnMAAJsAEABfAAAAWQAAADkAAABrZXlQYWlybWVzc2FnZXNwdWJsaWNLZXlzaWduYXR1cmVibGluZGVkbm9uY2Vjb21taXRtZW50cHJvb2ZPZkhpZGRlbk1lc3NhZ2VzY2hhbGxlbmdlSGFzaGJsaW5kaW5nRmFjdG9yc2VjcmV0S2V5a25vd25yZXZlYWxlZHByb29mbWVzc2FnZUNvdW50QmJzU2lnblJlcXVlc3RrZXlQYWlybWVzc2FnZXMAqAEQAAcAAACvARAACAAAAMgBEAAAAAAAQmJzVmVyaWZ5UmVxdWVzdHB1YmxpY0tleXNpZ25hdHVyZQAA4AEQAAkAAADpARAACQAAAK8BEAAIAAAAQmxpbmRTaWduYXR1cmVDb250ZXh0UmVxdWVzdGJsaW5kZWRub25jZeABEAAJAAAArwEQAAgAAAAoAhAABwAAAC8CEAAFAAAAQmxpbmRTaWduYXR1cmVDb250ZXh0UmVzcG9uc2Vjb21taXRtZW50cHJvb2ZPZkhpZGRlbk1lc3NhZ2VzY2hhbGxlbmdlSGFzaGJsaW5kaW5nRmFjdG9yQmxpbmRTaWduYXR1cmVWZXJpZnlDb250ZXh0UmVxdWVzdAAAAHECEAAKAAAAewIQABUAAACQAhAADQAAAOABEAAJAAAAKAIQAAcAAAAvAhAABQAAAEJsaW5kU2lnbkNvbnRleHRSZXF1ZXN0c2VjcmV0S2V5a25vd24AAABxAhAACgAAAOABEAAJAAAAFwMQAAkAAACvARAACAAAACADEAAFAAAAVW5ibGluZFNpZ25hdHVyZVJlcXVlc3QA6QEQAAkAAACdAhAADgAAAENyZWF0ZVByb29mUmVxdWVzdHJldmVhbGVkAADpARAACQAAAOABEAAJAAAArwEQAAgAAACKAxAACAAAAC8CEAAFAAAAVmVyaWZ5UHJvb2ZDb250ZXh0cHJvb2YAzgMQAAUAAADgARAACQAAAK8BEAAIAAAALwIQAAUAAABgdW53cmFwX3Rocm93YCBmYWlsZWRgdW53cmFwX3Rocm93YCBmYWlsZWQvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvaG1hYy0wLjcuMS9zcmMvbGliLnJzHgQQAFIAAACRAAAAEQAAAG1pc3NpbmcgZmllbGQgYGCABBAADwAAAI8EEAABAAAAZHVwbGljYXRlIGZpZWxkIGAAAACgBBAAEQAAAI8EEAABAAAAEQAAADQAAAAEAAAAEgAAABMA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bGljZXMucnMAAKQSEABmAAAAIAAAAA4AAABjYW5ub3QgYWNjZXNzIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgdmFsdWUgZHVyaW5nIG9yIGFmdGVyIGRlc3RydWN0aW9uL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9zdGQvc3JjL3RocmVhZC9sb2NhbC5ycwAAAGITEABPAAAA+AAAABoAAABoAAAAAAAAAAEAAABpAAAAYWxyZWFkeSBib3Jyb3dlZGoAAAAAAAAAAQAAAGsAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvd2FzbS1iaW5kZ2VuLWZ1dHVyZXMtMC40LjE4L3NyYy90YXNrL3NpbmdsZXRocmVhZC5ycwAAAPQTEABxAAAAIQAAABUAAABsAAAAbQAAAG4AAABvAAAAcAAAAPQTEABxAAAAVQAAACUAAABjYXBhY2l0eSBvdmVyZmxvdy9ydXN0Yy9jYjc1YWQ1ZGIwMjc4M2U4YjAyMjJmZWUzNjNjNWY2M2Y3ZTJjZjViL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL3ZlY19kZXF1ZS9tb2QucnMArRQQAF4AAADeAQAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHNlbGYuY2FwKCkgPT0gb2xkX2NhcCAqIDIArRQQAF4AAAAzCAAADQAAAGFscmVhZHkgYm9ycm93ZWRyAAAAAAAAAAEAAABrAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3dhc20tYmluZGdlbi1mdXR1cmVzLTAuNC4xOC9zcmMvcXVldWUucnMAAAB4FRAAZQAAABwAAAApAAAAeBUQAGUAAAAxAAAAGgAAAHMAAAAEAAAABAAAAHQAAAB1AAAAY2xvc3VyZSBpbnZva2VkIHJlY3Vyc2l2ZWx5IG9yIGRlc3Ryb3llZCBhbHJlYWR5Z+YJaoWuZ7ty8248OvVPpX9SDlGMaAWbq9mDHxnN4FsvcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL2l0ZXIucnMAAGQWEABOAAAAAQYAABUAQdCtwAALoRBhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2Jsb2NrLWJ1ZmZlci0wLjcuMy9zcmMvbGliLnJzAOkWEABaAAAAhQAAAAkAAADpFhAAWgAAAIgAAAATAAAA6RYQAFoAAACMAAAAFwAAAOkWEABaAAAAKAAAAA0AAADpFhAAWgAAADYAAAAJAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2J5dGVvcmRlci0xLjQuMi9zcmMvbGliLnJzYXNzZXJ0aW9uIGZhaWxlZDogNCA8PSBidWYubGVuKCkAlBcQAFcAAADeBwAACQAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAeQAAAAAAAAABAAAAegAAAHsAAAAIAAAABAAAAGIAAAABAAAA//////5b/v8CpL1TBdihCQjYOTNIfZ0pU6ftc0JMUzEyMzgxRzFfWE1EOkJMQUtFMkJfU1NXVV9ST19CQlMrX1NJR05BVFVSRVM6MV8wXzAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmJzLTAuNC4xL3NyYy9saWIucnMAAAC8GBAAUQAAAEIBAABEAAAAvBgQAFEAAADFAQAAHAAAALwYEABRAAAA0QEAADgAAAC8GBAAUQAAANMBAAA9AAAAvBgQAFEAAADXAQAADgAAALwYEABRAAAAmQAAAAUAAABleHBlY3RlZCBieXRlIGFycmF5AHwAAAAAAAAAAQAAAH0AAAC8GBAAUQAAAP4AAAAFAAAAvBgQAFEAAAAQAQAABQAAAH4AAAAAAAAAAQAAAH8AAAC8GBAAUQAAACIBAAAFAAAAgAAAAAAAAAABAAAAgQAAAGFzc2VydGlvbiBmYWlsZWQ6IGlkeCA8IENBUEFDSVRZL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbm9kZS5ycwAEGhAAWwAAAHQCAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogZWRnZS5oZWlnaHQgPT0gc2VsZi5oZWlnaHQgLSAxBBoQAFsAAACcAgAACQAAAAQaEABbAAAAoAIAAAkAAABhc3NlcnRpb24gZmFpbGVkOiBlZGdlLmhlaWdodCA9PSBzZWxmLm5vZGUuaGVpZ2h0IC0gMQAAAAQaEABbAAAAFAQAAAkAAACCAAAAGAAAAAQAAACDAAAAhAAAAIUAAACGAAAAhwAAAIgAAACJAAAAigAAAAwAAAAEAAAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAGRlc3RpbmF0aW9uIGFuZCBzb3VyY2Ugc2xpY2VzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMvcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L2NvcmUvc3JjL3NsaWNlL21vZC5ycwAAAIwbEABNAAAAgwoAAAkAAACMGxAATQAAAIoKAAANAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZS9ydXN0Yy9jYjc1YWQ1ZGIwMjc4M2U4YjAyMjJmZWUzNjNjNWY2M2Y3ZTJjZjViL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL21hcC9lbnRyeS5ycwAnHBAAYAAAACIBAAAuAAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9hbGxvYy9zcmMvY29sbGVjdGlvbnMvYnRyZWUvbWFwLnJzAACYHBAAWgAAAI4FAAAvAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZQCYHBAAWgAAAJ8AAAA7AAAAmBwQAFoAAADYAAAALgAAAGZhaWxlZCB0byBmaWxsIHdob2xlIGJ1ZmZlci9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9wYWlyaW5nLXBsdXMtMC4xOS4wL3NyYy9zZXJkZXMucnMAAABrHRAAXgAAAA4BAAAOAAAASW52YWxpZCBjb21wcmVzc25lc3PwHRAAAAAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAC8eEABLAAAAnAgAAA4AAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAJUAAAAAAAAAAQAAAJYAAABpbnZhbGlkIHZhbHVlOiAsIGV4cGVjdGVkIAAAyB4QAA8AAADXHhAACwBB+b3AAAvEA4AAAACAAGkvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcGFpcmluZy1wbHVzLTAuMTkuMC9zcmMvYmxzMTJfMzgxL21vZC5ycwAAAAAfEABlAAAAZQAAACsAAAAAHxAAZQAAAGoAAAAvAAAAAB8QAGUAAAByAAAAJwAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYnMtMC40LjEvc3JjL2tleXMucnMAAJgfEABSAAAACwEAABEAAAD8HxAAAAAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAADsgEABLAAAAnAgAAA4AAACbAAAAAAAAAAEAAACWAAAAnAAAACgAAAAEAAAAnQAAAJ4AAACfAEHQwcAAC2mgAAAAoQAAAKIAAABFcnJvcjogCtwgEAAHAAAA4yAQAAEAAABDYXVzZWQgYnk6IAD0IBAACwAAAOMgEAABAAAAUG9LVkNFcnJvcjogECEQAAwAAACjAAAAKAAAAAQAAACkAAAApQAAAKYAQczCwAALiQqnAAAAqAAAAKkAAABUaGUgcHJvb2YgZmFpbGVkIGR1ZSB0byBYIRAAGAAAAEludmFsaWQgbnVtYmVyIG9mIGJ5dGVzLiBFeHBlY3RlZCAsIGZvdW5kIAAAeCEQACIAAACaIRAACAAAAEVycm9yIGZyb20gUG9LVkMgbW9kdWxlILQhEAAYAAAATWFsZm9ybWVkIHB1YmxpYyBrZXnUIRAAFAAAAFNpZ25hdHVyZSBjYW5ub3QgYmUgbG9hZGVkIGR1ZSB0byBhIGJhZCB2YWx1ZQAAAPAhEAAtAAAAU2lnbmF0dXJlIGluY29ycmVjdCBzaXplLiBFeHBlY3RlZCAxOTMsIGZvdW5kIAAAKCIQAC4AAABQdWJsaWMga2V5IHRvIG1lc3NhZ2UgbWlzbWF0Y2guIEV4cGVjdGVkIAAAAGAiEAApAAAAmiEQAAgAAABLZXkgR2VuZXJhdGlvbiBFcnJvcpwiEAAUAAAAQkJTRXJyb3Jpbm5lcgAAAKoAAAAEAAAABAAAAKsAAAABAAAA//////5b/v8CpL1TBdihCQjYOTNIfZ0pU6ftc2ZhaWxlZCB0byBmaWxsIHdob2xlIGJ1ZmZlcmZhaWxlZCB0byB3cml0ZSB3aG9sZSBidWZmZXIArAAAAAAAAAABAAAAXQAAAK0AAAAAAAAAAQAAAF8AAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlAK4AAAAoAAAABAAAAKkAAACvAAAAAAAAAAEAAACwAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2hrZGYtMC44LjAvc3JjL2hrZGYucnNITUFDIGNhbiB0YWtlIGEga2V5IG9mIGFueSBzaXplAACcIxAAUwAAAFoAAAAxAAAAUFJLIHNpemUgaXMgY29ycmVjdACcIxAAUwAAAGEAAAApAAAAnCMQAFMAAABSAAAAKQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9obWFjLTAuNy4xL3NyYy9saWIucnMAAFQkEABSAAAAkQAAABEAAABUJBAAUgAAAJwAAAAoAAAAVCQQAFIAAAB9AAAAKgAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9ieXRlb3JkZXItMS40LjIvc3JjL2xpYi5ycwDYJBAAVwAAALEHAAAwAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3BhaXJpbmctcGx1cy0wLjE5LjAvc3JjL2JsczEyXzM4MS9mci5yc0AlEABkAAAABgAAAAoAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcmFuZF9jb3JlLTAuNS4xL3NyYy9ibG9jay5ycwAAALQlEABZAAAA1AAAAB8AAAC0JRAAWQAAANYAAAAfAAAAtCUQAFkAAADAAAAAJwAAALEAAAAgAAAABAAAALIAAACzAAAAtABB6MzAAAu5LLUAAAC2AAAAtwAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGV4IDwgc2VsZi5yZXN1bHRzLmFzX3JlZigpLmxlbigpAAAAtCUQAFkAAACmAAAACQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYnMtMC40LjEvc3JjL3Byb3Zlci5yc7wmEABUAAAAOQAAABoAAAC8JhAAVAAAADoAAAAgAAAAvCYQAFQAAABJAAAADgAAAAEAAAD//////lv+/wKkvVMF2KEJCNg5M0h9nSlTp+1zY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZWNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAALkAAAAMAAAABAAAAJEAAAC6AAAACAAAAAQAAABiAAAAYSByZXZlYWxlZCBtZXNzYWdlIHdhcyBzdXBwbGllZCB0aGF0IHdhcyBub3Qgc2lnbmVkIG9yIGEgbWVzc2FnZSB3YXMgcmV2ZWFsZWQgdGhhdCB3YXMgaW5pdGlhbGx5IGhpZGRl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cmVudCBkZXB0aHMAAAC4MhAAHQAAAC9ydXN0Yy9jYjc1YWQ1ZGIwMjc4M2U4YjAyMjJmZWUzNjNjNWY2M2Y3ZTJjZjViL2xpYnJhcnkvYWxsb2Mvc3JjL2NvbGxlY3Rpb25zL2J0cmVlL25hdmlnYXRlLnJzAOAyEABfAAAAeQAAABIAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmxha2UyLTAuOC4xL3NyYy9ibGFrZTJiLnJzUDMQAFgAAAAEAAAAAQAAAAoKAAC4MxAAAAAAALgzEAACAAAAuDMQAAAAAADVAAAAAAAAAAEAAADJAAAA1gAAAAAAAAABAAAAgQAAANcAAAAAAAAAAQAAAH0AAADYAAAAAAAAAAEAAADHAAAA2QAAAAAAAAABAAAAwgAAANoAAAAAAAAAAQAAAH8AAADbAAAAAAAAAAEAAADAAAAA3AAAAAAAAAABAAAA0QAAAN0AAAAAAAAAAQAAAMsAAABmYWlsZWQgdG8gZmlsbCB3aG9sZSBidWZmZXJmYWlsZWQgdG8gd3JpdGUgd2hvbGUgYnVmZmVyL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3BhaXJpbmctcGx1cy0wLjE5LjAvc3JjL2hhc2hfdG9fY3VydmUucnObNBAAZQAAACAAAAArAAAAmzQQAGUAAAAhAAAALQAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9wYWlyaW5nLXBsdXMtMC4xOS4wL3NyYy9zZXJkZXMucnMAACA1EABeAAAA0AAAAA4AAABJbnZhbGlkIGNvbXByZXNzbmVzc0ludmFsaWRQcmtMZW5ndGhJbnZhbGlkTGVuZ3RoAAAAIGNhbid0IGJlIHJlcHJlc2VudGVkIGFzIGEgSmF2YVNjcmlwdCBudW1iZXLENRAAAAAAAMQ1EAAsAAAA3wAAAAQAAAAEAAAA4AAAAOEAAADiAAAAY2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbi9ydXN0Yy9jYjc1YWQ1ZGIwMjc4M2U4YjAyMjJmZWUzNjNjNWY2M2Y3ZTJjZjViL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAAABeNhAATwAAAPgAAAAaAAAAYWxyZWFkeSBib3Jyb3dlZOMAAAAAAAAAAQAAAGkAAADkAAAAAAAAAAEAAABrAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3NlcmRlLXdhc20tYmluZGdlbi0wLjEuMy9zcmMvbGliLnJz8DYQAGAAAAAXAAAADgAAAGA3EAAAAAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9jb3JlL3NyYy9hbGxvYy9sYXlvdXQucnNoNxAAUAAAAAsBAAA5AAAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQDlAAAAAAAAAAEAAAC8AAAABDgQAAAAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAABDOBAASwAAAJwIAAAOAAAA5wAAAAAAAAABAAAAlgAAAGludmFsaWQgdHlwZTogLCBleHBlY3RlZCAAAACwOBAADgAAAL44EAALAAAARXJyb3IAAADoAAAABAAAAAQAAADpAAAA6gAAAAoKAAD4OBAAAAAAAPg4EAACAAAADDkQAAAAAABjYWxsZWQgYFJlc3VsdDo6dW53cmFwKClgIG9uIGFuIGBFcnJgIHZhbHVlAO4AAAAIAAAABAAAAO8AAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvZmFpbHVyZS0wLjEuOC9zcmMvYmFja3RyYWNlL2ludGVybmFsLnJzUDkQAGQAAAA8AAAALwAAAFJVU1RfRkFJTFVSRV9CQUNLVFJBQ0UwUlVTVF9CQUNLVFJBQ0UAYXNzZXJ0aW9uIGZhaWxlZDogYChsZWZ0ID09IHJpZ2h0KWAKICBsZWZ0OiBgYCwKIHJpZ2h0OiBgYDogAADqORAALQAAABc6EAAMAAAAIzoQAAMAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleEA6EAAgAAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9zdGQvc3JjL3N5cy93YXNtLy4uL3Vuc3VwcG9ydGVkL211dGV4LnJzaDoQAGAAAAAXAAAACQAAAFBvaXNvbkVycm9yIHsgaW5uZXI6IC4uIH1Qb2lzb25FcnJvciB7IGlubmVyOiAuLiB9Y2Fubm90IGFjY2VzcyBhIFRocmVhZCBMb2NhbCBTdG9yYWdlIHZhbHVlIGR1cmluZyBvciBhZnRlciBkZXN0cnVjdGlvbi9ydXN0Yy9jYjc1YWQ1ZGIwMjc4M2U4YjAyMjJmZWUzNjNjNWY2M2Y3ZTJjZjViL2xpYnJhcnkvc3RkL3NyYy90aHJlYWQvbG9jYWwucnMAUDsQAE8AAAD4AAAAGgAAAPIAAAAAAAAAAQAAAGkAAABhc3NlcnRpb24gZmFpbGVkOiBzbG90LmdldCgpL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2JhY2t0cmFjZS0wLjMuNTYvc3JjL2xpYi5yc9w7EABYAAAAegAAABUAAAAgICAgICAAAEQ8EAAGAAAAVDwQAAAAAAANAAAAAAAAACAAAAAAAAAAAgAAAAAAAAABAAAAAQAAAAMAAAA6IAAAVDwQAAAAAACAPBAAAgAAAAAAAAAgAAAAAAAAAAIAQaz5wAALoRkEAAAAAwAAACAtIABUPBAAAAAAALQ8EAADAAAACgAAAAAAAAAgAAAABAAAAAIAAAAAAAAAAgAAAAAAAAADAAAAPHVua25vd24+AAAA7DwQAAkAAAAKICAgICAgICAgICAgIGF0IAAAAAE9EAAQAAAAOgAAABw9EAABAAAAAD0QAAEAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFja3RyYWNlLTAuMy41Ni9zcmMvY2FwdHVyZS5yczA9EABcAAAAcAEAAA8AAAD2AAAAFAAAAAQAAAD3AAAA+AAAAO+/vS9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYWNrdHJhY2UtMC4zLjU2L3NyYy9zeW1ib2xpemUvbW9kLnJzAAAAsz0QAGIAAAB2AQAAKwAAAGNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUA+QAAAAgAAAAEAAAA+gAAAPsAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmFja3RyYWNlLTAuMy41Ni9zcmMvbGliLnJzaD4QAFgAAACKAAAAKwAAAABhc3NlcnRpb24gZmFpbGVkOiBgKGxlZnQgPT0gcmlnaHQpYAogIGxlZnQ6IGBgLAogcmlnaHQ6IGBgOiAAAADRPhAALQAAAP4+EAAMAAAACj8QAAMAAABjYW5ub3QgcmVjdXJzaXZlbHkgYWNxdWlyZSBtdXRleCg/EAAgAAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9zdGQvc3JjL3N5cy93YXNtLy4uL3Vuc3VwcG9ydGVkL211dGV4LnJzUD8QAGAAAAAXAAAACQAAAPwAAAAEAAAABAAAAP0AAAD+AAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9zdGQvc3JjL3N5bmMvb25jZS5yc9Q/EABMAAAABQEAADIAAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlaW50ZXJuYWwgZXJyb3I6IGVudGVyZWQgdW5yZWFjaGFibGUgY29kZS9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9iYWNrdHJhY2UtMC4zLjU2L3NyYy90eXBlcy5y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dWUAANxHEAAKAAAAYnl0ZSBhcnJheQAA8EcQAAoAAABzdHJpbmcgAARIEAAHAAAAY2hhcmFjdGVyIGBgFEgQAAsAAAAfSBAAAQAAAGZsb2F0aW5nIHBvaW50IGAwSBAAEAAAAB9IEAABAAAAaW50ZWdlciBgAAAAUEgQAAkAAAAfSBAAAQAAAGJvb2xlYW4gYAAAAGxIEAAJAAAAH0gQAAEAAAB1OHVzaXplL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3JhbmRfY29yZS0wLjUuMS9zcmMvYmxvY2sucnOPSBAAWQAAAOMAAAAmAAAAj0gQAFkAAADkAAAAKgAAAGFzc2VydGlvbiBmYWlsZWQ6IGluZGV4IDwgc2VsZi5yZXN1bHRzLmFzX3JlZigpLmxlbigpAAAAj0gQAFkAAACmAAAACQBB2JLBAAvQDmNhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb24vcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAAAAnkkQAE8AAAD4AAAAGgAAAAcBAAAAAAAAAQAAAGkAAABjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAAkBAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcmFuZC0wLjcuMy9zcmMvcm5ncy90aHJlYWQucnMAAEBKEABaAAAAUgAAACAAAABjb3VsZCBub3QgaW5pdGlhbGl6ZSB0aHJlYWRfcm5nOiAAAACsShAAIQAAAEBKEABaAAAAQQAAABEAAAAEAAAAYXNzZXJ0aW9uIGZhaWxlZDogYChsZWZ0ID09IHJpZ2h0KWAKICBsZWZ0OiBgYCwKIHJpZ2h0OiBgYAAA7EoQAC0AAAAZSxAADAAAACVLEAABAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNv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cnMAAJdWEABLAAAAnAgAAA4AAAAcAQAAAAAAAAEAAACWAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2ZmLXplcm9pemUtMC42LjMvc3JjL2xpYi5ycwRXEABYAAAATgEAABIAAABlbmNvZGluZyBoYXMgdW5leHBlY3RlZCBpbmZvcm1hdGlvbmVuY29kaW5nIGhhcyB1bmV4cGVjdGVkIGNvbXByZXNzaW9uIG1vZGVjb29yZGluYXRlKHMpIGNvdWxkIG5vdCBiZSBkZWNvZGVkdGhlIGVsZW1lbnQgaXMgbm90IHBhcnQgb2YgYW4gci1vcmRlciBzdWJncm91cGNvb3JkaW5hdGUocykgZG8gbm90IGxpZSBvbiB0aGUgY3VydmUgZGVjb2RpbmcgZXJyb3I6IAAAAFhWEAAAAAAALFgQABEAAABVbmV4cGVjdGVkSW5mb3JtYXRpb25VbmV4cGVjdGVkQ29tcHJlc3Npb25Nb2RlQ29vcmRpbmF0ZURlY29kaW5nRXJyb3IAAAAdAQAABAAAAAQAAAAeAQAAHwEAAAQAAAAEAAAAIAEAAE5vdEluU3ViZ3JvdXBOb3RPbkN1cnZlY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZWNhbGxlZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAAAAhAQAACAAAAAQAAABiAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3BhaXJpbmctcGx1cy0wLjE5LjAvc3JjL2JsczEyXzM4MS9lYy9nMS5ycwA4WRAAZwAAAF8AAAAoAAAAOFkQAGcAAABgAAAAKAAAAHggY29vcmRpbmF0ZXkgY29vcmRpbmF0ZThZEABnAAAAdgAAADgAAAA4WRAAZwAAAHcAAAA4AAAAOFkQAGcAAADIAAAAKAAAADhZEABnAAAA3QAAADwAAAAWDFP9kIezXPX/dpln/Bd4waE7FMeVTxVH59DzzWqu8ED02yHMbs7tdfsLnkF3ARJxIucM1ZOsuo79GHkaYyKMziUHVxNfWd2UUUBQ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IHRoZSBmaWVsZCBpcyBub3QgYW4gZWxlbWVudCBvZiB0aGUgZmllbGQAAINxEAAAAAAAg3EQAB8AAABOb3RJbkZpZWxkAAArAQAABAAAAAQAAACYAAAALAEAAAgAAAAEAAAALQEAAC4BAAAIAAAABAAAAC8BAAAwAQAA9HEQAAAAAAAyAQAABAAAAAQAAAAzAQAANAEAADUBAAA2AQAANwEAADgBAAA5AQAAZGVzY3JpcHRpb24oKSBpcyBkZXByZWNhdGVkOyB1c2UgRGlzcGxheUVycm9ydW5rbm93bl9jb2RlAAAAOwEAAAQAAAAEAAAAPAEAAGludGVybmFsX2NvZGVkZXNjcmlwdGlvbj0BAAAIAAAABAAAAD4BAABvc19lcnJvcj8BAAAEAAAABAAAAEABAABVbmtub3duIEVycm9yOiAAsHIQAA8AAABPUyBFcnJvcjogAADIchAACgAAAHJhbmRTZWN1cmU6IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWRzdGR3ZWI6IGZhaWxlZCB0byBnZXQgcmFuZG9tbmVzc3N0ZHdlYjogbm8gcmFuZG9tbmVzcyBzb3VyY2UgYXZhaWxhYmxld2FzbS1iaW5kZ2VuOiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIGlzIHVuZGVmaW5lZHdhc20tYmluZGdlbjogc2VsZi5jcnlwdG8gaXMgdW5kZWZpbmVkUkRSQU5EOiBpbnN0cnVjdGlvbiBub3Qgc3VwcG9ydGVkUkRSQU5EOiBmYWlsZWQgbXVsdGlwbGUgdGltZXM6IENQVSBpc3N1ZSBsaWtlbHlSdGxHZW5SYW5kb206IGNhbGwgZmFpbGVkU2VjUmFuZG9tQ29weUJ5dGVzOiBjYWxsIGZhaWxlZFVua25vd24gc3RkOjppbzo6RXJyb3JlcnJubzogZGlkIG5vdCByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZWdldHJhbmRvbTogdGhpcyB0YXJnZXQgaXMgbm90IHN1cHBvcnRlZAAAACcAAAAmAAAAFgAAAB8AAAAZAAAALwAAACEAAAAmAAAAMQAAACYAAAAgAAAAPQAAAHp0EABUdBAAPnQQAB90EAAGdBAA13MQALZzEACQcxAAX3MQADlzEAAZcxAA3HIQAGNhbm5vdCBhY2Nlc3MgYSBUaHJlYWQgTG9jYWwgU3RvcmFnZSB2YWx1ZSBkdXJpbmcgb3IgYWZ0ZXIgZGVzdHJ1Y3Rpb24vcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L3N0ZC9zcmMvdGhyZWFkL2xvY2FsLnJzAAAASnUQAE8AAAD4AAAAGgAAAGFscmVhZHkgYm9ycm93ZWRjYWxsZWQgYE9wdGlvbjo6dW53cmFwKClgIG9uIGEgYE5vbmVgIHZhbHVlAEEBAAAAAAAAAQAAAGkAAABCAQAAAAAAAAEAAABrAAAAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL2dldHJhbmRvbS0wLjEuMTYvc3JjL3dhc20zMl9iaW5kZ2VuLnJzAAh2EABjAAAAKwAAABwAAAAIdhAAYwAAADAAAAAfAAAAQwEAAGNyeXB0bwAARAEAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9qcy1zeXMtMC4zLjQ1L3NyYy9saWIucnMAAACcdhAAVQAAAJATAAABAAAAYXNzZXJ0aW9uIGZhaWxlZDogYChsZWZ0ID09IHJpZ2h0KWAKICBsZWZ0OiBgYCwKIHJpZ2h0OiBgYAAABHcQAC0AAAAxdxAADAAAAD13EAABAAAAL3J1c3RjL2NiNzVhZDVkYjAyNzgzZThiMDIyMmZlZTM2M2M1ZjYzZjdlMmNmNWIvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5yc1RyaWVkIHRvIHNocmluayB0byBhIGxhcmdlciBjYXBhY2l0eVh3EABMAAAAvwEAAAkAAABjbG9zdXJlIGludm9rZWQgcmVjdXJzaXZlbHkgb3IgZGVzdHJveWVkIGFscmVhZHkvcnVzdGMvY2I3NWFkNWRiMDI3ODNlOGIwMjIyZmVlMzYzYzVmNjNmN2UyY2Y1Yi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJzVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5CHgQAEwAAAC/AQAACQAAAEpzVmFsdWUoKQAAAIh4EAAIAAAAkHgQAAEAAAAvaG9tZS9ydW5uZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvYmxha2UyLTAuOC4xL3NyYy9ibGFrZTJiLnJzpHgQAFgAAAAEAAAAAQAAAGhhc2ggZGF0YSBsZW5ndGggb3ZlcmZsb3dJbnZhbGlkS2V5TGVuZ3RoSW52YWxpZE91dHB1dFNpemVHZW5lcmljQXJyYXk6OmZyb21faXRlciByZWNlaXZlZCAgZWxlbWVudHMgYnV0IGV4cGVjdGVkIAAARnkQACEAAABneRAAFwAAAC9ob21lL3J1bm5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2dpdGh1Yi5jb20tMWVjYzYyOTlkYjllYzgyMy9nZW5lcmljLWFycmF5LTAuMTIuMy9zcmMvbGliLnJzkHkQAFwAAABCAQAABQAAAFsBAAAEAAAABAAAAFwBAABdAQAAXgEAAFsBAAAEAAAABAAAAF8BAABhbHJlYWR5IGJvcnJvd2VkYWxyZWFkeSBtdXRhYmx5IGJvcnJvd2VkYXNzZXJ0aW9uIGZhaWxlZDogYChsZWZ0ID09IHJpZ2h0KWAKICBsZWZ0OiBgYCwKIHJpZ2h0OiBgYAAATHoQAC0AAAB5ehAADAAAAIV6EAABAAAAWwEAAAAAAAABAAAAYAEAAGNhbGxlZCBgT3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWUAWwEAAAAAAAABAAAAawAAAGEBAAAQAAAABAAAAGIBAABbAQAAAAAAAAEAAABjAQAAY2FsbGVkIGBSZXN1bHQ6OnVud3JhcCgpYCBvbiBhbiBgRXJyYCB2YWx1ZQBkAQAACAAAAAQAAABlAQAAWwEAAAQAAAAEAAAAWAEAAEFjY2Vzc0Vycm9ybGlicmFyeS9zdGQvc3JjL3RocmVhZC9tb2QucnNmYWlsZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHRocmVhZCBJRDogYml0c3BhY2UgZXhoYXVzdGVkAGN7EAAdAAAA4wMAABEAAABjexAAHQAAAOkDAAAqAAAAdGhyZWFkIG5hbWUgbWF5IG5vdCBjb250YWluIGludGVyaW9yIG51bGwgYnl0ZXMAY3sQAB0AAAAjBAAAKgAAAGA6IABmAQAADAAAAAQAAABnAQAAaAEAAGkBAAAYAQAAZwEAABoBAAAbAQAAAEtpbmQAAABbAQAAAQAAAAEAAABqAQAAT3Njb2RlAABbAQAABAAAAAQAAABrAQAAa2luZG1lc3NhZ2UAZgEAAAwAAAAEAAAAbAEAAGludGVybmFsIGVycm9yOiBlbnRlcmVkIHVucmVhY2hhYmxlIGNvZGVsaWJyYXJ5L3N0ZC9zcmMvcGF0aC5ycwC4fBAAFwAAAKoCAAAYAAAAuHwQABcAAADPAgAAIwAAALh8EAAXAAAA0QIAAB0AAAC4fBAAFwAAAN0CAAAeAAAAuHwQABcAAADpAgAAHgAAALh8EAAXAAAAbwMAACAAAAC4fBAAFwAAAGcDAAAiAAAAuHwQABcAAABZAwAAJgAAALh8EAAXAAAAYQMAACYAAAC4fBAAFwAAAEsDAAAgAAAAuHwQABcAAABMAwAAIgAAAGxpYnJhcnkvc3RkL3NyYy9zeW5jL29uY2UucnNhc3NlcnRpb24gZmFpbGVkOiBzdGF0ZV9hbmRfcXVldWUgJiBTVEFURV9NQVNLID09IFJVTk5JTkcAAACAfRAAHAAAAKsBAAAVAAAAT25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAACAfRAAHAAAAIoBAAAVAAAAAgAAAIB9EAAcAAAA8QEAAAkAAACAfRAAHAAAAP0BAAA1AAAAUG9pc29uRXJyb3IgeyBpbm5lcjogLi4gfWxpYnJhcnkvc3RkL3NyYy9zeXNfY29tbW9uL3RocmVhZF9pbmZvLnJzAABhfhAAKQAAABUAAAAWAAAAYX4QACkAAAAWAAAAGAAAAGF+EAApAAAAGQAAABUAAABsaWJyYXJ5L3N0ZC9zcmMvcGFuaWNraW5nLnJzvH4QABwAAADrAQAAHwAAALx+EAAcAAAA7AEAAB4AAABtAQAAEAAAAAQAAABuAQAAbwEAAFsBAAAIAAAABAAAAHABAABxAQAAZgEAAAwAAAAEAAAAcgEAAFsBAAAIAAAABAAAAHMBAABbAQAACAAAAAQAAAB0AQAAdQEAAE51bEVycm9yWwEAAAQAAAAEAAAAdgEAAGVycm9yQ3VzdG9tAFsBAAAEAAAABAAAAHcBAABbAQAABAAAAAQAAAB4AQAAVW5leHBlY3RlZEVvZk90aGVySW50ZXJydXB0ZWRXcml0ZVplcm9UaW1lZE91dEludmFsaWREYXRhSW52YWxpZElucHV0V291bGRCbG9ja0FscmVhZHlFeGlzdHNCcm9rZW5QaXBlQWRkck5vdEF2YWlsYWJsZUFkZHJJblVzZU5vdENvbm5lY3RlZENvbm5lY3Rpb25BYm9ydGVkQ29ubmVjdGlvblJlc2V0Q29ubmVjdGlvblJlZnVzZWRQZXJtaXNzaW9uRGVuaWVkTm90Rm91bmRsaWJyYXJ5L3N0ZC9zcmMvc3lzX2NvbW1vbi90aHJlYWRfcGFya2VyL2dlbmVyaWMucnMAbIAQADMAAAAhAAAAJgAAAGluY29uc2lzdGVudCBwYXJrIHN0YXRlAGyAEAAzAAAALwAAABcAAABMehAALQAAAHl6EAAMAAAAGHwQAAMAAABwYXJrIHN0YXRlIGNoYW5nZWQgdW5leHBlY3RlZGx5APCAEAAfAAAAbIAQADMAAAAsAAAAEQAAAGluY29uc2lzdGVudCBzdGF0ZSBpbiB1bnBhcmtsgBAAMwAAAGYAAAASAAAAbIAQADMAAAB0AAAAHwAAAG9wZXJhdGlvbiBzdWNjZXNzZnVsb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybWNvbmR2YXIgd2FpdCBub3Qgc3VwcG9ydGVkbGlicmFyeS9zdGQvc3JjL3N5cy93YXNtLy4uL3Vuc3VwcG9ydGVkL2NvbmR2YXIucnO6gRAAMgAAABcAAAAJAAAAY2Fubm90IHJlY3Vyc2l2ZWx5IGFjcXVpcmUgbXV0ZXj8gRAAIAAAAGxpYnJhcnkvc3RkL3NyYy9zeXMvd2FzbS8uLi91bnN1cHBvcnRlZC9tdXRleC5ycySCEAAwAAAAFwAAAAkAAABIYXNoIHRhYmxlIGNhcGFjaXR5IG92ZXJmbG93L2NhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvaGFzaGJyb3duLTAuOS4wL3NyYy9yYXcvbW9kLnJzAACAghAATgAAAE8AAAAoAAAA/////3kBAAAEAAAABAAAAHoBAAB7AQAAfAEAAC9ydXN0Yy9jYjc1YWQ1ZGIw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ZGV4IGlzIAAAGJEQACAAAAA4kRAAEgAAAGxpYnJhcnkvY29yZS9zcmMvZm10L2J1aWxkZXJzLnJzggEAAAwAAAAEAAAAhAEAAIUBAACGAQAAICAgIFyREAAgAAAAMgAAACEAAABckRAAIAAAADMAAAASAAAAIHsKLAosICB7IH0gfSgKKCwpCltdbGlicmFyeS9jb3JlL3NyYy9mbXQvbnVtLnJzzZEQABsAAABlAAAAFAAAADB4MDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTkAAIIBAAAEAAAABAAAAIcBAACIAQAAiQEAAGxpYnJhcnkvY29yZS9zcmMvZm10L21vZC5ycwDckhAAGwAAALUFAAAeAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMNySEAAbAAAArwUAAC0AAAB0cnVlZmFsc2UAAADckhAAGwAAAP4HAAAeAAAA3JIQABsAAAAFCAAAFgAAACgpbGlicmFyeS9jb3JlL3NyYy9zbGljZS9tZW1jaHIucnMAAIaTEAAgAAAAWgAAAAUAAAByYW5nZSBzdGFydCBpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGgguJMQABIAAADKkxAAIgAAAHJhbmdlIGVuZCBpbmRleCD8kxAAEAAAAMqTEAAiAAAAc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCAAHJQQABYAAAAylBAADQAAAGF0dGVtcHRlZCB0byBpbmRleCBzbGljZSB1cCB0byBtYXhpbXVtIHVzaXplc291cmNlIHNsaWNlIGxlbmd0aCAoKSBkb2VzIG5vdCBtYXRjaCBkZXN0aW5hdGlvbiBzbGljZSBsZW5ndGggKHyUEAAVAAAAkZQQ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VQBwAAcALQEBAQIBAgEBSAswFRABZQcCBgICAQQjAR4bWws6CQkBGAQBCQEDAQUrA3cPASA3AQEBBAgEAQMHCgIdAToBAQECBAgBCQEKAhoBAgI5AQQCBAICAwMBHgIDAQsCOQEEBQECBAEUAhYGAQE6AQECAQQIAQcDCgIeATsBAQEMAQkBKAEDATkDBQMBBAcCCwIdAToBAgECAQMBBQIHAgsCHAI5AgEBAgQIAQkBCgIdAUgBBAECAwEBCAFRAQIHDAhiAQIJCwZKAhsBAQEBATcOAQUBAgULASQJAWYEAQYBAgICGQIEAxAEDQECAgYBDwEAAwADHQMdAh4CQAIBBwgBAgsJAS0DdwIiAXYDBAIJAQYD2wICAToBAQcBAQEBAggGCgIBMBE/BDAHAQEFASgJDAIgBAICAQM4AQECAwEBAzoIAgKYAwENAQcEAQYBAwLGOgEFAAHDIQADjQFgIAAGaQIABAEKIAJQAgABAwEEARkCBQGXAhoSDQEmCBkLLgMwAQIEAgInAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggB7gECAQQBAAEAEBAQAAIAAeIBlQUAAwECBQQoAwQBpQIABAACmQuwATYPOAMxBAICRQMkBQEIPgEMAjQJCgQCAV8DAgEBAgYBoAEDCBUCOQIBAQEBFgEOBwMFwwgCAwEBFwFRAQIGAQECAQECAQLrAQIEBgIBAhsCVQgCAQECagEBAQIGAQFlAwIEAQUACQEC9QEKAgEBBAGQBAICBAEgCigGAgQIAQkGAgMuDQECAAcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBAAIABTsHAAE/BFEBAAIAAQEDBAUICAIHHgSUAwA3BDIIAQ4BFgUBDwAHARECBwECAQUABwAEAAdtBwBggPAATGF5b3V0RXJyb3Jwcml2YXRlAEHYxMIACwkCAAAAAAAAAAEAewlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjHTEuNTAuMCAoY2I3NWFkNWRiIDIwMjEtMDItMTApBndhbHJ1cwYwLjE4LjAMd2FzbS1iaW5kZ2VuEjAuMi42OCAoYTA0ZTE4OTcxKQ==', 'base64'); diff --git a/patches/@peculiar+webcrypto+1.4.3.patch b/patches/@peculiar+webcrypto+1.4.3.patch new file mode 100644 index 000000000..67dfcaa45 --- /dev/null +++ b/patches/@peculiar+webcrypto+1.4.3.patch @@ -0,0 +1,16 @@ +diff --git a/node_modules/@peculiar/webcrypto/build/webcrypto.js b/node_modules/@peculiar/webcrypto/build/webcrypto.js +index 5fa3589..7d39c7b 100644 +--- a/node_modules/@peculiar/webcrypto/build/webcrypto.js ++++ b/node_modules/@peculiar/webcrypto/build/webcrypto.js +@@ -5,8 +5,9 @@ + 'use strict'; + + var core = require('webcrypto-core'); +-var crypto = require('crypto'); +-var process = require('process'); ++import crypto from 'node:crypto'; ++import process from 'node:process'; ++import {Buffer} from 'node:buffer'; + var tslib = require('tslib'); + var jsonSchema = require('@peculiar/json-schema'); + var pvtsutils = require('pvtsutils'); diff --git a/patches/@stablelib+random+1.0.2.patch b/patches/@stablelib+random+1.0.2.patch new file mode 100644 index 000000000..c2012941b --- /dev/null +++ b/patches/@stablelib+random+1.0.2.patch @@ -0,0 +1,19 @@ +diff --git a/node_modules/@stablelib/random/lib/source/node.js b/node_modules/@stablelib/random/lib/source/node.js +index 391749f..ff1ce7b 100644 +--- a/node_modules/@stablelib/random/lib/source/node.js ++++ b/node_modules/@stablelib/random/lib/source/node.js +@@ -1,4 +1,6 @@ + "use strict"; ++import nodeCrypto from "node:crypto"; ++ + // Copyright (C) 2016 Dmitry Chestnykh + // MIT License. See LICENSE file for details. + Object.defineProperty(exports, "__esModule", { value: true }); +@@ -9,7 +11,6 @@ class NodeRandomSource { + this.isAvailable = false; + this.isInstantiated = false; + if (typeof require !== "undefined") { +- const nodeCrypto = require("crypto"); + if (nodeCrypto && nodeCrypto.randomBytes) { + this._crypto = nodeCrypto; + this.isAvailable = true; diff --git a/patches/@transmute+did-key-bls12381+0.2.1-unstable.42.patch b/patches/@transmute+did-key-bls12381+0.2.1-unstable.42.patch new file mode 100644 index 000000000..442f0cb80 --- /dev/null +++ b/patches/@transmute+did-key-bls12381+0.2.1-unstable.42.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@transmute/did-key-bls12381/dist/index.js b/node_modules/@transmute/did-key-bls12381/dist/index.js +index 24e3a79..8b030a2 100644 +--- a/node_modules/@transmute/did-key-bls12381/dist/index.js ++++ b/node_modules/@transmute/did-key-bls12381/dist/index.js +@@ -1,7 +1,7 @@ + + 'use strict' + +-if (process.env.NODE_ENV === 'production') { ++if (true) { + module.exports = require('./did-key-bls12381.cjs.production.min.js') + } else { + module.exports = require('./did-key-bls12381.cjs.development.js') diff --git a/patches/@transmute+did-key-cipher+0.2.1-unstable.42.patch b/patches/@transmute+did-key-cipher+0.2.1-unstable.42.patch new file mode 100644 index 000000000..063810f33 --- /dev/null +++ b/patches/@transmute+did-key-cipher+0.2.1-unstable.42.patch @@ -0,0 +1,21 @@ +diff --git a/node_modules/@transmute/did-key-cipher/dist/did-key-cipher.cjs.production.min.js b/node_modules/@transmute/did-key-cipher/dist/did-key-cipher.cjs.production.min.js +index 5523c21..6275a9e 100644 +--- a/node_modules/@transmute/did-key-cipher/dist/did-key-cipher.cjs.production.min.js ++++ b/node_modules/@transmute/did-key-cipher/dist/did-key-cipher.cjs.production.min.js +@@ -1,2 +1,2 @@ +-"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("@peculiar/webcrypto"),t=(e=require("base64url"))&&"object"==typeof e&&"default"in e?e.default:e,n=require("@stablelib/aes-kw"),i=require("web-streams-polyfill/ponyfill"),o=require("@stablelib/xchacha20poly1305"),a="object"==typeof process&&"object"==typeof process.versions&&void 0!==process.versions.node?new r.Crypto:window.crypto,s=new Uint8Array(4+"ECDH-ES+A256KW".length);new DataView(s.buffer,s.byteOffset,s.byteLength).setUint32(0,"ECDH-ES+A256KW".length),s.set(Buffer.from("ECDH-ES+A256KW"),4);var c={name:"SHA-256"},f=function(){function e(e){if(32!==e.length)throw new Error("key must be 32 bytes");this.aeskw=new n.AESKW(e),this.algorithm={name:"A256KW"}}var r=e.prototype;return r.wrapKey=function(e){var r=this.aeskw.wrapKey(e.unwrappedKey);return t.encode(Buffer.from(r))},r.unwrapKey=function(e){var r=t.toBuffer(e.wrappedKey);try{return this.aeskw.unwrapKey(r)}catch(e){return console.error(e),null}},e}();function u(){return(u=Object.assign||function(e){for(var r=1;r=0||(i[t]=e[t]);return i}(e,["obj"]);try{if("object"!=typeof r)throw new TypeError('"obj" must be an object.');return Promise.resolve(this.encrypt(u({data:JSON.stringify(r)},t)))}catch(e){return Promise.reject(e)}},r.decrypt=function(e){var r=e.jwe,t=e.keyAgreementKey;try{return Promise.resolve(this.createDecryptTransformer({keyAgreementKey:t})).then((function(e){return e.decrypt(r)}))}catch(e){return Promise.reject(e)}},r.decryptObject=function(e){var r=e.jwe,t=e.keyAgreementKey;try{return Promise.resolve(this.decrypt({jwe:r,keyAgreementKey:t})).then((function(e){return e?JSON.parse(Buffer.from(e).toString()):null}))}catch(e){return Promise.reject(e)}},r.createEncryptTransformer=function(e){var r=e.recipients,n=e.keyResolver,i=e.chunkSize;try{var o=this;if(!(Array.isArray(r)&&r.length>0))throw new TypeError('"recipients" must be a non-empty array.');var a=o.KeyPairClass.JWE_ALG;if(!r.every((function(e){return e.header&&e.header.alg===a})))throw new Error('All recipients must use the algorithm "'+a+'".');var s=o.cipher;return Promise.resolve(s.generateKey()).then((function(e){return Promise.resolve(Promise.all(r.map((function(e){return n({id:e.header.kid})})))).then((function(n){var a=void 0;return"JsonWebKey2020"===n[0].type&&(a={kty:"EC",crvOrSize:n[0].publicKeyJwk.crv}),Promise.resolve(o.KeyPairClass.generateEphemeralKeyPair(a)).then((function(a){return Promise.resolve(Promise.all(n.map((function(e){return o.KeyPairClass.kekFromStaticPeer({ephemeralKeyPair:a,staticPublicKey:e})})))).then((function(n){return Promise.resolve(Promise.all(r.map((function(t,i){try{var o=n[i],a=o.kek,s=o.epk,c=o.apu,f=o.apv;return r[i]=t={header:u({},t.header)},t.header.epk=s,t.header.apu=c,t.header.apv=f,Promise.resolve(a.wrapKey({unwrappedKey:e})).then((function(e){t.encrypted_key=e}))}catch(e){return Promise.reject(e)}})))).then((function(){var n=JSON.stringify({enc:s.JWE_ENC}),o=t.encode(Buffer.from(y(n))),a=y(o);return new g({recipients:r,encodedProtectedHeader:o,cipher:s,additionalData:a,cek:e,chunkSize:i})}))}))}))}))}))}catch(e){return Promise.reject(e)}},r.createDecryptTransformer=function(e){var r=e.keyAgreementKey;try{return Promise.resolve(new m({KeyPairClass:this.KeyPairClass,keyAgreementKey:r}))}catch(e){return Promise.reject(e)}},e}(),exports.KeyEncryptionKey=f,exports.deriveKey=function(e){var r=e.secret,t=e.producerInfo,n=e.consumerInfo;try{if(!(r instanceof Uint8Array&&r.length>0))throw new TypeError('"secret" must be a non-empty Uint8Array.');if(!(t instanceof Uint8Array&&t.length>0))throw new TypeError('"producerInfo" must be a non-empty Uint8Array.');if(!(n instanceof Uint8Array&&n.length>0))throw new TypeError('"consumerInfo" must be a non-empty Uint8Array.');var i=new Uint8Array(4+r.length+s.length+4+t.length+4+n.length+4),o=0,f=new DataView(i.buffer,i.byteOffset,i.byteLength);return f.setUint32(o,1),i.set(r,o+=4),i.set(s,o+=r.length),f.setUint32(o+=s.length,t.length),i.set(t,o+=4),f.setUint32(o+=t.length,n.length),i.set(n,o+=4),f.setUint32(o+=n.length,256),Promise.resolve(a.subtle.digest(c,i)).then((function(e){return new Uint8Array(e)}))}catch(e){return Promise.reject(e)}},exports.getEpkGenerator=function(e,r){return function(){try{return Promise.resolve(e.generate(r)).then((function(e){return Promise.resolve(e.toJsonWebKeyPair(!0)).then((function(e){return{keypair:e,epk:e.publicKeyJwk}}))}))}catch(e){return Promise.reject(e)}}}; ++"use strict";import {Buffer} from 'node:buffer';Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("@peculiar/webcrypto"),t=(e=require("base64url"))&&"object"==typeof e&&"default"in e?e.default:e,n=require("@stablelib/aes-kw"),i=require("web-streams-polyfill/ponyfill"),o=require("@stablelib/xchacha20poly1305"),a="object"==typeof process&&"object"==typeof process.versions&&void 0!==process.versions.node?new r.Crypto:window.crypto,s=new Uint8Array(4+"ECDH-ES+A256KW".length);new DataView(s.buffer,s.byteOffset,s.byteLength).setUint32(0,"ECDH-ES+A256KW".length),s.set(Buffer.from("ECDH-ES+A256KW"),4);var c={name:"SHA-256"},f=function(){function e(e){if(32!==e.length)throw new Error("key must be 32 bytes");this.aeskw=new n.AESKW(e),this.algorithm={name:"A256KW"}}var r=e.prototype;return r.wrapKey=function(e){var r=this.aeskw.wrapKey(e.unwrappedKey);return t.encode(Buffer.from(r))},r.unwrapKey=function(e){var r=t.toBuffer(e.wrappedKey);try{return this.aeskw.unwrapKey(r)}catch(e){return console.error(e),null}},e}();function u(){return(u=Object.assign||function(e){for(var r=1;r=0||(i[t]=e[t]);return i}(e,["obj"]);try{if("object"!=typeof r)throw new TypeError('"obj" must be an object.');return Promise.resolve(this.encrypt(u({data:JSON.stringify(r)},t)))}catch(e){return Promise.reject(e)}},r.decrypt=function(e){var r=e.jwe,t=e.keyAgreementKey;try{return Promise.resolve(this.createDecryptTransformer({keyAgreementKey:t})).then((function(e){return e.decrypt(r)}))}catch(e){return Promise.reject(e)}},r.decryptObject=function(e){var r=e.jwe,t=e.keyAgreementKey;try{return Promise.resolve(this.decrypt({jwe:r,keyAgreementKey:t})).then((function(e){return e?JSON.parse(Buffer.from(e).toString()):null}))}catch(e){return Promise.reject(e)}},r.createEncryptTransformer=function(e){var r=e.recipients,n=e.keyResolver,i=e.chunkSize;try{var o=this;if(!(Array.isArray(r)&&r.length>0))throw new TypeError('"recipients" must be a non-empty array.');var a=o.KeyPairClass.JWE_ALG;if(!r.every((function(e){return e.header&&e.header.alg===a})))throw new Error('All recipients must use the algorithm "'+a+'".');var s=o.cipher;return Promise.resolve(s.generateKey()).then((function(e){return Promise.resolve(Promise.all(r.map((function(e){return n({id:e.header.kid})})))).then((function(n){var a=void 0;return"JsonWebKey2020"===n[0].type&&(a={kty:"EC",crvOrSize:n[0].publicKeyJwk.crv}),Promise.resolve(o.KeyPairClass.generateEphemeralKeyPair(a)).then((function(a){return Promise.resolve(Promise.all(n.map((function(e){return o.KeyPairClass.kekFromStaticPeer({ephemeralKeyPair:a,staticPublicKey:e})})))).then((function(n){return Promise.resolve(Promise.all(r.map((function(t,i){try{var o=n[i],a=o.kek,s=o.epk,c=o.apu,f=o.apv;return r[i]=t={header:u({},t.header)},t.header.epk=s,t.header.apu=c,t.header.apv=f,Promise.resolve(a.wrapKey({unwrappedKey:e})).then((function(e){t.encrypted_key=e}))}catch(e){return Promise.reject(e)}})))).then((function(){var n=JSON.stringify({enc:s.JWE_ENC}),o=t.encode(Buffer.from(y(n))),a=y(o);return new g({recipients:r,encodedProtectedHeader:o,cipher:s,additionalData:a,cek:e,chunkSize:i})}))}))}))}))}))}catch(e){return Promise.reject(e)}},r.createDecryptTransformer=function(e){var r=e.keyAgreementKey;try{return Promise.resolve(new m({KeyPairClass:this.KeyPairClass,keyAgreementKey:r}))}catch(e){return Promise.reject(e)}},e}(),exports.KeyEncryptionKey=f,exports.deriveKey=function(e){var r=e.secret,t=e.producerInfo,n=e.consumerInfo;try{if(!(r instanceof Uint8Array&&r.length>0))throw new TypeError('"secret" must be a non-empty Uint8Array.');if(!(t instanceof Uint8Array&&t.length>0))throw new TypeError('"producerInfo" must be a non-empty Uint8Array.');if(!(n instanceof Uint8Array&&n.length>0))throw new TypeError('"consumerInfo" must be a non-empty Uint8Array.');var i=new Uint8Array(4+r.length+s.length+4+t.length+4+n.length+4),o=0,f=new DataView(i.buffer,i.byteOffset,i.byteLength);return f.setUint32(o,1),i.set(r,o+=4),i.set(s,o+=r.length),f.setUint32(o+=s.length,t.length),i.set(t,o+=4),f.setUint32(o+=t.length,n.length),i.set(n,o+=4),f.setUint32(o+=n.length,256),Promise.resolve(a.subtle.digest(c,i)).then((function(e){return new Uint8Array(e)}))}catch(e){return Promise.reject(e)}},exports.getEpkGenerator=function(e,r){return function(){try{return Promise.resolve(e.generate(r)).then((function(e){return Promise.resolve(e.toJsonWebKeyPair(!0)).then((function(e){return{keypair:e,epk:e.publicKeyJwk}}))}))}catch(e){return Promise.reject(e)}}}; + //# sourceMappingURL=did-key-cipher.cjs.production.min.js.map +diff --git a/node_modules/@transmute/did-key-cipher/dist/index.js b/node_modules/@transmute/did-key-cipher/dist/index.js +index b2580ea..0e1fda3 100644 +--- a/node_modules/@transmute/did-key-cipher/dist/index.js ++++ b/node_modules/@transmute/did-key-cipher/dist/index.js +@@ -1,7 +1,7 @@ + + 'use strict' + +-if (process.env.NODE_ENV === 'production') { ++if (true) { + module.exports = require('./did-key-cipher.cjs.production.min.js') + } else { + module.exports = require('./did-key-cipher.cjs.development.js') diff --git a/patches/@transmute+did-key-common+0.2.1-unstable.42.patch b/patches/@transmute+did-key-common+0.2.1-unstable.42.patch new file mode 100644 index 000000000..cbfb972e4 --- /dev/null +++ b/patches/@transmute+did-key-common+0.2.1-unstable.42.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@transmute/did-key-common/dist/index.js b/node_modules/@transmute/did-key-common/dist/index.js +index f32c58e..b82b075 100644 +--- a/node_modules/@transmute/did-key-common/dist/index.js ++++ b/node_modules/@transmute/did-key-common/dist/index.js +@@ -1,7 +1,7 @@ + + 'use strict' + +-if (process.env.NODE_ENV === 'production') { ++if (true) { + module.exports = require('./did-key-common.cjs.production.min.js') + } else { + module.exports = require('./did-key-common.cjs.development.js') diff --git a/patches/@transmute+did-key-ed25519+0.2.1-unstable.42.patch b/patches/@transmute+did-key-ed25519+0.2.1-unstable.42.patch new file mode 100644 index 000000000..fe4173da1 --- /dev/null +++ b/patches/@transmute+did-key-ed25519+0.2.1-unstable.42.patch @@ -0,0 +1,34 @@ +diff --git a/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.development.js b/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.development.js +index 8bb5a1e..c4baa96 100644 +--- a/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.development.js ++++ b/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.development.js +@@ -8,7 +8,7 @@ var base64url = _interopDefault(require('base64url')); + var ed25519 = require('@stablelib/ed25519'); + var canonicalize = _interopDefault(require('canonicalize')); + var bs58 = _interopDefault(require('bs58')); +-var crypto = _interopDefault(require('crypto')); ++import crypto from 'node:crypto' + var common = require('@transmute/did-key-common'); + var tslib = require('tslib'); + var didKeyX25519 = require('@transmute/did-key-x25519'); +diff --git a/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.production.min.js b/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.production.min.js +index b859eb5..67bcdfb 100644 +--- a/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.production.min.js ++++ b/node_modules/@transmute/did-key-ed25519/dist/did-key-ed25519.cjs.production.min.js +@@ -1,2 +1,2 @@ +-"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var r=e(require("base64url")),t=require("@stablelib/ed25519"),i=e(require("canonicalize")),n=e(require("bs58")),o=e(require("crypto")),u=require("@transmute/did-key-common"),c=require("tslib"),f=require("@transmute/did-key-x25519");function a(){return(a=Object.assign||function(e){for(var r=1;r0;)t=Buffer.concat([Buffer.from("00","hex"),t]),i--;return t},w=function(e){for(var r=g(e),t=Buffer.from(r,"hex"),i=32-t.length;i>0;)t=Buffer.concat([Buffer.from("00","hex"),t]),i--;return t},k=function(e){return n.encode(Buffer.from(e,"hex"))},P=function(e){return n.encode(Buffer.from(e,"hex"))},S={__proto__:null,getKid:h,privateKeyJwkFromPrivateKeyHex:K,publicKeyJwkFromPublicKeyHex:m,privateKeyJwkFromPrivateKeyPem:function(e){var t=a({},r.from(e,"pem").toJwk("private"),{crv:"secp256k1"});return a({},t,{kid:h(t)})},publicKeyJwkFromPublicKeyPem:function(e){var t=a({},r.from(e,"pem").toJwk("public"),{crv:"secp256k1"});return a({},t,{kid:h(t)})},privateKeyHexFromJwk:b,publicKeyHexFromJwk:g,privateKeyUInt8ArrayFromJwk:B,publicKeyUInt8ArrayFromJwk:w,publicKeyBase58FromPublicKeyHex:k,privateKeyBase58FromPrivateKeyHex:P,privateKeyUInt8ArrayFromPrivateKeyBase58:function(e){return n.decode(e)},publicKeyUInt8ArrayFromPublicKeyBase58:function(e){return n.decode(e)},publicKeyHexFromPrivateKeyHex:function(e){var r=o.publicKeyCreate(new Uint8Array(Buffer.from(e,"hex")));return Buffer.from(r).toString("hex")},publicKeyJwkFromPublicKeyBase58:function(e){return m(n.decode(e).toString("hex"))},privateKeyJwkFromPrivateKeyBase58:function(e){return K(n.decode(e).toString("hex"))}},x=function(e){var r,t;function i(r){var t;return(t=e.call(this,r)||this).name="JWSVerificationFailed",t}return t=e,(r=i).prototype=Object.create(t.prototype),r.prototype.constructor=r,r.__proto__=t,i}(d(Error)),J={__proto__:null,signDetached:function(e,r,n){void 0===n&&(n={alg:"ES256K",b64:!1,crit:["b64"]});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(e.buffer,e.byteOffset,e.length)]),f=Buffer.from(c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+".."+t.encode(Buffer.from(s.signature))}))}catch(e){return Promise.reject(e)}},verifyDetached:function(e,r,n){try{if(-1===e.indexOf(".."))throw new x("not a valid rfc7797 jws.");var u=e.split(".."),c=u[0],f=u[1],a=JSON.parse(t.decode(c));if("ES256K"!==a.alg)throw new Error("JWS alg is not signed with ES256K.");if(!1!==a.b64||!a.crit||!a.crit.length||"b64"!==a.crit[0])throw new Error("JWS Header is not in rfc7797 format (not detached).");return Promise.resolve(w(n)).then((function(e){var n=Buffer.concat([Buffer.from(c+".","utf8"),Buffer.from(r.buffer,r.byteOffset,r.length)]),u=Buffer.from(n),a=i.createHash("sha256").update(u).digest(),s=t.toBuffer(f),l=o.signatureNormalize(s);return o.ecdsaVerify(l,a,e)}))}catch(e){return Promise.reject(e)}},sign:function(e,r,n){void 0===n&&(n={alg:"ES256K"});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=t.encode(JSON.stringify(e)),f=Buffer.from(u+"."+c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+"."+c+"."+t.encode(s.signature)}))}catch(e){return Promise.reject(e)}},verify:function(e,r){try{return Promise.resolve(w(r)).then((function(r){var n=e.split("."),u=n[2],c=Buffer.from(n[0]+"."+n[1]),f=i.createHash("sha256").update(c).digest(),a=t.toBuffer(u),s=o.signatureNormalize(a);return o.ecdsaVerify(s,f,r)}))}catch(e){return Promise.reject(e)}},decode:function(e,r){void 0===r&&(r={complete:!1});var i=e.split("."),n=i[1],o=i[2];return r.complete?{header:JSON.parse(t.decode(i[0])),payload:JSON.parse(t.decode(n)),signature:o}:JSON.parse(t.decode(n))}},O={__proto__:null,sign:function(e,r,n){void 0===n&&(n={alg:"ES256K-R"});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=t.encode(JSON.stringify(e)),f=Buffer.from(u+"."+c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+"."+c+"."+t.encode(s.signature)}))}catch(e){return Promise.reject(e)}},verify:function(e,r){try{return Promise.resolve(w(r)).then((function(r){var n=e.split("."),u=n[0],c=n[1],f=n[2];if("ES256K-R"!==JSON.parse(t.decode(u)).alg)throw new Error("Expecteed header.alg to be ES256K-R");var a=Buffer.from(u+"."+c),s=i.createHash("sha256").update(a).digest(),l=t.toBuffer(f),p=o.signatureNormalize(l);return o.ecdsaVerify(p,s,r)}))}catch(e){return Promise.reject(e)}},signDetached:function(e,r,n){void 0===n&&(n={alg:"ES256K-R",b64:!1,crit:["b64"]});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(e.buffer,e.byteOffset,e.length)]),f=Buffer.from(c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r),l=s.recid,p=Buffer.concat([Buffer.from(s.signature),Buffer.from(new Uint8Array([l]))]);return u+".."+t.encode(p)}))}catch(e){return Promise.reject(e)}},recoverPublicKey:function(e,r){try{if(-1===e.indexOf(".."))throw new Error("not a valid rfc7797 jws.");var n=e.split(".."),u=n[0],c=n[1],f=JSON.parse(t.decode(u));if("ES256K-R"!==f.alg)throw new Error("JWS alg is not signed with ES256K-R.");if(!1!==f.b64||!f.crit||!f.crit.length||"b64"!==f.crit[0])throw new Error("JWS Header is not in rfc7797 format (not detached).");var a=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(r.buffer,r.byteOffset,r.length)]),s=Buffer.from(a),l=new Uint8Array(i.createHash("sha256").update(s).digest()),p=new Uint8Array(t.toBuffer(c)),y=p[64];return p=p.slice(0,64),Promise.resolve(o.ecdsaRecover(p,y,l))}catch(e){return Promise.reject(e)}}};exports.Secp256k1KeyPair=v=function(){function e(e){if(void 0===e&&(e={}),this.type="EcdsaSecp256k1VerificationKey2019",this.id=e.id,this.controller=e.controller,e.publicKeyBase58)this.publicKeyBuffer=n.decode(e.publicKeyBase58);else{if(!e.publicKeyJwk)throw new Error("Secp256k1KeyPair requires publicKeyBase58 or publicKeyJwk, recieved neither.");this.publicKeyBuffer=Buffer.from(g(e.publicKeyJwk),"hex")}e.privateKeyBase58&&(this.privateKeyBuffer=n.decode(e.privateKeyBase58)),e.privateKeyJwk&&(this.privateKeyBuffer=Buffer.from(b(e.privateKeyJwk),"hex")),this.controller&&!this.id&&(this.id=this.controller+"#"+this.fingerprint())}e.fingerprintFromPublicKey=function(e){var r;e.publicKeyBase58&&(r=n.decode(e.publicKeyBase58)),e.publicKeyJwk&&(r=new Uint8Array(Buffer.from(g(e.publicKeyJwk))));var t=new Uint8Array(2+r.length);return t[0]=231,t[1]=1,t.set(r,2),"z"+n.encode(t)},e.generate=function(e){void 0===e&&(e={});try{var r,t;if(e.secureRandom){var i=function(e){var r;do{r=e()}while(!o.privateKeyVerify(r));return{publicKey:o.publicKeyCreate(r),privateKey:r}}(e.secureRandom);r=i.privateKey,t=i.publicKey}if(!r)throw new Error("Cannot generate private key.");var n=k(Buffer.from(t).toString("hex")),u=P(Buffer.from(r).toString("hex")),c="did:key:"+v.fingerprintFromPublicKey({publicKeyBase58:n}),f="#"+v.fingerprintFromPublicKey({publicKeyBase58:n});return Promise.resolve(new v({id:f,controller:c,publicKeyBase58:n,privateKeyBase58:u}))}catch(e){return Promise.reject(e)}},e.from=function(e){try{var r=function(){function r(){function r(){function r(){return new v(a({},e,{privateKeyBase58:t,publicKeyBase58:i}))}var n=function(){if(e.publicKeyJwk){var r=P;return Promise.resolve(g(e.publicKeyJwk)).then((function(e){i=r.call(S,e)}))}}();return n&&n.then?n.then(r):r()}var n=function(){if(e.privateKeyJwk){var r=P;return Promise.resolve(b(e.privateKeyJwk)).then((function(e){t=r.call(S,e)}))}}();return n&&n.then?n.then(r):r()}var n=function(){if(e.publicKeyHex)return Promise.resolve(k(e.publicKeyHex)).then((function(e){i=e}))}();return n&&n.then?n.then(r):r()},t=e.privateKeyBase58,i=e.publicKeyBase58,n=function(){if(e.privateKeyHex)return Promise.resolve(P(e.privateKeyHex)).then((function(e){t=e}))}();return Promise.resolve(n&&n.then?n.then(r):r())}catch(e){return Promise.reject(e)}},e.fromFingerprint=function(e){var r=e.fingerprint,t=n.decode(r.substr(1));if(231===t[0]&&1===t[1]){var i=n.encode(t.slice(2)),o="did:key:"+v.fingerprintFromPublicKey({publicKeyBase58:i}),u="#"+v.fingerprintFromPublicKey({publicKeyBase58:i});return new v({id:u,controller:o,publicKeyBase58:i})}throw new Error("Unsupported Fingerprint Type: "+r)};var r=e.prototype;return r.publicNode=function(){return this.toKeyPair(!1)},r.signer=function(){if(!this.privateKeyBuffer)throw new Error("No private key to sign with.");var e=this.privateKeyBuffer;return{sign:function(r){var t=r.data;try{var n=i.createHash("sha256").update(t).digest(),u=o.ecdsaSign(n,new Uint8Array(e));return Promise.resolve(u.signature)}catch(e){return Promise.reject(e)}}}},r.verifier=function(){if(!this.publicKeyBuffer)throw new Error("No public key to verify with.");var e=this.publicKeyBuffer;return{verify:function(r){var t=r.data,n=r.signature;try{var u=i.createHash("sha256").update(t).digest(),c=!1;try{c=o.ecdsaVerify(n,u,new Uint8Array(e))}catch(e){console.error("An error occurred when verifying signature: ",e)}return Promise.resolve(c)}catch(e){return Promise.reject(e)}}}},r.fingerprint=function(){return v.fingerprintFromPublicKey({publicKeyBase58:n.encode(this.publicKeyBuffer)})},r.verifyFingerprint=function(e){if("string"!=typeof e||"z"!==e[0])return{error:new Error("`fingerprint` must be a multibase encoded string."),valid:!1};var r;try{r=n.decode(e.slice(1))}catch(e){return{error:e,valid:!1}}var t=this.publicKeyBuffer,i="e701"===r.slice(0,2).toString("hex")&&t.equals(r.slice(2));return i?{valid:i}:{error:new Error("The fingerprint does not match the public key."),valid:!1}},r.toJwk=function(e){if(void 0===e&&(e=!1),e){if(!this.privateKeyBuffer)throw new Error("No private key to export");return K(this.privateKeyBuffer.toString("hex"))}return m(this.publicKeyBuffer.toString("hex"))},r.toHex=function(e){void 0===e&&(e=!1);try{var r=function(e){if(t)return e;var r=g;return Promise.resolve(m(i.publicKeyBuffer.toString("hex"))).then((function(e){return r.call(S,e)}))},t=!1,i=this,n=function(){if(e){if(!i.privateKeyBuffer)throw new Error("No private key to export");t=!0;var r=b;return Promise.resolve(K(i.privateKeyBuffer.toString("hex"))).then((function(e){return r.call(S,e)}))}}();return Promise.resolve(n&&n.then?n.then(r):r(n))}catch(e){return Promise.reject(e)}},r.toKeyPair=function(e){void 0===e&&(e=!1);var r={id:this.id,type:this.type,controller:this.controller,publicKeyBase58:n.encode(this.publicKeyBuffer)};return e&&(r.privateKeyBase58=n.encode(this.privateKeyBuffer)),r},r.toJsonWebKeyPair=function(e){void 0===e&&(e=!1);var r={id:this.id,type:"JsonWebKey2020",controller:this.controller,publicKeyJwk:this.toJwk()};return delete r.publicKeyJwk.kid,e&&(r.privateKeyJwk=this.toJwk(!0),delete r.privateKeyJwk.kid),r},e}(),exports.Secp256k1KeyPair=v=c.__decorate([f.types.staticImplements()],exports.Secp256k1KeyPair);var _=f.getResolve(exports.Secp256k1KeyPair),E={__proto__:null,resolve:_,get:f.getGet(_)};exports.ES256K=J,exports.ES256KR=O,exports.driver=E,exports.keyUtils=S; ++"use strict";import i from "crypto";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var r=e(require("@trust/keyto")),t=e(require("base64url")),n=e(require("bs58")),o=e(require("secp256k1")),u=e(require("canonicalize")),c=require("tslib"),f=require("@transmute/did-key-common");function a(){return(a=Object.assign||function(e){for(var r=1;r0;)t=Buffer.concat([Buffer.from("00","hex"),t]),i--;return t},w=function(e){for(var r=g(e),t=Buffer.from(r,"hex"),i=32-t.length;i>0;)t=Buffer.concat([Buffer.from("00","hex"),t]),i--;return t},k=function(e){return n.encode(Buffer.from(e,"hex"))},P=function(e){return n.encode(Buffer.from(e,"hex"))},S={__proto__:null,getKid:h,privateKeyJwkFromPrivateKeyHex:K,publicKeyJwkFromPublicKeyHex:m,privateKeyJwkFromPrivateKeyPem:function(e){var t=a({},r.from(e,"pem").toJwk("private"),{crv:"secp256k1"});return a({},t,{kid:h(t)})},publicKeyJwkFromPublicKeyPem:function(e){var t=a({},r.from(e,"pem").toJwk("public"),{crv:"secp256k1"});return a({},t,{kid:h(t)})},privateKeyHexFromJwk:b,publicKeyHexFromJwk:g,privateKeyUInt8ArrayFromJwk:B,publicKeyUInt8ArrayFromJwk:w,publicKeyBase58FromPublicKeyHex:k,privateKeyBase58FromPrivateKeyHex:P,privateKeyUInt8ArrayFromPrivateKeyBase58:function(e){return n.decode(e)},publicKeyUInt8ArrayFromPublicKeyBase58:function(e){return n.decode(e)},publicKeyHexFromPrivateKeyHex:function(e){var r=o.publicKeyCreate(new Uint8Array(Buffer.from(e,"hex")));return Buffer.from(r).toString("hex")},publicKeyJwkFromPublicKeyBase58:function(e){return m(n.decode(e).toString("hex"))},privateKeyJwkFromPrivateKeyBase58:function(e){return K(n.decode(e).toString("hex"))}},x=function(e){var r,t;function i(r){var t;return(t=e.call(this,r)||this).name="JWSVerificationFailed",t}return t=e,(r=i).prototype=Object.create(t.prototype),r.prototype.constructor=r,r.__proto__=t,i}(d(Error)),J={__proto__:null,signDetached:function(e,r,n){void 0===n&&(n={alg:"ES256K",b64:!1,crit:["b64"]});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(e.buffer,e.byteOffset,e.length)]),f=Buffer.from(c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+".."+t.encode(Buffer.from(s.signature))}))}catch(e){return Promise.reject(e)}},verifyDetached:function(e,r,n){try{if(-1===e.indexOf(".."))throw new x("not a valid rfc7797 jws.");var u=e.split(".."),c=u[0],f=u[1],a=JSON.parse(t.decode(c));if("ES256K"!==a.alg)throw new Error("JWS alg is not signed with ES256K.");if(!1!==a.b64||!a.crit||!a.crit.length||"b64"!==a.crit[0])throw new Error("JWS Header is not in rfc7797 format (not detached).");return Promise.resolve(w(n)).then((function(e){var n=Buffer.concat([Buffer.from(c+".","utf8"),Buffer.from(r.buffer,r.byteOffset,r.length)]),u=Buffer.from(n),a=i.createHash("sha256").update(u).digest(),s=t.toBuffer(f),l=o.signatureNormalize(s);return o.ecdsaVerify(l,a,e)}))}catch(e){return Promise.reject(e)}},sign:function(e,r,n){void 0===n&&(n={alg:"ES256K"});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=t.encode(JSON.stringify(e)),f=Buffer.from(u+"."+c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+"."+c+"."+t.encode(s.signature)}))}catch(e){return Promise.reject(e)}},verify:function(e,r){try{return Promise.resolve(w(r)).then((function(r){var n=e.split("."),u=n[2],c=Buffer.from(n[0]+"."+n[1]),f=i.createHash("sha256").update(c).digest(),a=t.toBuffer(u),s=o.signatureNormalize(a);return o.ecdsaVerify(s,f,r)}))}catch(e){return Promise.reject(e)}},decode:function(e,r){void 0===r&&(r={complete:!1});var i=e.split("."),n=i[1],o=i[2];return r.complete?{header:JSON.parse(t.decode(i[0])),payload:JSON.parse(t.decode(n)),signature:o}:JSON.parse(t.decode(n))}},O={__proto__:null,sign:function(e,r,n){void 0===n&&(n={alg:"ES256K-R"});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=t.encode(JSON.stringify(e)),f=Buffer.from(u+"."+c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r);return u+"."+c+"."+t.encode(s.signature)}))}catch(e){return Promise.reject(e)}},verify:function(e,r){try{return Promise.resolve(w(r)).then((function(r){var n=e.split("."),u=n[0],c=n[1],f=n[2];if("ES256K-R"!==JSON.parse(t.decode(u)).alg)throw new Error("Expecteed header.alg to be ES256K-R");var a=Buffer.from(u+"."+c),s=i.createHash("sha256").update(a).digest(),l=t.toBuffer(f),p=o.signatureNormalize(l);return o.ecdsaVerify(p,s,r)}))}catch(e){return Promise.reject(e)}},signDetached:function(e,r,n){void 0===n&&(n={alg:"ES256K-R",b64:!1,crit:["b64"]});try{return Promise.resolve(B(r)).then((function(r){var u=t.encode(JSON.stringify(n)),c=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(e.buffer,e.byteOffset,e.length)]),f=Buffer.from(c),a=i.createHash("sha256").update(f).digest(),s=o.ecdsaSign(a,r),l=s.recid,p=Buffer.concat([Buffer.from(s.signature),Buffer.from(new Uint8Array([l]))]);return u+".."+t.encode(p)}))}catch(e){return Promise.reject(e)}},recoverPublicKey:function(e,r){try{if(-1===e.indexOf(".."))throw new Error("not a valid rfc7797 jws.");var n=e.split(".."),u=n[0],c=n[1],f=JSON.parse(t.decode(u));if("ES256K-R"!==f.alg)throw new Error("JWS alg is not signed with ES256K-R.");if(!1!==f.b64||!f.crit||!f.crit.length||"b64"!==f.crit[0])throw new Error("JWS Header is not in rfc7797 format (not detached).");var a=Buffer.concat([Buffer.from(u+".","utf8"),Buffer.from(r.buffer,r.byteOffset,r.length)]),s=Buffer.from(a),l=new Uint8Array(i.createHash("sha256").update(s).digest()),p=new Uint8Array(t.toBuffer(c)),y=p[64];return p=p.slice(0,64),Promise.resolve(o.ecdsaRecover(p,y,l))}catch(e){return Promise.reject(e)}}};exports.Secp256k1KeyPair=v=function(){function e(e){if(void 0===e&&(e={}),this.type="EcdsaSecp256k1VerificationKey2019",this.id=e.id,this.controller=e.controller,e.publicKeyBase58)this.publicKeyBuffer=n.decode(e.publicKeyBase58);else{if(!e.publicKeyJwk)throw new Error("Secp256k1KeyPair requires publicKeyBase58 or publicKeyJwk, recieved neither.");this.publicKeyBuffer=Buffer.from(g(e.publicKeyJwk),"hex")}e.privateKeyBase58&&(this.privateKeyBuffer=n.decode(e.privateKeyBase58)),e.privateKeyJwk&&(this.privateKeyBuffer=Buffer.from(b(e.privateKeyJwk),"hex")),this.controller&&!this.id&&(this.id=this.controller+"#"+this.fingerprint())}e.fingerprintFromPublicKey=function(e){var r;e.publicKeyBase58&&(r=n.decode(e.publicKeyBase58)),e.publicKeyJwk&&(r=new Uint8Array(Buffer.from(g(e.publicKeyJwk))));var t=new Uint8Array(2+r.length);return t[0]=231,t[1]=1,t.set(r,2),"z"+n.encode(t)},e.generate=function(e){void 0===e&&(e={});try{var r,t;if(e.secureRandom){var i=function(e){var r;do{r=e()}while(!o.privateKeyVerify(r));return{publicKey:o.publicKeyCreate(r),privateKey:r}}(e.secureRandom);r=i.privateKey,t=i.publicKey}if(!r)throw new Error("Cannot generate private key.");var n=k(Buffer.from(t).toString("hex")),u=P(Buffer.from(r).toString("hex")),c="did:key:"+v.fingerprintFromPublicKey({publicKeyBase58:n}),f="#"+v.fingerprintFromPublicKey({publicKeyBase58:n});return Promise.resolve(new v({id:f,controller:c,publicKeyBase58:n,privateKeyBase58:u}))}catch(e){return Promise.reject(e)}},e.from=function(e){try{var r=function(){function r(){function r(){function r(){return new v(a({},e,{privateKeyBase58:t,publicKeyBase58:i}))}var n=function(){if(e.publicKeyJwk){var r=P;return Promise.resolve(g(e.publicKeyJwk)).then((function(e){i=r.call(S,e)}))}}();return n&&n.then?n.then(r):r()}var n=function(){if(e.privateKeyJwk){var r=P;return Promise.resolve(b(e.privateKeyJwk)).then((function(e){t=r.call(S,e)}))}}();return n&&n.then?n.then(r):r()}var n=function(){if(e.publicKeyHex)return Promise.resolve(k(e.publicKeyHex)).then((function(e){i=e}))}();return n&&n.then?n.then(r):r()},t=e.privateKeyBase58,i=e.publicKeyBase58,n=function(){if(e.privateKeyHex)return Promise.resolve(P(e.privateKeyHex)).then((function(e){t=e}))}();return Promise.resolve(n&&n.then?n.then(r):r())}catch(e){return Promise.reject(e)}},e.fromFingerprint=function(e){var r=e.fingerprint,t=n.decode(r.substr(1));if(231===t[0]&&1===t[1]){var i=n.encode(t.slice(2)),o="did:key:"+v.fingerprintFromPublicKey({publicKeyBase58:i}),u="#"+v.fingerprintFromPublicKey({publicKeyBase58:i});return new v({id:u,controller:o,publicKeyBase58:i})}throw new Error("Unsupported Fingerprint Type: "+r)};var r=e.prototype;return r.publicNode=function(){return this.toKeyPair(!1)},r.signer=function(){if(!this.privateKeyBuffer)throw new Error("No private key to sign with.");var e=this.privateKeyBuffer;return{sign:function(r){var t=r.data;try{var n=i.createHash("sha256").update(t).digest(),u=o.ecdsaSign(n,new Uint8Array(e));return Promise.resolve(u.signature)}catch(e){return Promise.reject(e)}}}},r.verifier=function(){if(!this.publicKeyBuffer)throw new Error("No public key to verify with.");var e=this.publicKeyBuffer;return{verify:function(r){var t=r.data,n=r.signature;try{var u=i.createHash("sha256").update(t).digest(),c=!1;try{c=o.ecdsaVerify(n,u,new Uint8Array(e))}catch(e){console.error("An error occurred when verifying signature: ",e)}return Promise.resolve(c)}catch(e){return Promise.reject(e)}}}},r.fingerprint=function(){return v.fingerprintFromPublicKey({publicKeyBase58:n.encode(this.publicKeyBuffer)})},r.verifyFingerprint=function(e){if("string"!=typeof e||"z"!==e[0])return{error:new Error("`fingerprint` must be a multibase encoded string."),valid:!1};var r;try{r=n.decode(e.slice(1))}catch(e){return{error:e,valid:!1}}var t=this.publicKeyBuffer,i="e701"===r.slice(0,2).toString("hex")&&t.equals(r.slice(2));return i?{valid:i}:{error:new Error("The fingerprint does not match the public key."),valid:!1}},r.toJwk=function(e){if(void 0===e&&(e=!1),e){if(!this.privateKeyBuffer)throw new Error("No private key to export");return K(this.privateKeyBuffer.toString("hex"))}return m(this.publicKeyBuffer.toString("hex"))},r.toHex=function(e){void 0===e&&(e=!1);try{var r=function(e){if(t)return e;var r=g;return Promise.resolve(m(i.publicKeyBuffer.toString("hex"))).then((function(e){return r.call(S,e)}))},t=!1,i=this,n=function(){if(e){if(!i.privateKeyBuffer)throw new Error("No private key to export");t=!0;var r=b;return Promise.resolve(K(i.privateKeyBuffer.toString("hex"))).then((function(e){return r.call(S,e)}))}}();return Promise.resolve(n&&n.then?n.then(r):r(n))}catch(e){return Promise.reject(e)}},r.toKeyPair=function(e){void 0===e&&(e=!1);var r={id:this.id,type:this.type,controller:this.controller,publicKeyBase58:n.encode(this.publicKeyBuffer)};return e&&(r.privateKeyBase58=n.encode(this.privateKeyBuffer)),r},r.toJsonWebKeyPair=function(e){void 0===e&&(e=!1);var r={id:this.id,type:"JsonWebKey2020",controller:this.controller,publicKeyJwk:this.toJwk()};return delete r.publicKeyJwk.kid,e&&(r.privateKeyJwk=this.toJwk(!0),delete r.privateKeyJwk.kid),r},e}(),exports.Secp256k1KeyPair=v=c.__decorate([f.types.staticImplements()],exports.Secp256k1KeyPair);var _=f.getResolve(exports.Secp256k1KeyPair),E={__proto__:null,resolve:_,get:f.getGet(_)};exports.ES256K=J,exports.ES256KR=O,exports.driver=E,exports.keyUtils=S; + //# sourceMappingURL=did-key-secp256k1.cjs.production.min.js.map +diff --git a/node_modules/@transmute/did-key-secp256k1/dist/index.js b/node_modules/@transmute/did-key-secp256k1/dist/index.js +index 87291cd..5135704 100644 +--- a/node_modules/@transmute/did-key-secp256k1/dist/index.js ++++ b/node_modules/@transmute/did-key-secp256k1/dist/index.js +@@ -1,7 +1,7 @@ + + 'use strict' + +-if (process.env.NODE_ENV === 'production') { ++if (true) { + module.exports = require('./did-key-secp256k1.cjs.production.min.js') + } else { + module.exports = require('./did-key-secp256k1.cjs.development.js') diff --git a/patches/@transmute+did-key-web-crypto+0.2.1-unstable.42.patch b/patches/@transmute+did-key-web-crypto+0.2.1-unstable.42.patch new file mode 100644 index 000000000..adc3b7d42 --- /dev/null +++ b/patches/@transmute+did-key-web-crypto+0.2.1-unstable.42.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@transmute/did-key-web-crypto/dist/index.js b/node_modules/@transmute/did-key-web-crypto/dist/index.js +index a7cfb6a..de5f829 100644 +--- a/node_modules/@transmute/did-key-web-crypto/dist/index.js ++++ b/node_modules/@transmute/did-key-web-crypto/dist/index.js +@@ -1,7 +1,7 @@ + + 'use strict' + +-if (process.env.NODE_ENV === 'production') { ++if (true) { + module.exports = require('./did-key-web-crypto.cjs.production.min.js') + } else { + module.exports = require('./did-key-web-crypto.cjs.development.js') diff --git a/patches/@transmute+did-key-x25519+0.2.1-unstable.42.patch b/patches/@transmute+did-key-x25519+0.2.1-unstable.42.patch new file mode 100644 index 000000000..9d74b5a1d --- /dev/null +++ b/patches/@transmute+did-key-x25519+0.2.1-unstable.42.patch @@ -0,0 +1,34 @@ +diff --git a/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.development.js b/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.development.js +index b886f1d..141306e 100644 +--- a/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.development.js ++++ b/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.development.js +@@ -6,7 +6,7 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau + + var bs58 = _interopDefault(require('bs58')); + var base64url = _interopDefault(require('base64url')); +-var crypto = _interopDefault(require('crypto')); ++import crypto from 'crypto'; + var canonicalize = _interopDefault(require('canonicalize')); + var tslib = require('tslib'); + var ed25519 = require('@stablelib/ed25519'); +diff --git a/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.production.min.js b/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.production.min.js +index 81e0e96..41e24c5 100644 +--- a/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.production.min.js ++++ b/node_modules/@transmute/did-key-x25519/dist/did-key-x25519.cjs.production.min.js +@@ -1,2 +1,2 @@ +-"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var r=e(require("bs58")),t=e(require("base64url")),i=e(require("crypto")),n=e(require("canonicalize")),o=require("tslib"),c=require("@stablelib/ed25519"),u=require("@stablelib/x25519"),a=require("@transmute/did-key-common"),y=require("@transmute/did-key-cipher");function s(){return(s=Object.assign||function(e){for(var r=1;r */ + /* eslint-disable node/no-deprecated-api */ +-var buffer = require('buffer') ++import buffer from 'node:buffer'; + var Buffer = buffer.Buffer + + // alternative to using Object.keys for old browsers diff --git a/patches/safer-buffer+2.1.2.patch b/patches/safer-buffer+2.1.2.patch new file mode 100644 index 000000000..3fe41cae1 --- /dev/null +++ b/patches/safer-buffer+2.1.2.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/safer-buffer/safer.js b/node_modules/safer-buffer/safer.js +index 37c7e1a..c2a303b 100644 +--- a/node_modules/safer-buffer/safer.js ++++ b/node_modules/safer-buffer/safer.js +@@ -2,7 +2,7 @@ + + 'use strict' + +-var buffer = require('buffer') ++import buffer from 'node:buffer' + var Buffer = buffer.Buffer + + var safer = {} diff --git a/patches/sha256+0.2.0.patch b/patches/sha256+0.2.0.patch new file mode 100644 index 000000000..5fc427f06 --- /dev/null +++ b/patches/sha256+0.2.0.patch @@ -0,0 +1,10 @@ +diff --git a/node_modules/sha256/lib/nodecrypto.js b/node_modules/sha256/lib/nodecrypto.js +index 1929ad2..7ca127a 100644 +--- a/node_modules/sha256/lib/nodecrypto.js ++++ b/node_modules/sha256/lib/nodecrypto.js +@@ -1,4 +1,4 @@ +-var crypto = require('crypto'); ++import crypto from 'node:crypto'; + + // Node.js has its own Crypto function that can handle this natively + var sha256 = module.exports = function(message, options) { From efbdce380bad0542128eb2efea88c630aaf9130e Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 15:50:30 +0530 Subject: [PATCH 13/87] Added node module specifiers to node std pakage for it to work in deno --- executor/src/core/Ad4mCore.ts | 3 +- executor/src/core/Config.ts | 4 +- executor/src/core/EntanglementProof.ts | 4 +- executor/src/core/LanguageController.ts | 4 +- executor/src/core/PerspectivesController.ts | 4 +- executor/src/core/PrologInstance.ts | 5 +- executor/src/core/RuntimeService.ts | 4 +- executor/src/core/agent/AgentService.ts | 4 +- executor/src/core/db.ts | 4 +- .../Holochain/HolochainService.ts | 4 +- executor/src/deno.ts | 54 +++++++++++++++++-- executor/src/main.ts | 2 +- 12 files changed, 71 insertions(+), 25 deletions(-) diff --git a/executor/src/core/Ad4mCore.ts b/executor/src/core/Ad4mCore.ts index d31c6882a..f3beb4db4 100644 --- a/executor/src/core/Ad4mCore.ts +++ b/executor/src/core/Ad4mCore.ts @@ -13,12 +13,11 @@ import type { DIDResolver } from './agent/DIDs' import Signatures from './agent/Signatures' import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' import EntanglementProofController from './EntanglementProof' -import fs from 'fs' +import fs from 'node:fs' import { AgentInfoResponse } from '@holochain/client' import RuntimeService from './RuntimeService' import { v4 as uuidv4 } from 'uuid'; import { MainConfig } from './Config' -import path from "path"; import { getPubSub, sleep } from "./utils"; export interface InitServicesParams { diff --git a/executor/src/core/Config.ts b/executor/src/core/Config.ts index b944a207a..11e29622f 100644 --- a/executor/src/core/Config.ts +++ b/executor/src/core/Config.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import * as fs from 'fs'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; import { Address, Expression } from '@perspect3vism/ad4m'; export let ad4mExecutorVersion = "0.6.1-prerelease"; diff --git a/executor/src/core/EntanglementProof.ts b/executor/src/core/EntanglementProof.ts index 4f8766997..20f13ef91 100644 --- a/executor/src/core/EntanglementProof.ts +++ b/executor/src/core/EntanglementProof.ts @@ -1,5 +1,5 @@ -import path from "path"; -import fs from "fs"; +import path from "node:path"; +import fs from "node:fs"; import AgentService from "./agent/AgentService"; import { EntanglementProof } from '@perspect3vism/ad4m'; diff --git a/executor/src/core/LanguageController.ts b/executor/src/core/LanguageController.ts index 06d61e7c8..715b1fa9e 100644 --- a/executor/src/core/LanguageController.ts +++ b/executor/src/core/LanguageController.ts @@ -5,8 +5,8 @@ import { } from '@perspect3vism/ad4m'; import { ExpressionRef, LanguageRef, LanguageExpression, LanguageLanguageInput, ExceptionType, PerspectiveDiff } from '@perspect3vism/ad4m'; import { ExceptionInfo } from '@perspect3vism/ad4m/lib/src/runtime/RuntimeResolver'; -import fs from 'fs' -import path from 'path' +import fs from 'node:fs' +import path from 'node:path' import * as Config from './Config' import type HolochainService from './storage-services/Holochain/HolochainService'; import type AgentService from './agent/AgentService' diff --git a/executor/src/core/PerspectivesController.ts b/executor/src/core/PerspectivesController.ts index 7663be8ad..dfe2e08af 100644 --- a/executor/src/core/PerspectivesController.ts +++ b/executor/src/core/PerspectivesController.ts @@ -1,5 +1,5 @@ -import path from 'path' -import fs from 'fs' +import path from 'node:path' +import fs from 'node:fs' import { v4 as uuidv4 } from 'uuid'; import * as PubSubDefinitions from './graphQL-interface/SubscriptionDefinitions' import type PerspectiveContext from './PerspectiveContext' diff --git a/executor/src/core/PrologInstance.ts b/executor/src/core/PrologInstance.ts index d5dbf1995..f0d255f36 100644 --- a/executor/src/core/PrologInstance.ts +++ b/executor/src/core/PrologInstance.ts @@ -1,5 +1,6 @@ import Perspective from "./Perspective"; -import { randomUUID } from "crypto"; +import crypto from 'node:crypto'; + export default class PrologInstance { //@ts-ignore @@ -7,7 +8,7 @@ export default class PrologInstance { name: string; constructor(perspective: Perspective) { - this.name = perspective.uuid || randomUUID() + this.name = perspective.uuid || crypto.randomUUID() } async start() { diff --git a/executor/src/core/RuntimeService.ts b/executor/src/core/RuntimeService.ts index 776fb0e56..c50b4274c 100644 --- a/executor/src/core/RuntimeService.ts +++ b/executor/src/core/RuntimeService.ts @@ -1,5 +1,5 @@ -import * as path from 'path'; -import * as fs from 'fs'; +import * as path from 'node:path'; +import * as fs from 'node:fs'; import { PerspectiveExpression } from '@perspect3vism/ad4m'; import { MainConfig } from './Config'; diff --git a/executor/src/core/agent/AgentService.ts b/executor/src/core/agent/AgentService.ts index ff6527b44..fee3b79cf 100644 --- a/executor/src/core/agent/AgentService.ts +++ b/executor/src/core/agent/AgentService.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import * as fs from "fs"; +import * as path from "node:path"; +import * as fs from "node:fs"; import { Key } from "../../wallet_extension"; import { Language, diff --git a/executor/src/core/db.ts b/executor/src/core/db.ts index 91f198b23..878e45251 100644 --- a/executor/src/core/db.ts +++ b/executor/src/core/db.ts @@ -1,6 +1,6 @@ import { Database } from 'aloedb-node' -import path from 'path' -import fs from 'fs'; +import path from 'node:path' +import fs from 'node:fs'; import type { Expression, LinkExpression, LinkStatus, PerspectiveDiff } from "@perspect3vism/ad4m"; interface LinkSchema { diff --git a/executor/src/core/storage-services/Holochain/HolochainService.ts b/executor/src/core/storage-services/Holochain/HolochainService.ts index c38b9dbcb..1165564de 100644 --- a/executor/src/core/storage-services/Holochain/HolochainService.ts +++ b/executor/src/core/storage-services/Holochain/HolochainService.ts @@ -1,6 +1,6 @@ import { AppSignalCb, AppSignal, CellId, CellType, AgentInfoResponse, InstallAppRequest, EncodedAppSignal } from '@holochain/client' -import path from 'path' -import fs from 'fs' +import path from 'node:path' +import fs from 'node:fs' import HolochainLanguageDelegate from "./HolochainLanguageDelegate" import type { Dna } from '@perspect3vism/ad4m' import { AsyncQueue } from './Queue' diff --git a/executor/src/deno.ts b/executor/src/deno.ts index f4c4dc20b..6999b7ba7 100644 --- a/executor/src/deno.ts +++ b/executor/src/deno.ts @@ -1,5 +1,51 @@ -import "https://deno.land/std@0.177.0/node/util.ts"; -import "https://deno.land/std@0.177.0/node/global.ts"; +import "node:util"; +// import "https://deno.land/std@0.177.0/node/global.ts"; + +import processModule from "node:process"; +// import { Buffer as bufferModule } from "node:process"; +import timers from "node:timers"; +import {Buffer as BufferModule} from 'node:buffer'; + +Object.defineProperty(globalThis, "global", { + value: globalThis, + writable: false, + enumerable: false, + configurable: true, +}); + +Object.defineProperty(globalThis, "process", { + value: { + ...processModule, + env: { + NODE_ENV: "production" + } + }, + enumerable: false, + writable: true, + configurable: true, +}); + +Object.defineProperty(globalThis, "Buffer", { + value: BufferModule, + enumerable: false, + writable: true, + configurable: true, +}); + +Object.defineProperty(globalThis, "setImmediate", { + value: timers.setImmediate, + enumerable: true, + writable: true, + configurable: true, +}); + +Object.defineProperty(globalThis, "clearImmediate", { + value: timers.clearImmediate, + enumerable: true, + writable: true, + configurable: true, +}); + const process = globalThis.process; const Buffer = globalThis.Buffer; @@ -11,8 +57,8 @@ globalThis.__dirname = __dirname; globalThis.__filename = __filename; import { init as internalInit } from "./main.ts" -import * as internalPath from "https://deno.land/std@0.177.0/node/path.ts"; -import * as internalOs from "https://deno.land/std@0.177.0/node/os.ts" +import * as internalPath from "node:path"; +import * as internalOs from "node:os" export const init = internalInit export const path = internalPath diff --git a/executor/src/main.ts b/executor/src/main.ts index 0470bea96..e94634d2c 100644 --- a/executor/src/main.ts +++ b/executor/src/main.ts @@ -6,7 +6,7 @@ import { LanguageAlias, CoreConfig, BootstrapFixtures, languageLanguageAlias, ag // is missing on some machines... import getOwnPropertyDescriptor from './shims/getOwnPropertyDescriptor' import getPort from 'get-port'; -import fs from "fs"; +import fs from "node:fs"; import { createResolvers } from "./core/graphQL-interface/GraphQL"; Reflect.getOwnPropertyDescriptor = getOwnPropertyDescriptor From 8b85a0fd553495ab0ea413497b35bafea448e906 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 15:50:56 +0530 Subject: [PATCH 14/87] esbuild script updated --- executor/esbuild.ts | 124 ++++++++++++++++++++++---------------------- 1 file changed, 63 insertions(+), 61 deletions(-) diff --git a/executor/esbuild.ts b/executor/esbuild.ts index 461e8d95f..7848ed982 100644 --- a/executor/esbuild.ts +++ b/executor/esbuild.ts @@ -1,24 +1,26 @@ import * as esbuild from "https://deno.land/x/esbuild@v0.18.2/mod.js"; -import * as path from "https://deno.land/std@0.177.0/path/mod.ts"; +import fs from "node:fs" import { loadSource, resolveUrl } from "./customHttpDownloader.js"; function denoAlias(nodeModule) { return { name: `${nodeModule}-alias`, setup(build) { - build.onResolve({ filter: new RegExp(`^${nodeModule}$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/${nodeModule}.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^node:${nodeModule}$`) }, (args) => { + console.log('meow 1111', args) + return { path: nodeModule, namespace: 'imports' }; }); - - build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) - - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) - }) }, } } +const nodePackages = [ + 'path', 'fs', 'net', 'dns', 'cluster', 'https', + 'dgram', 'os', 'tls', 'http', 'url', 'util', 'stream', 'events', 'tty', + 'zlib', 'assert', 'buffer', 'constants', 'querystring', 'string_decoder', + 'global', 'process', +]; + const result = await esbuild.build({ entryPoints: ['src/deno.ts'], outfile: 'lib/bundle.js', @@ -30,20 +32,6 @@ const result = await esbuild.build({ charset: 'ascii', legalComments: 'inline', plugins: [ - { - name: `node:net`, - setup(build) { - build.onResolve({ filter: new RegExp(`^node:net$`) }, (args) => { - return { path: path.resolve(`deno_std-0.177.0/node/net.ts`), external: false }; - }); - }, - }, - ...[ - 'crypto', 'path', 'fs', 'net', 'dns', 'cluster', 'https', - 'dgram', 'os', 'tls', 'http', 'url', 'util', 'stream', 'events', 'tty', - 'zlib', 'assert', 'buffer', 'constants', 'querystring', 'string_decoder', - 'global', 'process', - ].map(denoAlias), { name: `dns-promisis-alias`, setup(build) { @@ -51,32 +39,36 @@ const result = await esbuild.build({ return { path: `https://deno.land/std@0.177.0/node/dns.ts`, external: true }; }); + build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) + build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) + const packageName = args.path.slice('node:'.length); + if(!nodePackages.includes(packageName)) { + return loadSource(args) + } }) }, }, { - name: `child_process`, + name: `fs-promisis-alias`, setup(build) { - build.onResolve({ filter: new RegExp(`^child_process$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/child_process.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^fs/promises$`) }, (args) => { + return { path: `https://deno.land/std@0.177.0/node/fs.ts`, external: true }; }); - - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) - }) }, }, { - name: `fs-promisis-alias`, + name: `crypto-promisis-alias`, setup(build) { - build.onResolve({ filter: new RegExp(`^fs/promises$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/fs.ts`, external: true }; + build.onResolve({ filter: new RegExp(`^crypto$`) }, (args) => { + return { path: `node:crypto`, external: true, namespace: "imports" }; }); - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) + build.onResolve({filter: new RegExp(`https://deno.land/std@0.203.0/crypto/crypto.ts`), namespace: 'imports'}, resolveUrl) + + build.onLoad({filter: new RegExp(`https://deno.land/std@0.203.0/crypto/crypto.ts`), namespace: 'file'}, (args) => { + console.log('wow 1', args) + return loadSource({path: 'https://deno.land/std@0.203.0/crypto/crypto.ts'}) }) }, }, @@ -86,10 +78,6 @@ const result = await esbuild.build({ build.onResolve({ filter: new RegExp(`^ws$`) }, (args) => { return { path: `https://deno.land/x/websocket@v0.1.4/mod.ts`, namespace: 'imports' }; }); - - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) - }) }, }, { @@ -100,7 +88,10 @@ const result = await esbuild.build({ }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) + const packageName = args.path.slice('node:'.length); + if(!nodePackages.includes(packageName)) { + return loadSource(args) + } }) }, }, @@ -110,17 +101,21 @@ const result = await esbuild.build({ build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.150.0/media_types/mod.ts$`) }, (args) => { return { path: `https://deno.land/std@0.177.0/media_types/mod.ts`, external: true }; }); - - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) - }) }, }, { - name: "https://deno.land/std@0.177.0/node/util.ts", + name: "https://deno.land/x/xhr@0.3.0/mod.ts", setup(build) { - build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.177.0/node/util.ts$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/util.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^https://deno.land/x/xhr@0.3.0/mod.ts$`) }, (args) => { + return { path: `https://deno.land/x/xhr@0.3.0/mod.ts`, namespace: 'imports' }; + }); + }, + }, + { + name: "https://deno.land/std@0.177.0/node/global.ts", + setup(build) { + build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.177.0/node/global.ts$`) }, (args) => { + return { path: `https://deno.land/std@0.177.0/node/global.ts`, namespace: 'imports' }; }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { @@ -129,10 +124,10 @@ const result = await esbuild.build({ }, }, { - name: "https://deno.land/std@0.177.0/node/os.ts", + name: "https://deno.land/std@0.203.0/crypto/crypto.ts", setup(build) { - build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.177.0/node/os.ts$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/os.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.203.0/crypto/crypto.ts$`) }, (args) => { + return { path: `https://deno.land/std@0.203.0/crypto/crypto.ts`, namespace: 'imports' }; }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { @@ -141,10 +136,10 @@ const result = await esbuild.build({ }, }, { - name: "https://deno.land/std@0.177.0/node/global.ts", + name: "https://deno.land/x/getport/mod.ts", setup(build) { - build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.177.0/node/global.ts$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/global.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^https://deno.land/x/getport/mod.ts$`) }, (args) => { + return { path: `https://deno.land/x/getport/mod.ts`, namespace: 'imports' }; }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { @@ -153,10 +148,10 @@ const result = await esbuild.build({ }, }, { - name: "https://deno.land/std@0.177.0/node/path.ts", + name: "https://deno.land/std@0.203.0/path/mod.ts", setup(build) { - build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.177.0/node/path.ts$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/path.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.203.0/path/mod.ts$`) }, (args) => { + return { path: `https://deno.land/std@0.203.0/path/mod.ts`, namespace: 'imports' }; }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { @@ -165,10 +160,10 @@ const result = await esbuild.build({ }, }, { - name: "https://deno.land/x/xhr@0.3.0/mod.ts", + name: "https://deno.land/std@0.203.0/fs/mod.ts", setup(build) { - build.onResolve({ filter: new RegExp(`^https://deno.land/x/xhr@0.3.0/mod.ts$`) }, (args) => { - return { path: `https://deno.land/x/xhr@0.3.0/mod.ts`, namespace: 'imports' }; + build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.203.0/fs/mod.ts$`) }, (args) => { + return { path: `https://deno.land/std@0.203.0/fs/mod.ts`, namespace: 'imports' }; }); build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { @@ -176,8 +171,15 @@ const result = await esbuild.build({ }) }, }, + { + name: "https://deno.land/std@0.195.0/path/mod.ts", + setup(build) { + build.onResolve({ filter: new RegExp(`^https://deno.land/std@0.195.0/path/mod.ts$`) }, (args) => { + return { path: `https://deno.land/std@0.195.0/path/mod.ts`, namespace: 'imports' }; + }); + }, + }, ], }); -console.log(result.outputFiles); esbuild.stop(); \ No newline at end of file From 5f3012ae8f83d13db2239ebb29360ff09ebf881a Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 5 Oct 2023 16:12:26 +0530 Subject: [PATCH 15/87] removed unused patch --- patches/@achingbrain+ssdp+4.0.4.patch | 21 ---- ...0.patch => @holochain+client+0.12.5.patch} | 4 +- patches/ipfs-utils+9.0.7.patch | 114 ------------------ 3 files changed, 2 insertions(+), 137 deletions(-) delete mode 100644 patches/@achingbrain+ssdp+4.0.4.patch rename patches/{@holochain+client+0.12.0.patch => @holochain+client+0.12.5.patch} (91%) delete mode 100644 patches/ipfs-utils+9.0.7.patch diff --git a/patches/@achingbrain+ssdp+4.0.4.patch b/patches/@achingbrain+ssdp+4.0.4.patch deleted file mode 100644 index 76f8d5feb..000000000 --- a/patches/@achingbrain+ssdp+4.0.4.patch +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/node_modules/@achingbrain/ssdp/dist/src/default-ssdp-options.js b/node_modules/@achingbrain/ssdp/dist/src/default-ssdp-options.js -index 41ac65e..8c63670 100644 ---- a/node_modules/@achingbrain/ssdp/dist/src/default-ssdp-options.js -+++ b/node_modules/@achingbrain/ssdp/dist/src/default-ssdp-options.js -@@ -1,9 +1,13 @@ - import { webcrypto as crypto } from 'crypto'; // remove when having crypto global --import { createRequire } from 'module'; -+// import { createRequire } from 'module'; - import mergeOptions from 'merge-options'; - import { defaultSocketOptions } from './default-socket-options.js'; --const req = createRequire(import.meta.url); --const { name, version } = req('../../package.json'); -+// const req = createRequire(import.meta.url); -+// const { name, version } = req('../../package.json'); -+const {name, version} = { -+ name: "@achingbrain/ssdp", -+ version: "4.0.1" -+}; - const DEFAULT_SSDP_SIGNATURE = `node.js/${process.version.substring(1)} UPnP/1.1 ${name}/${version}`; - export function defaultSsdpOptions(options) { - return mergeOptions(options ?? {}, { diff --git a/patches/@holochain+client+0.12.0.patch b/patches/@holochain+client+0.12.5.patch similarity index 91% rename from patches/@holochain+client+0.12.0.patch rename to patches/@holochain+client+0.12.5.patch index 598f6864a..fb0cfca3c 100644 --- a/patches/@holochain+client+0.12.0.patch +++ b/patches/@holochain+client+0.12.5.patch @@ -1,11 +1,11 @@ diff --git a/node_modules/@holochain/client/lib/api/zome-call-signing.js b/node_modules/@holochain/client/lib/api/zome-call-signing.js -index aaddf61..257781f 100644 +index aaddf61..fa20172 100644 --- a/node_modules/@holochain/client/lib/api/zome-call-signing.js +++ b/node_modules/@holochain/client/lib/api/zome-call-signing.js @@ -1,5 +1,7 @@ import nacl from "tweetnacl"; import { encodeHashToBase64 } from "../utils/base64.js"; -+import crypto from 'crypto'; ++import crypto from 'node:crypto'; + const signingCredentials = new Map(); /** diff --git a/patches/ipfs-utils+9.0.7.patch b/patches/ipfs-utils+9.0.7.patch deleted file mode 100644 index ed4198b46..000000000 --- a/patches/ipfs-utils+9.0.7.patch +++ /dev/null @@ -1,114 +0,0 @@ -diff --git a/node_modules/ipfs-utils/src/http/fetch.js b/node_modules/ipfs-utils/src/http/fetch.js -index 1a27129..b90b657 100644 ---- a/node_modules/ipfs-utils/src/http/fetch.js -+++ b/node_modules/ipfs-utils/src/http/fetch.js -@@ -1,22 +1,96 @@ - 'use strict' -+const { Request, Response, Headers, default: nativeFetch } = require('../fetch') -+// @ts-ignore -+const toStream = require('it-to-stream') -+const { Buffer } = require('buffer') -+/** -+ * @typedef {import('stream').Readable} NodeReadableStream -+ * -+ * @typedef {import('../types').FetchOptions} FetchOptions -+ * @typedef {import('../types').ProgressFn} ProgressFn -+ */ -+ -+/** -+ * @param {string|Request} url -+ * @param {FetchOptions} [options] -+ * @returns {Promise} -+ */ -+const fetch = (url, options = {}) => -+ // @ts-ignore -+ nativeFetch(url, withUploadProgress(options)) - - /** -- * @typedef {object} fetchImpl -- * @property {globalThis.fetch} fetchImpl.fetch -- * @property {globalThis.Request} fetchImpl.Request -- * @property {globalThis.Response} fetchImpl.Response -- * @property {globalThis.Headers} fetchImpl.Headers -+ * Takes fetch options and wraps request body to track upload progress if -+ * `onUploadProgress` is supplied. Otherwise returns options as is. -+ * -+ * @param {FetchOptions} options -+ * @returns {FetchOptions} - */ -+const withUploadProgress = (options) => { -+ const { onUploadProgress, body } = options -+ if (onUploadProgress && body) { -+ // This works around the fact that electron-fetch serializes `Uint8Array`s -+ // and `ArrayBuffer`s to strings. -+ const content = normalizeBody(body) - --let implName = './fetch.node' -+ // @ts-expect-error this is node-fetch -+ const rsp = new Response(content) -+ // @ts-expect-error this is node-fetch -+ const source = iterateBodyWithProgress(/** @type {NodeReadableStream} */(rsp.body), onUploadProgress) -+ return { -+ ...options, -+ body: toStream.readable(source) -+ } -+ } else { -+ return options -+ } -+} - --if (typeof XMLHttpRequest === 'function') { -- // Electron has `XMLHttpRequest` and should get the browser implementation -- // instead of node. -- implName = './fetch.browser' -+/** -+ * @param {BodyInit | NodeReadableStream} input -+ */ -+const normalizeBody = (input) => { -+ if (input instanceof ArrayBuffer) { -+ return Buffer.from(input) -+ } else if (ArrayBuffer.isView(input)) { -+ return Buffer.from(input.buffer, input.byteOffset, input.byteLength) -+ } else if (typeof input === 'string') { -+ return Buffer.from(input) -+ } -+ return input - } - --/** @type {fetchImpl} */ --const fetch = require(implName) -+/** -+ * Takes body from native-fetch response as body and `onUploadProgress` handler -+ * and returns async iterable that emits body chunks and emits -+ * `onUploadProgress`. -+ * -+ * @param {NodeReadableStream | null} body -+ * @param {ProgressFn} onUploadProgress -+ * @returns {AsyncIterable} -+ */ -+const iterateBodyWithProgress = async function * (body, onUploadProgress) { -+ if (body == null) { -+ onUploadProgress({ total: 0, loaded: 0, lengthComputable: true }) -+ } else if (Buffer.isBuffer(body)) { -+ const total = body.byteLength -+ const lengthComputable = true -+ yield body -+ onUploadProgress({ total, loaded: total, lengthComputable }) -+ } else { -+ const total = 0 -+ const lengthComputable = false -+ let loaded = 0 -+ for await (const chunk of body) { -+ loaded += chunk.byteLength -+ yield chunk -+ onUploadProgress({ total, loaded, lengthComputable }) -+ } -+ } -+} - --module.exports = fetch -+module.exports = { -+ fetch, -+ Request, -+ Headers -+} From 4abb84e411c7f0ae9b0b00c1d1055269d21e93e1 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 6 Oct 2023 10:56:30 +0100 Subject: [PATCH 16/87] add the rest of socket-signaling logic --- .../zomes/perspective_diff_sync/src/lib.rs | 8 ++ .../src/link_adapter/commit.rs | 18 ++-- .../src/link_adapter/pull.rs | 2 +- bootstrap-languages/p-diff-sync/index.ts | 5 +- .../p-diff-sync/linksAdapter.ts | 98 ++++++++++++++----- rust-executor/src/mainnet_seed.json | 2 +- tests/js/scripts/build-test-language.sh | 12 +-- 7 files changed, 105 insertions(+), 40 deletions(-) diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs index 6de269c05..e837a592b 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs @@ -101,6 +101,7 @@ fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { //Check if its a normal diff expression signal match HashBroadcast::try_from(signal.clone()) { Ok(broadcast) => { + debug!("Received broadcast: {:?} in HOLOCHAIN", broadcast); link_adapter::pull::handle_broadcast::(broadcast) .map_err(|err| utils::err(&format!("{}", err)))?; } @@ -114,6 +115,13 @@ fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { Ok(()) } +#[hdk_extern] +pub fn handle_broadcast(broadcast: HashBroadcast) -> ExternResult<()> { + link_adapter::pull::handle_broadcast::(broadcast) + .map_err(|err| utils::err(&format!("{}", err)))?; + Ok(()) +} + // Telepresence implementation #[hdk_extern] diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs index cd840c52f..6dd6f9392 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -88,15 +88,15 @@ pub fn commit( ); update_current_revision::(diff_entry_reference.clone(), now)?; - if *ENABLE_SIGNALS { - // let signal_data = PerspectiveDiffReference { - // diff, - // reference: diff_entry_ref_entry, - // reference_hash: diff_entry_reference.clone(), - // }; - // send_revision_signal(signal_data)?; - broadcast_current::()?; - }; + // if *ENABLE_SIGNALS { + // // let signal_data = PerspectiveDiffReference { + // // diff, + // // reference: diff_entry_ref_entry, + // // reference_hash: diff_entry_reference.clone(), + // // }; + // // send_revision_signal(signal_data)?; + // broadcast_current::()?; + // }; let after_fn_end = get_now()?.time(); debug!( diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs index 5897c3435..9059b9b32 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs @@ -232,7 +232,7 @@ pub fn handle_broadcast( emit_signal(broadcast.diff.clone())?; }; }; - emit_signal(broadcast)?; + //emit_signal(broadcast)?; // let fn_end = get_now()?.time(); // debug!("===PerspectiveDiffSync.fast_forward_signal() - Profiling: Took: {} to complete fast_forward_signal() function", (fn_end - fn_start).num_milliseconds()); Ok(()) diff --git a/bootstrap-languages/p-diff-sync/index.ts b/bootstrap-languages/p-diff-sync/index.ts index 1f57856ad..92625a1d5 100644 --- a/bootstrap-languages/p-diff-sync/index.ts +++ b/bootstrap-languages/p-diff-sync/index.ts @@ -10,11 +10,14 @@ function interactions(expression: Address): Interaction[] { //!@ad4m-template-variable const name = "perspective-diff-sync"; +//!@ad4m-template-variable +const uid = "perspective-diff-sync-uuid"; + export default async function create(context: LanguageContext): Promise { const Holochain = context.Holochain as HolochainLanguageDelegate; const agent = context.agent as AgentService; - const linksAdapter = new LinkAdapter(context); + const linksAdapter = new LinkAdapter(context, uid); const telepresenceAdapter = new TelepresenceAdapterImplementation(context); await Holochain.registerDNAs( diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index 0d7875681..db7c5ac76 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -2,7 +2,7 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; -import { DNA_NICK, ZOME_NAME, DNA } from "./build/dna.js"; +import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; import { io } from "https://esm.sh/socket.io-client@4.7.2"; class PeerInfo { @@ -21,34 +21,41 @@ export class LinkAdapter implements LinkSyncAdapter { me: DID gossipLogCount: number = 0; myCurrentRevision: Buffer | null = null; - socket: any | null = null; + languageName: String | null = null; - constructor(context: LanguageContext) { + constructor(context: LanguageContext, name: String) { //@ts-ignore this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; - this.socket = io("wss://socket.ad4m.dev", { transports: ['websocket'] }); + this.languageName = name; + const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); console.log("Created socket connection"); - console.dir(this.socket); - this.socket.on('error', (error: any) => { + socket.on('error', (error: any) => { console.error('Error:', error); }); - this.socket.on('connect', () => { + socket.on('connect', () => { console.log('Connected to the server'); + try { + socket.emit("join-room", this.languageName); + console.log("Sent the join-room signal"); + socket.on("signal", (signal: any) => { + this.handleHolochainSignal(signal); + }); + } catch (e) { + console.error("Error in socket connection: ", e); + } }); - this.socket.on('disconnect', () => { + socket.on('disconnect', () => { console.log('Disconnected from the server'); + socket.connect(); }); - this.socket.on('connect_error', (error) => { + socket.on('connect_error', (error) => { console.error('Connection Error:', error); + socket.connect(); }); - this.socket.on('reconnect_attempt', () => { + socket.on('reconnect_attempt', () => { console.log('Trying to reconnect...'); }); - this.socket.emit("join-room", DNA.toString()); - this.socket.on("signal", (signal: any) => { - this.handleHolochainSignal(signal); - }); } writable(): boolean { @@ -78,12 +85,18 @@ export class LinkAdapter implements LinkSyncAdapter { //@ts-ignore let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); if (broadcast_payload) { + if (broadcast_payload.reference_hash && Buffer.isBuffer(broadcast_payload.reference_hash)) { + this.myCurrentRevision = broadcast_payload.reference_hash; + } //Use client to send to socketIO - console.log("Broadcast to socket"); - this.socket.emit("broadcast", {roomId: DNA.toString(), signal: broadcast_payload}); - } - if (broadcast_payload.reference_hash && Buffer.isBuffer(broadcast_payload.reference_hash)) { - this.myCurrentRevision = broadcast_payload.reference_hash; + broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); + broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); + if (broadcast_payload.reference.parents) { + broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); + }; + console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); + const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); @@ -163,6 +176,7 @@ export class LinkAdapter implements LinkSyncAdapter { for (const hash of Array.from(revisions)) { if(!hash) continue if (this.myCurrentRevision && hash.equals(this.myCurrentRevision)) continue + console.log("Pulling with hash", hash); let pullResult = await this.hcDna.call(DNA_NICK, ZOME_NAME, "pull", { hash, is_scribe @@ -228,9 +242,18 @@ export class LinkAdapter implements LinkSyncAdapter { this.myCurrentRevision = res; } let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); + console.log('commit got broadcast payload', broadcast_payload.referencence_hash); + console.log("which has type", typeof broadcast_payload.reference_hash); if (broadcast_payload) { + broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); + broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); + if (broadcast_payload.reference.parents) { + broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); + }; + console.log("commit sending referenceh hash", broadcast_payload.reference_hash); //Use client to send to socketIO - this.socket.emit("broadcast", {roomId: DNA.toString(), signal: broadcast_payload}); + const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } return res as string; } catch (e) { @@ -251,7 +274,19 @@ export class LinkAdapter implements LinkSyncAdapter { } async handleHolochainSignal(signal: any): Promise { - const { diff, reference_hash, reference, broadcast_author } = signal.payload; + let diff; + let reference_hash; + let reference; + let broadcast_author; + if (signal.payload) { + ({ diff, reference_hash, reference, broadcast_author } = signal.payload); + } else { + ({ diff, reference_hash, reference, broadcast_author } = signal); + } + // console.log("Setting a peer hash to", reference_hash); + // console.log(JSON.stringify(diff)); + // console.log("Reference", JSON.stringify(reference)); + // console.log(broadcast_author); //Check if this signal came from another agent & contains a diff and reference_hash if (diff && reference_hash && reference && broadcast_author) { // console.log(`PerspectiveDiffSync.handleHolochainSignal: @@ -268,14 +303,33 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.handleHolochainSignal: Getting lock"); //console.log("PerspectiveDiffSync.handleHolochainSignal: Got lock"); + //const parsed = JSON.parse(reference_hash); + //console.log("Parsed ref hash", parsed); + if (!Buffer.isBuffer(reference_hash)) { + reference_hash = Buffer.from(reference_hash, 'base64'); + } + if (!Buffer.isBuffer(reference.diff)) { + reference.diff = Buffer.from(reference.diff, 'base64'); + } + if (reference.parents) { + reference.parents = reference.parents.map( (parent: string) => parent == 'null' ? null : Buffer.from(parent, 'base64')); + } + + await this.hcDna.call(DNA_NICK, ZOME_NAME, "handle_broadcast", { + diff, + reference_hash, + reference, + broadcast_author + }); this.peers.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); } catch (e) { console.error("PerspectiveDiffSync.handleHolochainSignal: got error", e); } } else { - //console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", signal.payload); + console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", JSON.stringify(signal.payload)); //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal if (this.linkCallback) { + console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback"); await this.linkCallback(signal.payload); } } diff --git a/rust-executor/src/mainnet_seed.json b/rust-executor/src/mainnet_seed.json index 85d5efd12..a62385949 100644 --- a/rust-executor/src/mainnet_seed.json +++ b/rust-executor/src/mainnet_seed.json @@ -3,7 +3,7 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdd6SunHY8orC2xzd43qpP3YUHuwyeWLWmfsxaHF3KLH4C" + "QmzSYwdhgUgUwrFSzZ2tDHyw1xbCn7ncSDeB1sgCGSPixW18hC6" ], "directMessageLanguage": "QmzSYwdp8xNu5UdWWsKQhzZs4JLYDBTk22T7ksoi3hhpscZAm3E", "agentLanguage": "QmzSYwdigpRrQTmtXcATD4zAFp1nqbXB1tVJT7ho1JaThaXCynL", diff --git a/tests/js/scripts/build-test-language.sh b/tests/js/scripts/build-test-language.sh index 81ce2b599..6eb327b56 100755 --- a/tests/js/scripts/build-test-language.sh +++ b/tests/js/scripts/build-test-language.sh @@ -1,9 +1,9 @@ #!/bin/bash -cd languages/test-language -yarn install -yarn run build +# cd languages/test-language +# yarn install +# yarn run build -cd ../note-store -yarn install -yarn run build +# cd ../note-store +# yarn install +# yarn run build From 3642ae5e532428211cd6a0a75b2623da1487a0f2 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Fri, 6 Oct 2023 16:15:21 +0530 Subject: [PATCH 17/87] Added patch for aead-gcm-stream --- Cargo.lock | 5 ++--- Cargo.toml | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d8cf300b..911f10a29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,7 +62,7 @@ dependencies = [ [[package]] name = "ad4m-launcher" -version = "0.6.1" +version = "0.6.1-prerelease.0" dependencies = [ "ad4m-client", "chrono", @@ -126,8 +126,7 @@ dependencies = [ [[package]] name = "aead-gcm-stream" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a09ecb526d53de2842cc876ee5c9b51161ee60399edeca4cf74892a01b48177" +source = "git+https://github.com/coasys/aead-gcm-stream.git#b449abc60de4145efabc2fc08dd869de1a5e8f0d" dependencies = [ "aead", "aes", diff --git a/Cargo.toml b/Cargo.toml index c107e089c..4057afee2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,5 @@ members = [ [patch.crates-io] sodiumoxide = { git = "https://github.com/fayeed/sodiumoxide" } serde = { git = "https://github.com/fayeed/serde.git", branch = "ad4m-compatible" } -notify-rust = { version = "4.6.0", git = "https://github.com/coasys/notify-rust.git" } \ No newline at end of file +notify-rust = { version = "4.6.0", git = "https://github.com/coasys/notify-rust.git" } +aead-gcm-stream = { version = "0.1.0", git = "https://github.com/coasys/aead-gcm-stream.git" } \ No newline at end of file From f1ca0c4337ec32d9ceda13b93ddb68ec4006ade6 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 9 Oct 2023 16:58:13 +0530 Subject: [PATCH 18/87] Fixed build issues with holochain --- executor/package.json | 2 +- patches/@holochain+client+0.12.5.patch | 20 -------------------- 2 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 patches/@holochain+client+0.12.5.patch diff --git a/executor/package.json b/executor/package.json index 9baa00633..260a97aa7 100644 --- a/executor/package.json +++ b/executor/package.json @@ -62,7 +62,7 @@ "@holochain/client": "perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b", "@msgpack/msgpack": "3.0.0-beta2", "@noble/secp256k1": "^1.7.0", - "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m": "link:../core", "@transmute/did-key.js": "^0.2.1-unstable.29", "@types/json-stable-stringify": "^1.0.33", "@types/mocha": "^10.0.0", diff --git a/patches/@holochain+client+0.12.5.patch b/patches/@holochain+client+0.12.5.patch deleted file mode 100644 index fb0cfca3c..000000000 --- a/patches/@holochain+client+0.12.5.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/node_modules/@holochain/client/lib/api/zome-call-signing.js b/node_modules/@holochain/client/lib/api/zome-call-signing.js -index aaddf61..fa20172 100644 ---- a/node_modules/@holochain/client/lib/api/zome-call-signing.js -+++ b/node_modules/@holochain/client/lib/api/zome-call-signing.js -@@ -1,5 +1,7 @@ - import nacl from "tweetnacl"; - import { encodeHashToBase64 } from "../utils/base64.js"; -+import crypto from 'node:crypto'; -+ - const signingCredentials = new Map(); - /** - * Get credentials for signing zome calls. -@@ -54,7 +56,6 @@ export const randomByteArray = async (length) => { - return window.crypto.getRandomValues(new Uint8Array(length)); - } - else { -- const crypto = await import("crypto"); - return new Uint8Array(crypto.randomBytes(length)); - } - }; From cf0ccd44ce04b5f314984844d4e94f64c811ff1b Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 9 Oct 2023 12:53:24 +0100 Subject: [PATCH 19/87] fix setVersion.js --- setVersion.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/setVersion.js b/setVersion.js index 973d5de39..72323daf1 100644 --- a/setVersion.js +++ b/setVersion.js @@ -4,6 +4,7 @@ const readline = require('readline-sync'); function replaceVersionLine(content, version, prefix = 'version = ', suffix = '') { const lines = content.split('\n') const versionLineIndex = lines.findIndex(line => line.startsWith(prefix)) + if (versionLineIndex === -1) throw new Error(`Could not find version line in ${content}`) const scope = lines[versionLineIndex].substring(prefix.length) const oldVersion = scope.split('"')[1] const newVersionLine = `${prefix}"${version}"${suffix}` @@ -39,17 +40,17 @@ fs.writeFileSync('package.json', JSON.stringify(rootRepo, null, 2) + '\n') let ad4mClient; if (isPreRelease) { - const cli = replaceVersionLine(fs.readFileSync('cli/Cargo.toml', 'utf8'), RUST_VERSION) + cli = replaceVersionLine(fs.readFileSync('cli/Cargo.toml', 'utf8'), RUST_VERSION) console.log("CLI version: " + cli.oldVersion + " -> " + RUST_VERSION) - ad4mClient = replaceVersionLine(cli.newContent, RUST_VERSION, `ad4m-client = { path = "../rust-client", version = `, ` }`) - console.log(`CLI ad4m-client dep: ${ad4mClient.oldVersion} -> ${RUST_VERSION}`) + // ad4mClient = replaceVersionLine(cli.newContent, RUST_VERSION, `ad4m-client = { path = "../rust-client", version = `, ` }`) + // console.log(`CLI ad4m-client dep: ${ad4mClient.oldVersion} -> ${RUST_VERSION}`) } else { - const cli = replaceVersionLine(fs.readFileSync('cli/Cargo.toml', 'utf8'), RAW_VERSION) + cli = replaceVersionLine(fs.readFileSync('cli/Cargo.toml', 'utf8'), RAW_VERSION) console.log("CLI version: " + cli.oldVersion + " -> " + RAW_VERSION) - ad4mClient = replaceVersionLine(cli.newContent, RAW_VERSION, `ad4m-client = { path = "../rust-client", version = `, ` }`) - console.log(`CLI ad4m-client dep: ${ad4mClient.oldVersion} -> ${RAW_VERSION}`) + // ad4mClient = replaceVersionLine(cli.newContent, RAW_VERSION, `ad4m-client = { path = "../rust-client", version = `, ` }`) + // console.log(`CLI ad4m-client dep: ${ad4mClient.oldVersion} -> ${RAW_VERSION}`) } -fs.writeFileSync('cli/Cargo.toml', ad4mClient.newContent) +fs.writeFileSync('cli/Cargo.toml', cli.newContent) const connect = JSON.parse(fs.readFileSync('connect/package.json', 'utf8')) console.log("Connect version: " + connect.version + " -> " + VERSION) From 8bb5adfe39dc741a42b74a49d7c3755b4370fb6e Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 9 Oct 2023 12:53:37 +0100 Subject: [PATCH 20/87] use link:../core everywhere --- connect/package.json | 2 +- rust-executor/package.json | 2 +- ui/package.json | 2 +- yarn.lock | 5237 +++++++++++++++++++----------------- 4 files changed, 2805 insertions(+), 2438 deletions(-) diff --git a/connect/package.json b/connect/package.json index 124e5f132..1ae273f7d 100644 --- a/connect/package.json +++ b/connect/package.json @@ -49,7 +49,7 @@ }, "devDependencies": { "@apollo/client": "3.7.10", - "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m": "link:../core", "esbuild": "^0.15.5", "esbuild-plugin-lit": "^0.0.10", "graphql-ws": "5.12.0", diff --git a/rust-executor/package.json b/rust-executor/package.json index 3bd481479..19a83abf0 100644 --- a/rust-executor/package.json +++ b/rust-executor/package.json @@ -29,7 +29,7 @@ "url": "https://github.com/perspect3vism/ad4m/issues" }, "devDependencies": { - "@perspect3vism/ad4m-executor": "*" + "@perspect3vism/ad4m-executor": "link:../core" }, "dependencies": {} } diff --git a/ui/package.json b/ui/package.json index cc3fcc404..721ea810e 100644 --- a/ui/package.json +++ b/ui/package.json @@ -6,7 +6,7 @@ "dependencies": { "@apollo/client": "3.7.10", "@junto-foundation/junto-elements": "^0.5.5", - "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m": "link:../core", "@preact/preset-vite": "^2.4.0", "@tauri-apps/api": "^1.4.0", "apollo-boost": "^0.4.9", diff --git a/yarn.lock b/yarn.lock index cfb15a44b..9ece745f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,15 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@adobe/css-tools@^4.0.1": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" - integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + version "4.3.1" + resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" + integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -86,9 +91,9 @@ long "^4.0.0" "@apollo/usage-reporting-protobuf@^4.0.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.0.tgz#b54b8c32702bbe81aa0e399076ddabaf75a13f9b" - integrity sha512-hXouMuw5pQVkzi8dgMybmr6Y11+eRmMQVoB5TF0HyTwAg9SOq/v3OCuiYqcVUKdBcskU9Msp+XvjAk0GKpWCwQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz#407c3d18c7fbed7a264f3b9a3812620b93499de1" + integrity sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA== dependencies: "@apollo/protobufjs" "1.2.7" @@ -171,14 +176,7 @@ asciidoctor-opal-runtime "0.3.3" unxhr "1.0.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -186,82 +184,66 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.22.0", "@babel/compat-data@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" - integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== - -"@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== +"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== -"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.14.8", "@babel/core@^7.16.0", "@babel/core@^7.2.2", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0", "@babel/core@^7.9.6": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" - integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== +"@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.14.8", "@babel/core@^7.16.0", "@babel/core@^7.2.2", "@babel/core@^7.22.1", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.0" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helpers" "^7.22.0" - "@babel/parser" "^7.22.0" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - convert-source-map "^1.7.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.16.3": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz#59fb6fc4f3b017ab86987c076226ceef7b2b2ef2" - integrity sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.22.0", "@babel/generator@^7.22.3", "@babel/generator@^7.7.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" - integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== +"@babel/generator@^7.23.0", "@babel/generator@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== dependencies: - "@babel/types" "^7.22.3" + "@babel/types" "^7.23.0" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": +"@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" - integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== - dependencies: - "@babel/compat-data" "^7.22.0" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5": +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -272,31 +254,22 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz#ae3de70586cc757082ae3eba57240d42f468c41b" - integrity sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz#a7ed9a8488b45b467fca353cd1a44dc5f0cf5c70" - integrity sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w== +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.22.5": +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== @@ -305,162 +278,92 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-environment-visitor@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" - integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.21.0", "@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-hoist-variables@^7.18.6": +"@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz#4b77a12c1b4b8e9e28736ed47d8b91f00976911f" - integrity sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA== - dependencies: - "@babel/types" "^7.22.3" - -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.21.4" + "@babel/types" "^7.23.0" -"@babel/helper-module-imports@^7.22.15": +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.20.11": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz#7edf129097a51ccc12443adbc6320e90eab76693" - integrity sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.15" - -"@babel/helper-module-transforms@^7.21.5", "@babel/helper-module-transforms@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" - integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-module-transforms@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz#40ad2f6950f143900e9c1c72363c0b431a606082" - integrity sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-optimise-call-expression@^7.18.6", "@babel/helper-optimise-call-expression@^7.22.5": +"@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.22.5": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" -"@babel/helper-replace-supers@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz#38cf6e56f7dc614af63a21b45565dd623f0fdc95" - integrity sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-member-expression-to-functions" "^7.22.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.0" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -468,112 +371,82 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@^7.18.6", "@babel/helper-split-export-declaration@^7.22.6": +"@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-identifier@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" - integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-wrap-function@^7.18.9": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz#222ac3ff9cc8f9b617cc1e5db75c0b538e722801" - integrity sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.15" - "@babel/types" "^7.22.17" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" - integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== dependencies: - "@babel/template" "^7.21.9" - "@babel/traverse" "^7.22.1" - "@babel/types" "^7.22.3" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" -"@babel/highlight@^7.18.6", "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" - integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== - -"@babel/parser@^7.22.15": +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.15.tgz#d34592bfe288a32e741aa0663dbc4829fcd55160" - integrity sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz#a75be1365c0c3188c51399a662168c1c98108659" - integrity sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-transform-optional-chaining" "^7.22.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" "@babel/plugin-proposal-class-properties@^7.16.0": version "7.18.6" @@ -584,15 +457,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz#3502c0f8cfe0cdb79b62102c9c9b111309d942b7" - integrity sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz#66d9014173b3267a9ced3e69935138bc64ffb5c8" + integrity sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-replace-supers" "^7.22.1" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/plugin-syntax-decorators" "^7.22.3" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.10" "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" @@ -627,23 +500,10 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c" - integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -673,12 +533,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz#760f2d812d56c1d05970d01cdcd3c05e3d87d6ca" - integrity sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg== +"@babel/plugin-syntax-decorators@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff" + integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -701,19 +561,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.20.0": +"@babel/plugin-syntax-import-assertions@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-attributes@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz#d7168f22b9b49a6cc1792cec78e06a18ad2e7b4b" - integrity sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA== +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -729,13 +589,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-jsx@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" @@ -799,15 +652,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.21.4", "@babel/plugin-syntax-typescript@^7.7.2": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.18.6": - name "@babel/plugin-syntax-unicode-sets-regex" +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== @@ -815,87 +667,94 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz#3ed99924c354fb9e80dabb2cc8d002c702e94527" - integrity sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA== +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-properties@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz#3407145e513830df77f0cef828b8b231c166fe4c" - integrity sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw== +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" + integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-class-static-block@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz#e352cf33567385c731a8f21192efeba760358773" - integrity sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw== +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" + integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== @@ -903,35 +762,35 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": +"@babel/plugin-transform-duplicate-keys@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dynamic-import@^7.22.1": - version "7.22.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz#6c56afaf896a07026330cf39714532abed8d9ed1" - integrity sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-export-namespace-from@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz#9b8700aa495007d3bebac8358d1c562434b680b9" - integrity sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g== +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-transform-flow-strip-types@^7.16.0": @@ -942,14 +801,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-flow" "^7.22.5" -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": +"@babel/plugin-transform-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== @@ -958,73 +817,64 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-json-strings@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz#a181b8679cf7c93e9d0e3baa5b1776d65be601a9" - integrity sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-logical-assignment-operators@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz#9e021455810f33b0baccb82fb759b194f5dc36f0" - integrity sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" + integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.2.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== +"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== dependencies: - "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz#cc507e03e88d87b016feaeb5dae941e6ef50d91e" - integrity sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" + integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/plugin-transform-modules-umd@^7.18.6": +"@babel/plugin-transform-modules-umd@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== @@ -1032,49 +882,49 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz#db6fb77e6b3b53ec3b8d370246f0b7cf67d35ab4" - integrity sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz#deb0377d741cbee2f45305868b9026dcd6dd96e2" - integrity sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz#8c519f8bf5af94a9ca6f65cf422a9d3396e542b9" - integrity sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz#02493070ca6685884b0eee705363ee4da2132ab0" - integrity sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ== +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz#da6fba693effb8c203d8c3bdf7bf4e2567e802e9" - integrity sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.22.3" + "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-object-super@^7.18.6": +"@babel/plugin-transform-object-super@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== @@ -1082,49 +932,49 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-optional-catch-binding@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz#e971a083fc7d209d9cd18253853af1db6d8dc42f" - integrity sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz#5fd24a4a7843b76da6aeec23c7f551da5d365290" - integrity sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg== +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" + integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz#24477acfd2fd2bc901df906c9bf17fbcfeee900d" - integrity sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-methods@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz#adac38020bab5047482d3297107c1f58e9c574f6" - integrity sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-private-property-in-object@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz#031621b02c7b7d95389de1a3dba2fe9e8c548e56" - integrity sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.18.6": +"@babel/plugin-transform-property-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== @@ -1132,20 +982,20 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-constant-elements@^7.12.1": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.3.tgz#b87a436c3377f29b37409f9c02c99c9ce377909d" - integrity sha512-b5J6muxQYp4H7loAQv/c7GO5cPuRA6H5hx4gO+/Hn+Cu9MRQU0PNiUoWq1L//8sq6kFSNxGXFb2XTaUfa9y+Pg== + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz#6dfa7c1c37f7d7279e417ceddf5a04abb8bb9c29" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.18.6": +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.18.6": +"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== @@ -1166,18 +1016,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz#5a1f380df3703ba92eb1a930a539c6d88836f690" - integrity sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.22.3" - -"@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== @@ -1188,7 +1027,7 @@ "@babel/plugin-syntax-jsx" "^7.22.5" "@babel/types" "^7.22.15" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": +"@babel/plugin-transform-react-pure-annotations@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0" integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== @@ -1196,15 +1035,15 @@ "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.18.6": +"@babel/plugin-transform-reserved-words@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== @@ -1212,79 +1051,79 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz#f8353f313f18c3ce1315688631ec48657b97af42" - integrity sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": +"@babel/plugin-transform-shorthand-properties@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": +"@babel/plugin-transform-sticky-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": +"@babel/plugin-transform-template-literals@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": +"@babel/plugin-transform-typeof-symbol@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.21.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz#8f662cec8ba88c873f1c7663c0c94e3f68592f09" - integrity sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw== +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-typescript" "^7.21.4" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-property-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz#597b6a614dc93eaae605ee293e674d79d32eb380" - integrity sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": +"@babel/plugin-transform-unicode-regex@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== @@ -1292,33 +1131,33 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-sets-regex@^7.22.3": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz#7c14ee33fa69782b0101d0f7143d3fc73ce00700" - integrity sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw== +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.4.tgz#c86a82630f0e8c61d9bb9327b7b896732028cbed" - integrity sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ== - dependencies: - "@babel/compat-data" "^7.22.3" - "@babel/helper-compilation-targets" "^7.22.1" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.3" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + dependencies: + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-attributes" "^7.22.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1330,95 +1169,93 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.3" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-class-properties" "^7.22.3" - "@babel/plugin-transform-class-static-block" "^7.22.3" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-dynamic-import" "^7.22.1" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-export-namespace-from" "^7.22.3" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-json-strings" "^7.22.3" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.3" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.22.3" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.3" - "@babel/plugin-transform-new-target" "^7.22.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.3" - "@babel/plugin-transform-numeric-separator" "^7.22.3" - "@babel/plugin-transform-object-rest-spread" "^7.22.3" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-optional-catch-binding" "^7.22.3" - "@babel/plugin-transform-optional-chaining" "^7.22.3" - "@babel/plugin-transform-parameters" "^7.22.3" - "@babel/plugin-transform-private-methods" "^7.22.3" - "@babel/plugin-transform-private-property-in-object" "^7.22.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-property-regex" "^7.22.3" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/plugin-transform-unicode-sets-regex" "^7.22.3" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.22.4" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.19" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.3.tgz#2ec7f91d0c924fa2ea0c7cfbbf690bc62b79cd84" - integrity sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.22.3" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.16.0": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" + integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" "@babel/regjsgen@^0.8.0": version "0.8.0" @@ -1426,22 +1263,13 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" - integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" - integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/parser" "^7.21.9" - "@babel/types" "^7.21.5" + regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.22.5": +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1450,47 +1278,29 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.22.1", "@babel/traverse@^7.7.2": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" - integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.22.3" - "@babel/helper-environment-visitor" "^7.22.1" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.22.4" - "@babel/types" "^7.22.4" +"@babel/traverse@^7.1.0", "@babel/traverse@^7.23.0", "@babel/traverse@^7.7.2": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.22.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" - integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.9", "@babel/types@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee" - integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.15" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.15.tgz#266cb21d2c5fd0b3931e7a91b6dd72d2f617d282" - integrity sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA== +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1498,18 +1308,18 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@braintree/sanitize-url@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" - integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== +"@braintree/sanitize-url@^6.0.1": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" + integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== -"@changesets/apply-release-plan@^6.1.3": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz#3bcc0bd57ba00d50d20df7d0141f1a9b2134eaf7" - integrity sha512-ECDNeoc3nfeAe1jqJb5aFQX7CqzQhD2klXRez2JDb/aVpGUbX673HgKrnrgJRuQR/9f2TtLoYIzrGB9qwD77mg== +"@changesets/apply-release-plan@^6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-6.1.4.tgz#09293256090737ecd2f683842d6d732034a5e3c8" + integrity sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew== dependencies: "@babel/runtime" "^7.20.1" - "@changesets/config" "^2.3.0" + "@changesets/config" "^2.3.1" "@changesets/get-version-range-type" "^0.3.2" "@changesets/git" "^2.0.0" "@changesets/types" "^5.2.1" @@ -1520,19 +1330,19 @@ outdent "^0.5.0" prettier "^2.7.1" resolve-from "^5.0.0" - semver "^5.4.1" + semver "^7.5.3" -"@changesets/assemble-release-plan@^5.2.3": - version "5.2.3" - resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.3.tgz#5ce6191c6e193d40b566a7b0e01690cfb106f4db" - integrity sha512-g7EVZCmnWz3zMBAdrcKhid4hkHT+Ft1n0mLussFMcB1dE2zCuwcvGoy9ec3yOgPGF4hoMtgHaMIk3T3TBdvU9g== +"@changesets/assemble-release-plan@^5.2.4": + version "5.2.4" + resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-5.2.4.tgz#d42fd63f4297a2e630e8e0a49f07d4ff5f5ef7bc" + integrity sha512-xJkWX+1/CUaOUWTguXEbCDTyWJFECEhmdtbkjhn5GVBGxdP/JwaHBIU9sW3FR6gD07UwZ7ovpiPclQZs+j+mvg== dependencies: "@babel/runtime" "^7.20.1" "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.5" + "@changesets/get-dependents-graph" "^1.3.6" "@changesets/types" "^5.2.1" "@manypkg/get-packages" "^1.1.3" - semver "^5.4.1" + semver "^7.5.3" "@changesets/changelog-git@^0.1.14": version "0.1.14" @@ -1542,18 +1352,18 @@ "@changesets/types" "^5.2.1" "@changesets/cli@^2.25.2": - version "2.26.1" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.26.1.tgz#2d10858d7d32314a524e383111c96d831eb0402f" - integrity sha512-XnTa+b51vt057fyAudvDKGB0Sh72xutQZNAdXkCqPBKO2zvs2yYZx5hFZj1u9cbtpwM6Sxtcr02/FQJfZOzemQ== + version "2.26.2" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.26.2.tgz#8914dd6ef3ea425a7d5935f6c35a8b7ccde54e45" + integrity sha512-dnWrJTmRR8bCHikJHl9b9HW3gXACCehz4OasrXpMp7sx97ECuBGGNjJhjPhdZNCvMy9mn4BWdplI323IbqsRig== dependencies: "@babel/runtime" "^7.20.1" - "@changesets/apply-release-plan" "^6.1.3" - "@changesets/assemble-release-plan" "^5.2.3" + "@changesets/apply-release-plan" "^6.1.4" + "@changesets/assemble-release-plan" "^5.2.4" "@changesets/changelog-git" "^0.1.14" - "@changesets/config" "^2.3.0" + "@changesets/config" "^2.3.1" "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.5" - "@changesets/get-release-plan" "^3.0.16" + "@changesets/get-dependents-graph" "^1.3.6" + "@changesets/get-release-plan" "^3.0.17" "@changesets/git" "^2.0.0" "@changesets/logger" "^0.0.5" "@changesets/pre" "^1.0.14" @@ -1562,7 +1372,7 @@ "@changesets/write" "^0.2.3" "@manypkg/get-packages" "^1.1.3" "@types/is-ci" "^3.0.0" - "@types/semver" "^6.0.0" + "@types/semver" "^7.5.0" ansi-colors "^4.1.3" chalk "^2.1.0" enquirer "^2.3.0" @@ -1575,18 +1385,18 @@ p-limit "^2.2.0" preferred-pm "^3.0.0" resolve-from "^5.0.0" - semver "^5.4.1" + semver "^7.5.3" spawndamnit "^2.0.0" term-size "^2.1.0" tty-table "^4.1.5" -"@changesets/config@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.3.0.tgz#bff074d6492fa772cee139f9a04efa4cd56445bb" - integrity sha512-EgP/px6mhCx8QeaMAvWtRrgyxW08k/Bx2tpGT+M84jEdX37v3VKfh4Cz1BkwrYKuMV2HZKeHOh8sHvja/HcXfQ== +"@changesets/config@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@changesets/config/-/config-2.3.1.tgz#3d4a1dc866c3623375180b30f69fccdf0e3efebf" + integrity sha512-PQXaJl82CfIXddUOppj4zWu+987GCw2M+eQcOepxN5s+kvnsZOwjEJO3DH9eVy+OP6Pg/KFEWdsECFEYTtbg6w== dependencies: "@changesets/errors" "^0.1.4" - "@changesets/get-dependents-graph" "^1.3.5" + "@changesets/get-dependents-graph" "^1.3.6" "@changesets/logger" "^0.0.5" "@changesets/types" "^5.2.1" "@manypkg/get-packages" "^1.1.3" @@ -1600,25 +1410,25 @@ dependencies: extendable-error "^0.1.5" -"@changesets/get-dependents-graph@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.5.tgz#f94c6672d2f9a87aa35512eea74550585ba41c21" - integrity sha512-w1eEvnWlbVDIY8mWXqWuYE9oKhvIaBhzqzo4ITSJY9hgoqQ3RoBqwlcAzg11qHxv/b8ReDWnMrpjpKrW6m1ZTA== +"@changesets/get-dependents-graph@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-1.3.6.tgz#5e19e7b0bfbc7dc38e1986eaaa7016ff377ed888" + integrity sha512-Q/sLgBANmkvUm09GgRsAvEtY3p1/5OCzgBE5vX3vgb5CvW0j7CEljocx5oPXeQSNph6FXulJlXV3Re/v3K3P3Q== dependencies: "@changesets/types" "^5.2.1" "@manypkg/get-packages" "^1.1.3" chalk "^2.1.0" fs-extra "^7.0.1" - semver "^5.4.1" + semver "^7.5.3" -"@changesets/get-release-plan@^3.0.16": - version "3.0.16" - resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.16.tgz#5d9cfc4ffda02c496ef0fde407210de8e3a0fb19" - integrity sha512-OpP9QILpBp1bY2YNIKFzwigKh7Qe9KizRsZomzLe6pK8IUo8onkAAVUD8+JRKSr8R7d4+JRuQrfSSNlEwKyPYg== +"@changesets/get-release-plan@^3.0.17": + version "3.0.17" + resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-3.0.17.tgz#8aabced2795ffeae864696b60ee3031f8a94c5f3" + integrity sha512-6IwKTubNEgoOZwDontYc2x2cWXfr6IKxP3IhKeK+WjyD6y3M4Gl/jdQvBw+m/5zWILSOCAaGLu2ZF6Q+WiPniw== dependencies: "@babel/runtime" "^7.20.1" - "@changesets/assemble-release-plan" "^5.2.3" - "@changesets/config" "^2.3.0" + "@changesets/assemble-release-plan" "^5.2.4" + "@changesets/config" "^2.3.1" "@changesets/pre" "^1.0.14" "@changesets/read" "^0.5.9" "@changesets/types" "^5.2.1" @@ -1845,125 +1655,125 @@ global-agent "^3.0.0" global-tunnel-ng "^2.7.1" -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== "@esbuild/android-arm@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.18.tgz#266d40b8fdcf87962df8af05b76219bc786b4f80" integrity sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw== -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== - -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== - -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== - -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== - -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== - -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== - -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== - -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== - -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== "@esbuild/linux-loong64@0.15.18": version "0.15.18" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz#128b76ecb9be48b60cf5cfc1c63a4f00691a3239" integrity sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ== -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== - -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== - -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== - -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== - -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== - -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== - -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== - -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== - -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== - -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== - -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== - -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -1972,19 +1782,19 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1992,10 +1802,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.42.0": - version "8.42.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" - integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== +"@eslint/js@8.51.0": + version "8.51.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" + integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== "@graphql-tools/merge@8.3.1": version "8.3.1" @@ -2064,9 +1874,9 @@ integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== "@headlessui/react@^1.7.10": - version "1.7.15" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.15.tgz#53ef6ae132af81b8f188414767b6e79ebf8dc73f" - integrity sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw== + version "1.7.17" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.17.tgz#a0ec23af21b527c030967245fd99776aa7352bc6" + integrity sha512-4am+tzvkqDSSgiwrsEpGWqgGo9dz8qU5M3znCkC4PgkpY4HcCZzEDEvozltGGGHIKl9jbXbZPSH5TWn4sWJdow== dependencies: client-only "^0.0.1" @@ -2086,8 +1896,9 @@ lodash-es "^4.17.21" ws "^8.13.0" -"@holochain/client@perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b": +"@holochain/client@github:perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b", "@holochain/client@perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b": version "0.12.5" + uid "2f3a436b6d28344b0aca883ef3dc229cd042c04b" resolved "https://codeload.github.com/perspect3vism/holochain-client-js/tar.gz/2f3a436b6d28344b0aca883ef3dc229cd042c04b" dependencies: "@holochain/serialization" "^0.1.0-beta-rc.3" @@ -2104,49 +1915,49 @@ resolved "https://registry.yarnpkg.com/@holochain/serialization/-/serialization-0.1.0-beta-rc.3.tgz#787a785fa48e00f2d168c6d4b45a233c4800cccb" integrity sha512-DJx4V2KXHVLciyOGjOYKTM/JLBpBEZ3RsPIRCgf7qmwhQdxXvhi2p+oFFRD51yUT5uC1/MzIVeJCl/R60PwFbw== -"@honkit/asciidoc@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@honkit/asciidoc/-/asciidoc-4.0.7.tgz#7e6deb19c91ccf6e4177c215652919e53f081d96" - integrity sha512-YgIInbeGtuhvKO4cUhJ9q5g8iNkbwEL/U4suwP1uC9sZXFfYzXg+Vt2zPPx47A+Nj0cirdrbbh1fJhQWJIgm8A== +"@honkit/asciidoc@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@honkit/asciidoc/-/asciidoc-4.0.8.tgz#0941939f1d434a71f57b6a527466017b1d2f0270" + integrity sha512-wyVBKfX9yM5P8nm81ew1cdTR0hKWFB9hRTvwGXBVS+ipD+WFTQWxVw3qNQapMKRiiVq/L3QA6bpkIDul3EJ43w== dependencies: - "@honkit/html" "^4.0.7" + "@honkit/html" "^4.0.8" asciidoctor "^2.2.0" lodash "^4.13.1" -"@honkit/honkit-plugin-highlight@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@honkit/honkit-plugin-highlight/-/honkit-plugin-highlight-4.0.7.tgz#d54911155167bd2bcd79442b9548737e5d4c636c" - integrity sha512-VeXVJ2orU4F2V8ncf3bGNnPFzuS8+IV5NdHNW4C3Nt9+MoB6cp7lAoi95+ZuYC9T4iIVkfBtXFA/tCivEAjfgg== +"@honkit/honkit-plugin-highlight@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@honkit/honkit-plugin-highlight/-/honkit-plugin-highlight-4.0.8.tgz#78e487e5b5a0b9bb0bf1fa305d6a04ebf193ddd7" + integrity sha512-fu1QFxS/m0X9uIK8vrn9TGN2HLJ8AjK03L4/yZo+ioYG55ALgTE3tNz7CrGPGjUn+uluLMmrvcJQDpPUmTMYdQ== dependencies: highlight.js "^10.7.1" -"@honkit/honkit-plugin-theme-default@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@honkit/honkit-plugin-theme-default/-/honkit-plugin-theme-default-4.0.7.tgz#758360e3a1bda6db306b32e1db6959247bce3400" - integrity sha512-C/4WLD26p8f7gDTR6R60lPL6CJys+1/z7o6wUd5qEUya3Xu/YjiZmNviIyw99C5RUu4X7YutVvMijGTwC1izgA== +"@honkit/honkit-plugin-theme-default@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@honkit/honkit-plugin-theme-default/-/honkit-plugin-theme-default-4.0.8.tgz#93ac34139ab284334957e8eb5bf102abcc6c538b" + integrity sha512-1CaoaAZZYWOJGnBsdi63ulKqxNcHXAQZPq1QqUsxE3Ml+YJZnyf/0uq8wuUdxJ/TzG4iyaXA2jT92xHlCkXJ1w== -"@honkit/html@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@honkit/html/-/html-4.0.7.tgz#e22f04d270f225abf68a80215ba4e6491f0d9f07" - integrity sha512-8f3VqAwJqxSmmaiS7tDQpTMNwssXSW6s09AeLstOI8qhyCGf0ajpbfgQ1WrqY4duu6yqaZrubY8o9U7eSgxnVg== +"@honkit/html@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@honkit/html/-/html-4.0.8.tgz#ca418eba38f5127c8c79f0117c9826ececfa6c38" + integrity sha512-tpMpYrPKT3RqZC8i00oGHuY+BR+6S3stEONEpMQM9xz1Zj266TXZ5GRXkX4n2cb5DA6OmeR5asYxd7gTXNPjqw== dependencies: cheerio "^1.0.0-rc.12" lodash "^4.13.1" q "^1.1.2" -"@honkit/markdown-legacy@^4.0.7": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@honkit/markdown-legacy/-/markdown-legacy-4.0.7.tgz#87c62f1df4579fbfa2881ae5db42adfcae950c73" - integrity sha512-wg+ErBy0Mk5Je6VVSbFoSwSvHNSstAzJnKiem1wR9nbrF21M5Ip4mLDZRsuuSPi0HOTFz3AhZMJC+ch+chIIEA== +"@honkit/markdown-legacy@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@honkit/markdown-legacy/-/markdown-legacy-4.0.8.tgz#cd0fa4720ab08bc84a06022d8a62fa7a8fb876a1" + integrity sha512-DqLDDzFbyLuBVYDfrhl4b67LdcbmMzRR+U/DwvXOCc8PqNx6nQoLHnAOpLQN/UP4/P6e7mWaJN9iSjfzg4Q0MQ== dependencies: - "@honkit/html" "^4.0.7" + "@honkit/html" "^4.0.8" kramed "0.5.6" lodash "^4.13.1" -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -2302,12 +2113,12 @@ "@types/node" "*" jest-mock "^27.5.1" -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^29.4.3" + jest-get-type "^29.6.3" "@jest/fake-timers@^26.6.2": version "26.6.2" @@ -2421,12 +2232,12 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.25.16" + "@sinclair/typebox" "^0.27.8" "@jest/source-map@^26.6.2": version "26.6.2" @@ -2573,12 +2384,12 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -2599,11 +2410,6 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -2615,18 +2421,13 @@ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/source-map@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" @@ -2640,15 +2441,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.18": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== @@ -2677,9 +2470,9 @@ integrity sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ== "@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": - version "1.6.2" - resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.2.tgz#c256690f82f2d7d0ffb0b1cdf68dcb1ec86cea28" - integrity sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA== + version "1.6.3" + resolved "https://registry.yarnpkg.com/@lit/reactive-element/-/reactive-element-1.6.3.tgz#25b4eece2592132845d303e091bad9b04cdcfe03" + integrity sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ== dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" @@ -2758,94 +2551,94 @@ integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== dependencies: "@types/mdx" "^2.0.0" - "@types/react" ">=16" - -"@msgpack/msgpack@3.0.0-beta2": - version "3.0.0-beta2" - resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz#5bccee30f84df220b33905e3d8249ba96deca0b7" - integrity sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw== - -"@msgpack/msgpack@^2.7.2": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.8.0.tgz#4210deb771ee3912964f14a15ddfb5ff877e70b9" - integrity sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ== - -"@napi-rs/simple-git-android-arm-eabi@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz#303bea1ec00db24466e3b3ba13de337d87c5371b" - integrity sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g== - -"@napi-rs/simple-git-android-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz#42c8d04287364fd1619002629fa52183dcf462ee" - integrity sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g== - -"@napi-rs/simple-git-darwin-arm64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz#e210808e6d646d6efecea84c67ced8eb44a8f821" - integrity sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ== - -"@napi-rs/simple-git-darwin-x64@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz#d717525c33e0dfd8a6d6215da2fcbc0ad40011e1" - integrity sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA== - -"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz#03e7b2dd299c10e61bbf29f405ea74f6571cf6a1" - integrity sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ== - -"@napi-rs/simple-git-linux-arm64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz#945123f75c9a36fd0364e789ce06cd29a74a43cc" - integrity sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA== - -"@napi-rs/simple-git-linux-arm64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz#2c20a0bff7c08f60b033ed7056dcb07bbbff8310" - integrity sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow== - -"@napi-rs/simple-git-linux-x64-gnu@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz#980e22b7376252a0767298ec801d374d97553da1" - integrity sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw== - -"@napi-rs/simple-git-linux-x64-musl@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz#edca3b2833dc5d3fc9151f5b931f7b14478ccca4" - integrity sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ== + "@types/react" ">=16" -"@napi-rs/simple-git-win32-arm64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz#3ac4c7fe816a2cdafabd091ded76161d1ba1fe88" - integrity sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA== +"@msgpack/msgpack@3.0.0-beta2": + version "3.0.0-beta2" + resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-3.0.0-beta2.tgz#5bccee30f84df220b33905e3d8249ba96deca0b7" + integrity sha512-y+l1PNV0XDyY8sM3YtuMLK5vE3/hkfId+Do8pLo/OPxfxuFAUwcGz3oiiUuV46/aBpwTzZ+mRWVMtlSKbradhw== -"@napi-rs/simple-git-win32-x64-msvc@0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz#3b825bc2cb1c7ff535a3ca03768142d68bbf5c19" - integrity sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew== +"@msgpack/msgpack@^2.7.2": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@msgpack/msgpack/-/msgpack-2.8.0.tgz#4210deb771ee3912964f14a15ddfb5ff877e70b9" + integrity sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ== -"@napi-rs/simple-git@^0.1.8": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.8.tgz#391cb58436d50bd32d924611d45bdc41f5e7607a" - integrity sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA== +"@napi-rs/simple-git-android-arm-eabi@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.9.tgz#0326fbc4ffafb678bda3474018e2a24a8d2a21b6" + integrity sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug== + +"@napi-rs/simple-git-android-arm64@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.9.tgz#4f2c3c3c2c8b6e82999b94dd771ab40c6a9511a4" + integrity sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg== + +"@napi-rs/simple-git-darwin-arm64@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.9.tgz#cea5a57db6a8ee17dc6a368d98b5d04766ddd2cc" + integrity sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA== + +"@napi-rs/simple-git-darwin-x64@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.9.tgz#4106471b4edd2e9876cbd68951855c9a51debf06" + integrity sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA== + +"@napi-rs/simple-git-linux-arm-gnueabihf@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.9.tgz#823ae5f84808b193f3bb0b6491c947ad13a78da8" + integrity sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA== + +"@napi-rs/simple-git-linux-arm64-gnu@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.9.tgz#9489634bf30c5acddcf18d2275e1927447753d40" + integrity sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w== + +"@napi-rs/simple-git-linux-arm64-musl@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.9.tgz#ba1ffae12974539810552c0f3b966298aae3a26d" + integrity sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w== + +"@napi-rs/simple-git-linux-x64-gnu@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.9.tgz#e18cd9059db7313cc2a9bbdc2535b6cac5e80689" + integrity sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw== + +"@napi-rs/simple-git-linux-x64-musl@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.9.tgz#456fba6dd186c25d588390ab42db95ba327028fb" + integrity sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A== + +"@napi-rs/simple-git-win32-arm64-msvc@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.9.tgz#0f1a7048cf891f968ee71138548ccad350dea685" + integrity sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ== + +"@napi-rs/simple-git-win32-x64-msvc@0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.9.tgz#75a5d9c3f41b44221e520824e51befa2dde19688" + integrity sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww== + +"@napi-rs/simple-git@^0.1.9": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.9.tgz#ea730d6202010acae7bb9057d79681424c41fd12" + integrity sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw== optionalDependencies: - "@napi-rs/simple-git-android-arm-eabi" "0.1.8" - "@napi-rs/simple-git-android-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-arm64" "0.1.8" - "@napi-rs/simple-git-darwin-x64" "0.1.8" - "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.8" - "@napi-rs/simple-git-linux-arm64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-arm64-musl" "0.1.8" - "@napi-rs/simple-git-linux-x64-gnu" "0.1.8" - "@napi-rs/simple-git-linux-x64-musl" "0.1.8" - "@napi-rs/simple-git-win32-arm64-msvc" "0.1.8" - "@napi-rs/simple-git-win32-x64-msvc" "0.1.8" - -"@next/env@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.6.tgz#3f2041c7758660d7255707ae4cb9166519113dea" - integrity sha512-nqUxEtvDqFhmV1/awSg0K2XHNwkftNaiUqCYO9e6+MYmqNObpKVl7OgMkGaQ2SZnFx5YqF0t60ZJTlyJIDAijg== + "@napi-rs/simple-git-android-arm-eabi" "0.1.9" + "@napi-rs/simple-git-android-arm64" "0.1.9" + "@napi-rs/simple-git-darwin-arm64" "0.1.9" + "@napi-rs/simple-git-darwin-x64" "0.1.9" + "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.9" + "@napi-rs/simple-git-linux-arm64-gnu" "0.1.9" + "@napi-rs/simple-git-linux-arm64-musl" "0.1.9" + "@napi-rs/simple-git-linux-x64-gnu" "0.1.9" + "@napi-rs/simple-git-linux-x64-musl" "0.1.9" + "@napi-rs/simple-git-win32-arm64-msvc" "0.1.9" + "@napi-rs/simple-git-win32-x64-msvc" "0.1.9" + +"@next/env@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.4.tgz#777c3af16de2cf2f611b6c8126910062d13d222c" + integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ== "@next/eslint-plugin-next@12.3.4": version "12.3.4" @@ -2854,50 +2647,50 @@ dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.6.tgz#47485f3deaee6681b4a4036c74bb9c4b728d5ddd" - integrity sha512-ahi6VP98o4HV19rkOXPSUu+ovfHfUxbJQ7VVJ7gL2FnZRr7onEFC1oGQ6NQHpm8CxpIzSSBW79kumlFMOmZVjg== - -"@next/swc-darwin-x64@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.6.tgz#a6a5b232ec0f2079224fb8ed6bf11dc479af1acf" - integrity sha512-13cXxKFsPJIJKzUqrU5XB1mc0xbUgYsRcdH6/rB8c4NMEbWGdtD4QoK9ShN31TZdePpD4k416Ur7p+deMIxnnA== - -"@next/swc-linux-arm64-gnu@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.6.tgz#2a67144e863d9c45fdbd13c7827370e7f2a28405" - integrity sha512-Ti+NMHEjTNktCVxNjeWbYgmZvA2AqMMI2AMlzkXsU7W4pXCMhrryAmAIoo+7YdJbsx01JQWYVxGe62G6DoCLaA== - -"@next/swc-linux-arm64-musl@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.6.tgz#5a191ac3575a70598e9e9c6e7264fc0b8a90b2db" - integrity sha512-OHoC6gO7XfjstgwR+z6UHKlvhqJfyMtNaJidjx3sEcfaDwS7R2lqR5AABi8PuilGgi0BO0O0sCXqLlpp3a0emQ== - -"@next/swc-linux-x64-gnu@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.6.tgz#d38adf842a8b8f9de492454328fd32a2c53350f3" - integrity sha512-zHZxPGkUlpfNJCboUrFqwlwEX5vI9LSN70b8XEb0DYzzlrZyCyOi7hwDp/+3Urm9AB7YCAJkgR5Sp1XBVjHdfQ== - -"@next/swc-linux-x64-musl@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.6.tgz#74c745774358b78be7f958e7a8b7d93936cd6ebc" - integrity sha512-K/Y8lYGTwTpv5ME8PSJxwxLolaDRdVy+lOd9yMRMiQE0BLUhtxtCWC9ypV42uh9WpLjoaD0joOsB9Q6mbrSGJg== - -"@next/swc-win32-arm64-msvc@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.6.tgz#1e1e02c175573e64808fc1a7e8650e3e217f1edc" - integrity sha512-U6LtxEUrjBL2tpW+Kr1nHCSJWNeIed7U7l5o7FiKGGwGgIlFi4UHDiLI6TQ2lxi20fAU33CsruV3U0GuzMlXIw== - -"@next/swc-win32-ia32-msvc@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.6.tgz#2b528ae3ec7f6e727f4f0d81a1015f63da55c7a6" - integrity sha512-eEBeAqpCfhdPSlCZCayjCiyIllVqy4tcqvm1xmg3BgJG0G5ITiMM4Cw2WVeRSgWDJqQGRyyb+q8Y2ltzhXOWsQ== - -"@next/swc-win32-x64-msvc@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.6.tgz#38620bd68267ff13e50ecd432f1822eac51382a8" - integrity sha512-OrZs94AuO3ZS5tnqlyPRNgfWvboXaDQCi5aXGve3o3C+Sj0ctMUV9+Do+0zMvvLRumR8E0PTWKvtz9n5vzIsWw== +"@next/swc-darwin-arm64@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz#241957774fef3f876dc714cfc0ca6f00f561737e" + integrity sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w== + +"@next/swc-darwin-x64@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz#fa11bb97bf06cd45cbd554354b46bf93e22c025b" + integrity sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw== + +"@next/swc-linux-arm64-gnu@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz#dd3a482cd6871ed23b049066a0f3c4c2f955dc88" + integrity sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w== + +"@next/swc-linux-arm64-musl@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz#ed6d7abaf5712cff2752ce5300d6bacc6aff1b18" + integrity sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg== + +"@next/swc-linux-x64-gnu@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz#977a040388e8a685a3a85e0dbdff90a4ee2a7189" + integrity sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg== + +"@next/swc-linux-x64-musl@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz#3e29a0ad8efc016196c3a120da04397eea328b2a" + integrity sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg== + +"@next/swc-win32-arm64-msvc@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz#18a236c3fe5a48d24b56d939e6a05488bb682b7e" + integrity sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w== + +"@next/swc-win32-ia32-msvc@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz#255132243ab6fb20d3c7c92a585e2c4fa50368fe" + integrity sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw== + +"@next/swc-win32-x64-msvc@13.5.4": + version "13.5.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz#cc542907b55247c5634d9a8298e1c143a1847e25" + integrity sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg== "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -2987,6 +2780,18 @@ tmp "^0.2.1" uuid "*" +"@perspect3vism/ad4m-executor@link:core": + version "0.6.1-prerelease" + dependencies: + "@apollo/client" "3.7.10" + "@holochain/client" "0.16.0" + "@types/jest" "^26.0.14" + class-validator "^0.13.1" + express "4.18.2" + graphql "15.7.2" + reflect-metadata "^0.1.13" + type-graphql "1.1.1" + "@perspect3vism/ad4m-test@*": version "0.6.0" resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m-test/-/ad4m-test-0.6.0.tgz#a295bc414684b00b63c0f16815b0c63a0ec7804f" @@ -3037,15 +2842,27 @@ reflect-metadata "^0.1.13" type-graphql "1.1.1" +"@perspect3vism/ad4m@link:core": + version "0.6.1-prerelease" + dependencies: + "@apollo/client" "3.7.10" + "@holochain/client" "0.16.0" + "@types/jest" "^26.0.14" + class-validator "^0.13.1" + express "4.18.2" + graphql "15.7.2" + reflect-metadata "^0.1.13" + type-graphql "1.1.1" + "@perspect3vism/rollup-plugin-dna@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@perspect3vism/rollup-plugin-dna/-/rollup-plugin-dna-0.0.2.tgz#d8a1a99677877b3f090f228c3b5937d4f0aa758b" integrity sha512-+18Prdkzv1dcEzyWIp/DersXHcfpU6rDxDPdXGtfzB/ritepc7ehYSN60E94uNNzuOy7QaK4p2YL3DPPkgsb8g== "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": - version "0.5.10" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" - integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + version "0.5.11" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz#7c2268cedaa0644d677e8c4f377bc8fb304f714a" + integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== dependencies: ansi-html-community "^0.0.8" common-path-prefix "^3.0.0" @@ -3057,16 +2874,11 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.11.6": +"@popperjs/core@^2.11.6", "@popperjs/core@^2.9.2": version "2.11.8" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== -"@popperjs/core@^2.9.2": - version "2.11.6" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" - integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== - "@preact/preset-vite@^2.4.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@preact/preset-vite/-/preset-vite-2.5.0.tgz#6ff815558c16062a36e2d5da4b1225d7b216478d" @@ -3087,9 +2899,9 @@ integrity sha512-joAwpkUDwo7ZqJnufXRGzUb+udk20RBgfA8oLPBh5aJH2LeStmV1luBfeJTztPdyCscC2j2SmZ/tVxFRMIxAEw== "@prefresh/core@^1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@prefresh/core/-/core-1.5.1.tgz#2f51c0dd509a7b302d67ee889815653abdf4c0d1" - integrity sha512-e0mB0Oxtog6ZpKPDBYbzFniFJDIktuKMzOHp7sguntU+ot0yi6dbhJRE9Css1qf0u16wdSZjpL2W2ODWuU05Cw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@prefresh/core/-/core-1.5.2.tgz#750e1936d82f3b0a1199d3cda5c35e3443128490" + integrity sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA== "@prefresh/utils@^1.2.0": version "1.2.0" @@ -3097,15 +2909,15 @@ integrity sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ== "@prefresh/vite@^2.2.8", "@prefresh/vite@^2.2.9": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@prefresh/vite/-/vite-2.4.0.tgz#53fd34b8df21e4e4b03f5147a3277bb3395411d0" - integrity sha512-makifAztmlWCMx79E8tl/gMKPKe3WartplGk+GTqtXSZ/JqoTiN4nkF9GqlhATqGEvsdtRnlDGKQ09s7fneJ/Q== + version "2.4.1" + resolved "https://registry.yarnpkg.com/@prefresh/vite/-/vite-2.4.1.tgz#c565ae2f8ec2c5ea03611969810dd02a779c2581" + integrity sha512-vthWmEqu8TZFeyrBNc9YE5SiC3DVSzPgsOCp/WQ7FqdHpOIJi7Z8XvCK06rBPOtG4914S52MjG9Ls22eVAiuqQ== dependencies: - "@babel/core" "^7.9.6" + "@babel/core" "^7.22.1" "@prefresh/babel-plugin" "0.5.0" "@prefresh/core" "^1.5.1" "@prefresh/utils" "^1.2.0" - "@rollup/pluginutils" "^4.1.0" + "@rollup/pluginutils" "^4.2.1" "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" @@ -3160,10 +2972,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@remix-run/router@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.3.tgz#8205baf6e17ef93be35bf62c37d2d594e9be0dad" - integrity sha512-EXJysQ7J3veRECd0kZFQwYYd5sJMcq2O/m60zu1W2l3oVQ9xtub8jTOtYRE0+M2iomyG/W3Ps7+vp2kna0C27Q== +"@remix-run/router@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" + integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== "@rollup/plugin-alias@^3.1.5": version "3.1.9" @@ -3220,9 +3032,9 @@ resolve "^1.17.0" "@rollup/plugin-commonjs@^25.0.4": - version "25.0.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz#a7547a0c4ec3fa79818eb313e1de0023e548f4e6" - integrity sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ== + version "25.0.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.5.tgz#0bac8f985a5de151b4b09338847f8c7f20a28a29" + integrity sha512-xY8r/A9oisSeSuLCTfhssyDjo9Vp/eDiRLXkg1MXCcEEgEjPmLU+ZyDB20OOD0NlyDa/8SGbK5uIggF5XTx77w== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" @@ -3263,9 +3075,9 @@ resolve "^1.19.0" "@rollup/plugin-node-resolve@^15.2.1": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz#a15b14fb7969229e26a30feff2816d39eff503f0" - integrity sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w== + version "15.2.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9" + integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ== dependencies: "@rollup/pluginutils" "^5.0.1" "@types/resolve" "1.20.2" @@ -3296,9 +3108,9 @@ magic-string "^0.25.7" "@rollup/plugin-typescript@^11.1.0": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.1.tgz#258663a7aa6b51390dd39ae6e5502f2c4b2807cb" - integrity sha512-Ioir+x5Bejv72Lx2Zbz3/qGg7tvGbxQZALCLoJaGrkNXak/19+vKgKYJYM3i/fJxvsb23I9FuFQ8CUBEfsmBRg== + version "11.1.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.5.tgz#039c763bf943a5921f3f42be255895e75764cb91" + integrity sha512-rnMHrGBB0IUEv69Q8/JGRD/n4/n6b3nfpufUu26axhUcboUzv/twfZU8fIBbTOphRAe0v8EyxzeDpKXqGHfyDA== dependencies: "@rollup/pluginutils" "^5.0.1" resolve "^1.22.1" @@ -3320,7 +3132,7 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/pluginutils@^4.1.0", "@rollup/pluginutils@^4.1.1": +"@rollup/pluginutils@^4.1.0", "@rollup/pluginutils@^4.1.1", "@rollup/pluginutils@^4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== @@ -3329,18 +3141,18 @@ picomatch "^2.2.2" "@rollup/pluginutils@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" - integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" + integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" picomatch "^2.3.1" "@rushstack/eslint-patch@^1.1.0", "@rushstack/eslint-patch@^1.1.3": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.1.tgz#edbb85ff95f3be41eaa70c6d6ad6d8ba0a9c7e46" - integrity sha512-RkmuBcqiNioeeBKbgzMlOdreUkJfYaSjwgx9XDgGGpjvWgyaxWvDmZVSN9CS6LjEASadhgPv2BcFp+SeouWXXA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz#5f1b518ec5fa54437c0b7c4a821546c64fed6922" + integrity sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA== "@samverschueren/stream-to-observable@^0.3.0", "@samverschueren/stream-to-observable@^0.3.1": version "0.3.1" @@ -3354,10 +3166,10 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -3395,10 +3207,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^10.0.2", "@sinonjs/fake-timers@^10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194" - integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg== +"@sinonjs/fake-timers@^10.0.2", "@sinonjs/fake-timers@^10.3.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" @@ -3695,10 +3507,10 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/helpers@0.5.1": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" - integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== +"@swc/helpers@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== dependencies: tslib "^2.4.0" @@ -3716,15 +3528,10 @@ dependencies: defer-to-connect "^2.0.0" -"@tauri-apps/api@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.3.0.tgz#d0c853ab2cc7506bd826c5f7f260c67c7c15def5" - integrity sha512-AH+3FonkKZNtfRtGrObY38PrzEj4d+1emCbwNGu0V2ENbXjlLHMZQlUh+Bhu/CRmjaIwZMGJ3yFvWaZZgTHoog== - -"@tauri-apps/api@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.4.0.tgz#b4013ca3d17b853f7df29fe14079ebb4d52dbffa" - integrity sha512-Jd6HPoTM1PZSFIzq7FB8VmMu3qSSyo/3lSwLpoapW+lQ41CL5Dow2KryLg+gyazA/58DRWI9vu/XpEeHK4uMdw== +"@tauri-apps/api@^1.2.0", "@tauri-apps/api@^1.4.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.5.0.tgz#46a0f9b6edd4bfc39be32afc4ad242e0b8cca3ea" + integrity sha512-yQY9wpVNuiYhLLuyDlu1nBpqJELT1fGp7OctN4rW9I2W1T2p7A3tqPxsEzQprEwneQRBAlPM9vC8NsnMbct+pg== "@tauri-apps/cli-darwin-arm64@1.4.0": version "1.4.0" @@ -3793,23 +3600,23 @@ "@tauri-apps/cli-win32-x64-msvc" "1.4.0" "@testing-library/dom@^8.0.0": - version "8.20.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.0.tgz#914aa862cef0f5e89b98cc48e3445c4c921010f6" - integrity sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA== + version "8.20.1" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "^5.0.0" + aria-query "5.1.3" chalk "^4.1.0" dom-accessibility-api "^0.5.9" - lz-string "^1.4.4" + lz-string "^1.5.0" pretty-format "^27.0.2" "@testing-library/jest-dom@^5.16.2": - version "5.16.5" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz#3912846af19a29b2dbf32a6ae9c31ef52580074e" - integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + version "5.17.0" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz#5e97c8f9a15ccf4656da00fecab505728de81e0c" + integrity sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg== dependencies: "@adobe/css-tools" "^4.0.1" "@babel/runtime" "^7.9.2" @@ -3857,13 +3664,21 @@ traverse "^0.6.7" unified "^9.2.2" -"@theguild/remark-mermaid@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@theguild/remark-mermaid/-/remark-mermaid-0.0.1.tgz#984f0f03bee4809cde02abbe4dbdbc192c806109" - integrity sha512-MbLi7CIn25r0MypN1yaTrvuQHBE/UXy/DKfVjaLlXx5ut4PasOwzGIJihzM4d9kqNADJKilHpQWcd66ivbvJEQ== +"@theguild/remark-mermaid@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@theguild/remark-mermaid/-/remark-mermaid-0.0.5.tgz#0f95671d247381f416e528e937be08bb7a695224" + integrity sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw== dependencies: - mermaid "10.2.1" - unist-util-visit "4.1.2" + mermaid "^10.2.2" + unist-util-visit "^5.0.0" + +"@theguild/remark-npm2yarn@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@theguild/remark-npm2yarn/-/remark-npm2yarn-0.2.1.tgz#63bf5a8c85d7fe505d4808812dbc56d9c2ce00f8" + integrity sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA== + dependencies: + npm-to-yarn "^2.1.0" + unist-util-visit "^5.0.0" "@tootallnate/once@1": version "1.1.2" @@ -4026,14 +3841,14 @@ "@types/estree" "*" "@types/aria-query@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" - integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" + integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -4042,28 +3857,36 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: "@babel/types" "^7.20.7" -"@types/body-parser@*", "@types/body-parser@1.19.2": +"@types/body-parser@*": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/body-parser@1.19.2": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== @@ -4072,9 +3895,9 @@ "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" + integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== dependencies: "@types/node" "*" @@ -4089,29 +3912,29 @@ "@types/responselike" "^1.0.0" "@types/chai-as-promised@*": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" - integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1" + integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA== dependencies: "@types/chai" "*" "@types/chai@*": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" - integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + version "4.3.6" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" + integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== "@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" @@ -4120,40 +3943,57 @@ resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== +"@types/d3-scale-chromatic@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" + integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== + +"@types/d3-scale@^4.0.3": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.5.tgz#daa4faa5438315a37a1f5eb1bcdc5aeb3d3e5a2d" + integrity sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA== + dependencies: + "@types/d3-time" "*" + +"@types/d3-time@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.1.tgz#f0c8f9037632cc4511ae55e7e1459dcb95fb3619" + integrity sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA== + "@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" + integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" + integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.40.0.tgz#ae73dc9ec5237f2794c4f79efd6a4c73b13daf23" - integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== + version "8.44.3" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" + integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree-jsx@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" - integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.1.tgz#cc26c8566c67f27795bbc025f57cf0499d7cedd6" + integrity sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ== dependencies: "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" + integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== "@types/estree@0.0.39": version "0.0.39" @@ -4168,9 +4008,9 @@ expect "*" "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + version "4.17.37" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" + integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -4187,9 +4027,9 @@ "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.8": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.18" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" + integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -4227,16 +4067,23 @@ "@types/node" "*" "@types/graceful-fs@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" + integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== dependencies: "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + dependencies: + "@types/unist" "^2" + +"@types/hast@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.1.tgz#e1705ec9258ac4885659c2d50bac06b4fcd16466" + integrity sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ== dependencies: "@types/unist" "*" @@ -4246,21 +4093,26 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" + integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + +"@types/http-errors@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.12" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" + integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== dependencies: "@types/node" "*" "@types/is-ci@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.0.tgz#7e8910af6857601315592436f030aaa3ed9783c3" - integrity sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.1.tgz#802da8f2376d9bf5c20ac17c9f869aed2b532297" + integrity sha512-mnb1ngaGQPm6LFZaNdh3xPOoQMkrQb/KBPhPPN2p2Wk8XgeUqWj6xPnvyQ8rvcK/VFritVmQG8tvQuy7g+9/nQ== dependencies: ci-info "^3.1.0" @@ -4270,23 +4122,23 @@ integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" + integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" + integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.5.2" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.2.tgz#86b4afc86e3a8f3005b297ed8a72494f89e6395b" - integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== + version "29.5.5" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" + integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -4308,14 +4160,14 @@ pretty-format "^27.0.0" "@types/js-yaml@^4.0.0", "@types/js-yaml@^4.0.2": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.6.tgz#4b3afd5158b8749095b1f096967b6d0f838d862f" + integrity sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw== "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/json-stable-stringify@^1.0.33": version "1.0.34" @@ -4327,15 +4179,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/katex@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.14.0.tgz#b84c0afc3218069a5ad64fe2a95321881021b5fe" - integrity sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA== - "@types/katex@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.0.tgz#0e640df3647fe237212be863e1f5111eb9754f93" - integrity sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.3.tgz#a341c89705145b7dd8e2a133b282a133eabe6076" + integrity sha512-CeVMX9EhVUW8MWnei05eIRks4D5Wscw/W9Byz1s3PA+yJvcdvq9SaDjiUKvRvEgjpdTyJMjQA43ae4KTwsvOPg== "@types/keyv@^3.1.1", "@types/keyv@^3.1.4": version "3.1.4" @@ -4345,9 +4192,9 @@ "@types/node" "*" "@types/lodash@*": - version "4.14.195" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" - integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + version "4.14.199" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" + integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== "@types/long@^4.0.0": version "4.0.2" @@ -4355,33 +4202,40 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/lowdb@^1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@types/lowdb/-/lowdb-1.0.11.tgz#d8336a635ea0dbd48a7f6f62fb9fccc5ec358ae3" - integrity sha512-h99VMxvTuz+VsXUVCCJo4dsps4vbkXwvU71TpmxDoiBU24bJ0VBygIHgmMm+UPoQIFihmV6euRik4z8J7XDJWg== + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/lowdb/-/lowdb-1.0.12.tgz#e9828264cb5cc5ccd5462c437a9a625d34088f7f" + integrity sha512-m/hOfY7nuwo9V3yApvR6aJ3uZP6iNC74S7Bx5BWz0L7IrzjKyzUur/jEdlYWBWWVjmkCz+ECK9nk8UJoQa8aZw== dependencies: "@types/lodash" "*" "@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + version "3.0.13" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" + integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== + dependencies: + "@types/unist" "^2" + +"@types/mdast@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.1.tgz#9c45e60a04e79f160dcefe6545d28ae536a6ed22" + integrity sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g== dependencies: "@types/unist" "*" "@types/mdx@^2.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.5.tgz#9a85a8f70c7c4d9e695a21d5ae5c93645eda64b1" - integrity sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg== + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.8.tgz#585229ff7057ab30c5e4a23fe126858881d818e5" + integrity sha512-r7/zWe+f9x+zjXqGxf821qz++ld8tp6Z4jUS6qmPZUXH6tfh4riXOhAqb12tWGWAevCFtMt1goLWkQMqIJKpsA== "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== "@types/minimatch@*": version "5.1.2" @@ -4389,32 +4243,32 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" + integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== "@types/mocha@*", "@types/mocha@^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" - integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + version "10.0.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.2.tgz#96d63314255540a36bf24da094cce7a13668d73b" + integrity sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.32" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" + integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== "@types/node-fetch@^2.5.11", "@types/node-fetch@^2.6.1": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" - integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== + version "2.6.6" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" + integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" "@types/node@*", "@types/node@>=6": - version "20.2.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" - integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== + version "20.8.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" + integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== "@types/node@18.11.10": version "18.11.10" @@ -4432,24 +4286,24 @@ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^14.11.2", "@types/node@^14.14.22": - version "14.18.48" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.48.tgz#ee5c7ac6e38fd2a9e6885f15c003464cf2da343c" - integrity sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg== + version "14.18.63" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" + integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== "@types/node@^16.11.26": - version "16.18.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.34.tgz#62d2099b30339dec4b1b04a14c96266459d7c8b2" - integrity sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg== + version "16.18.58" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.58.tgz#bf66f63983104ed57c754f4e84ccaf16f8235adb" + integrity sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA== "@types/node@^18.0.0": - version "18.16.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.16.tgz#3b64862856c7874ccf7439e6bab872d245c86d8e" - integrity sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g== + version "18.18.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.4.tgz#519fef47a13cf869be290c20fc6ae9b7fe887aa7" + integrity sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" + integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== "@types/parse-json@^4.0.0": version "4.0.0" @@ -4462,66 +4316,57 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.8" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" + integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== "@types/pug@^2.0.4": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.6.tgz#f830323c88172e66826d0bde413498b61054b5a6" - integrity sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.7.tgz#ffb9239e4da7ea1af27070cad9343049e440993d" + integrity sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw== "@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + version "1.5.6" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.6.tgz#a6edffe8283910e46dc7a573621f928e6b47fa56" + integrity sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ== "@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.8" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" + integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== "@types/react-dom@<18.0.0": - version "17.0.20" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53" - integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" + integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== dependencies: "@types/react" "^17" "@types/react-dom@^18.0.9": - version "18.2.4" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" - integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== + version "18.2.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58" + integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg== dependencies: "@types/react" "*" -"@types/react@*": - version "18.2.9" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.9.tgz#9207f8571afdc59a9c9c30df50e8ad2591ecefaf" - integrity sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@>=16": - version "18.2.13" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.13.tgz#a98c09bde8b18f80021935b11d2d29ef5f4dcb2f" - integrity sha512-vJ+zElvi/Zn9cVXB5slX2xL8PZodPCwPRDpittQdw43JR2AJ5k3vKdgJJyneV/cYgIbLQUwXa9JVDvUZXGba+Q== +"@types/react@*", "@types/react@>=16": + version "18.2.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199" + integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17", "@types/react@^17.0.40": - version "17.0.60" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.60.tgz#a4a97dcdbebad76612c188fc06440e4995fd8ad2" - integrity sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ== + version "17.0.67" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.67.tgz#1c224738f203829a4692aa48e33a732c34fd014a" + integrity sha512-zE76EIJ0Y58Oy9yDX/9csb/NuKjt0Eq2YgWb/8Wxo91YmuLzzbyiRoaqJE9h8iDlsT7n35GdpoLomHlaB1kFbg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4540,9 +4385,9 @@ integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" + integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== dependencies: "@types/node" "*" @@ -4559,47 +4404,43 @@ sass "*" "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.4.tgz#fedc3e5b15c26dc18faae96bf1317487cb3658cf" + integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== "@types/secp256k1@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.4.tgz#33c760de627fce1f449c2d4270da07e4da54c830" + integrity sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A== dependencies: "@types/node" "*" -"@types/semver@^6.0.0": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-6.2.3.tgz#5798ecf1bec94eaa64db39ee52808ec0693315aa" - integrity sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A== - -"@types/semver@^7.3.12", "@types/semver@^7.3.3": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" - integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== +"@types/semver@^7.3.12", "@types/semver@^7.3.3", "@types/semver@^7.5.0": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.2" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" + integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" + integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== + version "1.15.3" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" + integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== dependencies: + "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" @@ -4611,21 +4452,21 @@ "@types/node" "*" "@types/sinon@*": - version "10.0.15" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.15.tgz#513fded9c3cf85e589bbfefbf02b2a0541186b48" - integrity sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ== + version "10.0.19" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.19.tgz#752b752bc40bb5af0bb1aec29bde49b139b91d35" + integrity sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== + version "8.1.3" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz#575789c5cf6d410cb288b0b4affaf7e6da44ca51" + integrity sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ== "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.34" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" + integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== dependencies: "@types/node" "*" @@ -4635,26 +4476,31 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/testing-library__jest-dom@^5.9.1": - version "5.14.6" - resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" - integrity sha512-FkHXCb+ikSoUP4Y4rOslzTdX5sqYwMxfefKh1GmZ8ce1GOkEHntSp6b5cGadmNfp5e4BMEWOMx+WSKd5/MqlDA== + version "5.14.9" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz#0fb1e6a0278d87b6737db55af5967570b67cb466" + integrity sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw== dependencies: "@types/jest" "*" "@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" + integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.0.tgz#988ae8af1e5239e89f9fbb1ade4c935f4eeedf9a" + integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== + +"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== "@types/unzipper@^0.10.5": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@types/unzipper/-/unzipper-0.10.6.tgz#767101c65fa3968a725c02de11884f75952b091e" - integrity sha512-zcBj329AHgKLQyz209N/S9R0GZqXSkUQO4tJSYE3x02qg4JuDFpgKMj50r82Erk1natCWQDIvSccDddt7jPzjA== + version "0.10.7" + resolved "https://registry.yarnpkg.com/@types/unzipper/-/unzipper-0.10.7.tgz#32efdf299a6f8d76f35c35fe10a91aea4ea57515" + integrity sha512-1yZanW3LWgY4wA6x0MyIkyI5rGILLHjXWAvvuz+xF2JzqBLG26ySL+VrSgjz9EWIYLv+icqv5RPW6FN4BJmsHw== dependencies: "@types/node" "*" @@ -4675,153 +4521,160 @@ dependencies: "@types/node" "*" -"@types/ws@^8.5.1": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== +"@types/ws@^8.5.5": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== dependencies: "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^15.0.0": - version "15.0.15" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" - integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + version "15.0.16" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.16.tgz#258009dc52907e8f03041eb64ffdac297ba4b208" + integrity sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg== dependencies: "@types/yargs-parser" "*" "@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + version "16.0.6" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.6.tgz#cc0c63684d68d23498cf0b5f32aa4c3fb437c638" + integrity sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A== dependencies: "@types/yargs-parser" "*" "@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.28" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" + integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== dependencies: "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + version "2.10.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" + integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== dependencies: "@types/node" "*" "@types/zen-observable@^0.8.0": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" - integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + version "0.8.4" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.4.tgz#e06f78a43387899cfa60c02f166620907fc534c8" + integrity sha512-XWquk4B9Y9bP++I9FsKBVDR+cM1duIqTksuD4l+XUDcqKdngHrtLBe6A5DQX5sdJPWDhLFM9xHZBCiWcecZ0Jg== "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz#2604cfaf2b306e120044f901e20c8ed926debf15" - integrity sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/type-utils" "5.59.9" - "@typescript-eslint/utils" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.9.tgz#e77482a8b70f1a6aa3a1c6a128be4a5e0e6db940" - integrity sha512-eZTK/Ci0QAqNc/q2MqMwI2+QI5ZI9HM12FcfGwbEvKif5ev/CIIYLmrlckvgPrC8XSbl39HtErR5NJiQkRkvWg== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz#14559bf73383a308026b427a4a6129bae2146741" + integrity sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw== dependencies: - "@typescript-eslint/utils" "5.59.9" + "@typescript-eslint/utils" "5.62.0" "@typescript-eslint/parser@^5.21.0", "@typescript-eslint/parser@^5.5.0": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.9.tgz#a85c47ccdd7e285697463da15200f9a8561dd5fa" - integrity sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/typescript-estree" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz#eadce1f2733389cdb58c49770192c0f95470d2f4" - integrity sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/visitor-keys" "5.59.9" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz#53bfaae2e901e6ac637ab0536d1754dfef4dafc2" - integrity sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.59.9" - "@typescript-eslint/utils" "5.59.9" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.9.tgz#3b4e7ae63718ce1b966e0ae620adc4099a6dcc52" - integrity sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz#6bfea844e468427b5e72034d33c9fffc9557392b" - integrity sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/visitor-keys" "5.59.9" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.9", "@typescript-eslint/utils@^5.58.0": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.9.tgz#adee890107b5ffe02cd46fdaa6c2125fb3c6c7c4" - integrity sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg== +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.9" - "@typescript-eslint/types" "5.59.9" - "@typescript-eslint/typescript-estree" "5.59.9" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.59.9": - version "5.59.9" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz#9f86ef8e95aca30fb5a705bb7430f95fc58b146d" - integrity sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.59.9" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" "@undecaf/barcode-detector-polyfill@^0.9.15": + version "0.9.20" + resolved "https://registry.yarnpkg.com/@undecaf/barcode-detector-polyfill/-/barcode-detector-polyfill-0.9.20.tgz#7fcc284a675c0b861f3d8323d882e948081e4201" + integrity sha512-fD/7WjfhhCPJjNzVUyP1TNv29YzrsD6DO9mTdH5Xi9fbpg4VJdsqjiFxkat4//j7Y2xEADXIxzC/SvGdjMxDng== + dependencies: + "@undecaf/zbar-wasm" "^0.9.15" + +"@undecaf/zbar-wasm@^0.9.12", "@undecaf/zbar-wasm@^0.9.15": version "0.9.16" - resolved "https://registry.yarnpkg.com/@undecaf/barcode-detector-polyfill/-/barcode-detector-polyfill-0.9.16.tgz#3033d55536e720ddc28e590bfccc2efdefc0bea5" - integrity sha512-wijWm5sHavKBpd0TWuQ++5XEFf9E+8zmrD5ezGJipNj+SbziKm2MQqNRAOpGN+LHGYHF00MwEJafYxNz3LWzkA== + resolved "https://registry.yarnpkg.com/@undecaf/zbar-wasm/-/zbar-wasm-0.9.16.tgz#ba404602ec90ae20b05fe83c8a68a4c50951f643" + integrity sha512-T5PcT6g+tLScGjR4WmnRErNvfKqEc3kRg2ux14wHmIDNbvNeXa0BkFK19PRK/jb6zGy5NyWtn4ko6KeNuZc/fQ== dependencies: - "@undecaf/zbar-wasm" "^0.9.12" + jschardet "^3.0.0" -"@undecaf/zbar-wasm@^0.9.12": - version "0.9.13" - resolved "https://registry.yarnpkg.com/@undecaf/zbar-wasm/-/zbar-wasm-0.9.13.tgz#dc17280770a8d075205c32dd4d1ce95faec0546f" - integrity sha512-Xl4eyfU8nwtTHF4Wi0Qyklq8BC6BmW++GYlN0gCeIgrqeIDmV7xp3nNpIN4fQpIbdvq3lvgnvVcBKAiYn9FvzA== +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@vitejs/plugin-react-refresh@^1.3.6": version "1.3.6" @@ -5079,21 +4932,11 @@ acorn@^7.0.0, acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" - integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== - -acorn@^8.10.0, acorn@^8.9.0: +acorn@^8.0.0, acorn@^8.10.0, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - address@^1.0.1, address@^1.1.2: version "1.2.2" resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" @@ -5141,7 +4984,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -5245,9 +5088,9 @@ ansi-regex@^6.0.1: integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-sequence-parser@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" - integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== ansi-styles@^2.2.1: version "2.2.1" @@ -5404,7 +5247,7 @@ apollo-reporting-protobuf@^3.4.0: dependencies: "@apollo/protobufjs" "1.2.6" -apollo-server-core@3.12.0, apollo-server-core@^3.12.0: +apollo-server-core@3.12.0: version "3.12.0" resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.12.0.tgz#8aa2a7329ce6fe1823290c45168c749db01548df" integrity sha512-hq7iH6Cgldgmnjs9FVSZeKWRpi0/ZR+iJ1arzeD2VXGxxgk1mAm/cz1Tx0TYgegZI+FvvrRl0UhKEx7sLnIxIg== @@ -5433,6 +5276,35 @@ apollo-server-core@3.12.0, apollo-server-core@^3.12.0: uuid "^9.0.0" whatwg-mimetype "^3.0.0" +apollo-server-core@^3.12.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.12.1.tgz#ba255c37345db29c48a2e0c064c519a8d62eb5af" + integrity sha512-9SF5WAkkV0FZQ2HVUWI9Jada1U0jg7e8NCN9EklbtvaCeUlOLyXyM+KCWuZ7+dqHxjshbtcwylPHutt3uzoNkw== + dependencies: + "@apollo/utils.keyvaluecache" "^1.0.1" + "@apollo/utils.logger" "^1.0.0" + "@apollo/utils.usagereporting" "^1.0.0" + "@apollographql/apollo-tools" "^0.5.3" + "@apollographql/graphql-playground-html" "1.6.29" + "@graphql-tools/mock" "^8.1.2" + "@graphql-tools/schema" "^8.0.0" + "@josephg/resolvable" "^1.0.0" + apollo-datasource "^3.3.2" + apollo-reporting-protobuf "^3.4.0" + apollo-server-env "^4.2.1" + apollo-server-errors "^3.3.1" + apollo-server-plugin-base "^3.7.2" + apollo-server-types "^3.8.0" + async-retry "^1.2.1" + fast-json-stable-stringify "^2.1.0" + graphql-tag "^2.11.0" + loglevel "^1.6.8" + lru-cache "^6.0.0" + node-abort-controller "^3.0.1" + sha.js "^2.4.11" + uuid "^9.0.0" + whatwg-mimetype "^3.0.0" + apollo-server-env@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" @@ -5489,8 +5361,9 @@ apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: ts-invariant "^0.4.0" tslib "^1.10.0" -appdata-path@perspect3vism/appdata-path: +"appdata-path@github:perspect3vism/appdata-path", appdata-path@perspect3vism/appdata-path: version "1.0.0" + uid "6304ea16cbfebc98749c33941d643c3046b45985" resolved "https://codeload.github.com/perspect3vism/appdata-path/tar.gz/6304ea16cbfebc98749c33941d643c3046b45985" aproba@^1.0.3: @@ -5538,14 +5411,14 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.0.0, aria-query@^5.1.3: - version "5.2.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.2.1.tgz#bc285d9d654d1df121bcd0c134880d415ca67c15" - integrity sha512-7uFg4b+lETFgdaJyETnILsXgnnzVnkHcgRbwbPwevm5x/LmUlt3MjczMRe1zg824iBgXZNRPTBftNYyRSKLp2g== +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" -aria-query@^5.3.0: +aria-query@^5.0.0, aria-query@^5.1.3, aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== @@ -5609,15 +5482,15 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.4, array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -5630,47 +5503,71 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.2.5, array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== +array.prototype.reduce@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" + integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" @@ -5730,12 +5627,12 @@ assert-plus@1.0.0, assert-plus@^1.0.0: integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assert@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" + integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== dependencies: - object-assign "^4.1.1" - util "0.10.3" + object.assign "^4.1.4" + util "^0.10.4" assertion-error@^1.1.0: version "1.1.0" @@ -5781,6 +5678,13 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -5802,13 +5706,13 @@ auto-bind@^5.0.1: integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== autoprefixer@^10.4.13: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" @@ -5829,9 +5733,9 @@ aws4@^1.8.0: integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + version "4.8.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" + integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== axobject-query@^3.1.1, axobject-query@^3.2.1: version "3.2.1" @@ -5946,29 +5850,29 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" + integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.32.2" -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" + "@babel/helper-define-polyfill-provider" "^0.4.2" babel-plugin-transform-hook-names@^1.0.2: version "1.0.2" @@ -6160,13 +6064,14 @@ better-path-resolve@1.0.0: is-windows "^1.0.0" bfj@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" - integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== dependencies: - bluebird "^3.5.5" - check-types "^11.1.1" + bluebird "^3.7.2" + check-types "^11.2.3" hoopy "^0.1.4" + jsonpath "^1.1.1" tryer "^1.0.1" big-integer@^1.6.17, big-integer@^1.6.48: @@ -6180,9 +6085,9 @@ big.js@^5.2.2: integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" - integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== binary-extensions@^2.0.0: version "2.2.0" @@ -6197,7 +6102,7 @@ binary@~0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" -bluebird@^3.5.5: +bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -6504,25 +6409,15 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== - dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" node-releases "^2.0.13" - update-browserslist-db "^1.0.11" + update-browserslist-db "^1.0.13" bs-logger@0.x: version "0.2.6" @@ -6751,20 +6646,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: - version "1.0.30001495" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz#64a0ccef1911a9dcff647115b4430f8eff1ef2d9" - integrity sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg== - -caniuse-lite@^1.0.30001406: - version "1.0.30001505" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001505.tgz#10a343e49d31cbbfdae298ef73cb0a9f46670dc5" - integrity sha512-jaAOR5zVtxHfL0NjZyflVTtXm3D3J9P15zSJ7HmQF8dSKGA6tqzQq+0ZI3xkjyQj46I4/M0K2GbMpcAFOcbr3A== - -caniuse-lite@^1.0.30001517: - version "1.0.30001527" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz#813826554828245ccee776c850566dce12bdeaba" - integrity sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001546" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz#10fdad03436cfe3cc632d3af7a99a0fb497407f0" + integrity sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== canonicalize@^1.0.1, canonicalize@^1.0.3: version "1.0.8" @@ -6821,17 +6706,17 @@ chai-as-promised@*: check-error "^1.0.2" chai@*: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + version "4.3.10" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" + integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" chainsaw@~0.1.0: version "0.1.0" @@ -6954,15 +6839,17 @@ charenc@0.0.2: resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" -check-types@^11.1.1: - version "11.2.2" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.2.tgz#7afc0b6a860d686885062f2dba888ba5710335b4" - integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== cheerio-select@^1.5.0: version "1.6.0" @@ -7044,9 +6931,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.1.0, ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -7185,10 +7072,10 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== co@^4.6.0: version "4.6.0" @@ -7221,9 +7108,9 @@ code-red@^1.0.3: periscopic "^3.1.0" collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -7402,9 +7289,9 @@ compression@^1.7.4: vary "~1.1.2" compute-scroll-into-view@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz#c418900a5c56e2b04b885b54995df164535962b1" - integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A== + version "3.1.0" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz#753f11d972596558d8fe7c6bcbc8497690ab4c87" + integrity sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== concat-map@0.0.1: version "0.0.1" @@ -7517,6 +7404,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + convert-source-map@~1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" @@ -7542,17 +7434,17 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== +core-js-compat@^3.31.0, core-js-compat@^3.32.2: + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" + integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== dependencies: - browserslist "^4.21.5" + browserslist "^4.22.1" core-js-pure@^3.23.3: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e" - integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.0.tgz#938a28754b4d82017a7a8cbd2727b1abecc63591" + integrity sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg== core-js@^2.4.0: version "2.6.12" @@ -7560,9 +7452,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.19.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" - integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" + integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== core-util-is@1.0.2: version "1.0.2" @@ -7687,11 +7579,11 @@ create-require@^1.1.0: integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-fetch@^3.1.4: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== dependencies: - node-fetch "^2.6.11" + node-fetch "^2.6.12" cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" @@ -7770,9 +7662,9 @@ css-declaration-sorter@^4.0.1: timsort "^0.3.0" css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== + version "6.4.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz#28beac7c20bad7f1775be3a7129d7eae409a3a71" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== css-has-pseudo@^3.0.4: version "3.0.4" @@ -7909,9 +7801,9 @@ css.escape@^1.5.1: integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== cssdb@^7.1.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.6.0.tgz#beac8f7a5f676db62d3c33da517ef4c9eb008f8b" - integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== + version "7.8.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.8.0.tgz#ac41fa025371b74eb2ccfe3d41f5c4dbd444fbe3" + integrity sha512-SkeezZOQr5AHt9MgJgSFNyiuJwg1p8AwoVln6JwaQJsyxduRW9QJ+HP/gAQzbsz8SIqINtYvpJKjxTRI67zxLg== cssesc@^3.0.0: version "3.0.0" @@ -8121,13 +8013,20 @@ cytoscape-fcose@^2.1.0: cose-base "^2.2.0" cytoscape@^3.23.0: - version "3.25.0" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.25.0.tgz#5289e9d18be0293b073bfe93f83bb95b908b2dc1" - integrity sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q== + version "3.26.0" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.26.0.tgz#b4c6961445fd51e1fd3cca83c3ffe924d9a8abc9" + integrity sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w== dependencies: heap "^0.2.6" lodash "^4.17.21" +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" @@ -8244,6 +8143,11 @@ d3-hierarchy@3: dependencies: d3-color "1 - 3" +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + "d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" @@ -8264,6 +8168,14 @@ d3-random@3: resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + d3-scale-chromatic@3: version "3.0.0" resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" @@ -8295,6 +8207,13 @@ d3-shape@3: dependencies: d3-path "^3.1.0" +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + "d3-time-format@2 - 4", d3-time-format@4: version "4.1.0" resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" @@ -8417,9 +8336,9 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== dayjs@^1.11.7: - version "1.11.8" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" - integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: version "2.6.9" @@ -8496,13 +8415,37 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-eql@^4.1.2: +deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" +deep-equal@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" + integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.1" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-extend@^0.6.0, deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -8547,16 +8490,26 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -8703,6 +8656,13 @@ detective@^5.2.0: defined "^1.0.0" minimist "^1.2.6" +devlop@^1.0.0, devlop@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== + dependencies: + dequal "^2.0.0" + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -8718,10 +8678,10 @@ diff-sequences@^27.5.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@5.0.0: version "5.0.0" @@ -8775,9 +8735,9 @@ dns-equal@^1.0.0: integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" @@ -8896,10 +8856,10 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.3.tgz#4b115d15a091ddc96f232bcef668550a2f6f1430" - integrity sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ== +dompurify@^3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.6.tgz#925ebd576d54a9531b5d76f0a5bef32548351dae" + integrity sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w== domutils@^1.7.0: version "1.7.0" @@ -8996,15 +8956,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.411: - version "1.4.425" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz#399df13091b836d28283a545c25c8e4d9da86da8" - integrity sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg== - -electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== +electron-to-chromium@^1.4.535: + version "1.4.544" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz#fcb156d83f0ee6e4c9d030c6fedb2a37594f3abf" + integrity sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w== electron@^20.0.3: version "20.3.12" @@ -9095,20 +9050,21 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.14.1: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" enquirer@^2.3.0: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" entities@^1.1.1: version "1.1.2" @@ -9126,9 +9082,9 @@ entities@^3.0.1: integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== entities@^4.2.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== env-paths@^2.2.0: version "2.2.1" @@ -9164,18 +9120,19 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== +es-abstract@^1.17.2, es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -9190,29 +9147,68 @@ es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21 is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.11" es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -9399,33 +9395,33 @@ esbuild@^0.15.5: esbuild-windows-64 "0.15.18" esbuild-windows-arm64 "0.15.18" -esbuild@^0.17.5: - version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== +esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" escalade@^3.1.1: version "3.1.1" @@ -9467,15 +9463,26 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -9504,9 +9511,9 @@ eslint-config-next@^12.0.8: eslint-plugin-react-hooks "^4.5.0" eslint-config-prettier@^8.3.0: - version "8.8.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz#bfda738d412adc917fd7b038857110efe98c9348" - integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-config-react-app@^7.0.1: version "7.0.1" @@ -9529,13 +9536,13 @@ eslint-config-react-app@^7.0.1: eslint-plugin-testing-library "^5.0.1" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-import-resolver-typescript@^2.7.1: version "2.7.1" @@ -9548,7 +9555,7 @@ eslint-import-resolver-typescript@^2.7.1: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-module-utils@^2.7.4: +eslint-module-utils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== @@ -9564,25 +9571,27 @@ eslint-plugin-flowtype@^8.0.3: string-natural-compare "^3.0.1" eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.26.0: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + version "2.28.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz#63b8b5b3c409bfc75ebaf8fb206b07ab435482c4" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== dependencies: array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" array.prototype.flat "^1.3.1" array.prototype.flatmap "^1.3.1" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" + eslint-module-utils "^2.8.0" has "^1.0.3" - is-core-module "^2.11.0" + is-core-module "^2.13.0" is-glob "^4.0.3" minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" + semver "^6.3.1" + tsconfig-paths "^3.14.2" eslint-plugin-jest@^25.3.0: version "25.7.0" @@ -9639,14 +9648,15 @@ eslint-plugin-react@7.28.0: string.prototype.matchall "^4.0.6" eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.31.7: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -9656,13 +9666,13 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.31.7: object.values "^1.1.6" prop-types "^15.8.1" resolve "^2.0.0-next.4" - semver "^6.3.0" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: - version "5.11.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz#0bad7668e216e20dd12f8c3652ca353009163121" - integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q== + version "5.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" + integrity sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw== dependencies: "@typescript-eslint/utils" "^5.58.0" @@ -9674,10 +9684,10 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" - integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -9687,10 +9697,10 @@ eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-webpack-plugin@^3.1.1: version "3.2.0" @@ -9704,26 +9714,26 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^4.0.0" eslint@^8.3.0: - version "8.42.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291" - integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== + version "8.51.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" + integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.42.0" - "@humanwhocodes/config-array" "^0.11.10" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.51.0" + "@humanwhocodes/config-array" "^0.11.11" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -9733,7 +9743,6 @@ eslint@^8.3.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -9743,9 +9752,8 @@ eslint@^8.3.0: lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" esm@^3.2.25: @@ -9769,15 +9777,20 @@ esmify@^2.1.1: duplexer2 "^0.1.4" through2 "^2.0.5" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -9797,7 +9810,7 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" -estraverse@^4.1.1: +estraverse@^4.1.1, estraverse@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== @@ -9987,15 +10000,15 @@ expand-brackets@^2.1.4: to-regex "^3.0.1" expect@*, expect@^29.0.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" expect@^26.6.2: version "26.6.2" @@ -10145,9 +10158,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -10378,11 +10391,12 @@ flat-cache@^2.0.1: write "1.0.3" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -10395,12 +10409,12 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -flexsearch@^0.7.21: +flexsearch@^0.7.31: version "0.7.31" resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.31.tgz#065d4110b95083110b9b6c762a71a77cc52e4702" integrity sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA== @@ -10411,9 +10425,9 @@ focus-visible@^5.2.0: integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== follow-redirects@^1.0.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -10460,6 +10474,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -10486,10 +10509,10 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +fraction.js@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== fragment-cache@^0.2.1: version "0.2.1" @@ -10562,9 +10585,9 @@ fs-minipass@^1.2.7: minipass "^2.6.0" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -10572,9 +10595,9 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.1.2, fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== fstream@^1.0.12: version "1.0.12" @@ -10591,17 +10614,17 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2, functions-have-names@^1.2.3: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -10649,12 +10672,12 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.0, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -10932,9 +10955,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -11081,12 +11104,12 @@ handle-thing@^2.0.0: integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== handlebars@^4.1.0, handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -11213,11 +11236,9 @@ has-yarn@^2.1.0: integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hash-base@^3.0.0: version "3.1.0" @@ -11245,62 +11266,83 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hast-util-from-dom@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz#25836ddecc3cc0849d32749c2a7aec03e94b59a7" - integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== +hast-util-from-dom@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz#d32edd25bf28f4b178b5ae318f8d05762e67bd16" + integrity sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg== dependencies: - hastscript "^7.0.0" + "@types/hast" "^3.0.0" + hastscript "^8.0.0" web-namespaces "^2.0.0" -hast-util-from-html-isomorphic@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz#592b2bea880d476665b76ca1cf7d1a94925c80ec" - integrity sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw== +hast-util-from-html-isomorphic@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz#b31baee386a899a2472326a3c5692f29f86d1d3c" + integrity sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw== dependencies: - "@types/hast" "^2.0.0" - hast-util-from-dom "^4.0.0" - hast-util-from-html "^1.0.0" - unist-util-remove-position "^4.0.0" + "@types/hast" "^3.0.0" + hast-util-from-dom "^5.0.0" + hast-util-from-html "^2.0.0" + unist-util-remove-position "^5.0.0" -hast-util-from-html@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz#2482fd701b2d8270b912b3909d6fb645d4a346cf" - integrity sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A== +hast-util-from-html@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz#9cd38ee81bf40b2607368b92a04b0905fa987488" + integrity sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g== dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^7.0.0" + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" parse5 "^7.0.0" - vfile "^5.0.0" - vfile-message "^3.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" -hast-util-from-parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" - integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hastscript "^7.0.0" + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" property-information "^6.0.0" - vfile "^5.0.0" - vfile-location "^4.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" web-namespaces "^2.0.0" -hast-util-is-element@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" - integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== +hast-util-is-element@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" + "@types/hast" "^3.0.0" -hast-util-parse-selector@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" - integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== dependencies: - "@types/hast" "^2.0.0" + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" hast-util-to-estree@^2.0.0: version "2.3.3" @@ -11323,29 +11365,42 @@ hast-util-to-estree@^2.0.0: unist-util-position "^4.0.0" zwitch "^2.0.0" -hast-util-to-text@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" - integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hast-util-is-element "^2.0.0" - unist-util-find-after "^4.0.0" + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-text@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz#7f33a45d0bf7981ead44e82d9d8d75f511b3642f" + integrity sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + hast-util-is-element "^3.0.0" + unist-util-find-after "^5.0.0" hast-util-whitespace@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== -hastscript@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" - integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== dependencies: - "@types/hast" "^2.0.0" + "@types/hast" "^3.0.0" comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^3.0.0" + hast-util-parse-selector "^4.0.0" property-information "^6.0.0" space-separated-tokens "^2.0.0" @@ -11386,14 +11441,14 @@ hoist-non-react-statics@^3.3.2: react-is "^16.7.0" honkit@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/honkit/-/honkit-4.0.7.tgz#dd1480721f0a4980418465e59a8211a9c5de1a3e" - integrity sha512-E6+OQ+vrR7Ig2cJyoNwnYtmRQQD/IzPgZJwlv9gmYQ5OIc6DfpcuS32f2Dfwis5AVMa7nwKcpmwO07e+X2JFUw== + version "4.0.8" + resolved "https://registry.yarnpkg.com/honkit/-/honkit-4.0.8.tgz#3fe553acaea888e764fb2d476c8baf5ebf82de24" + integrity sha512-CCD6+HTOvgta4VO1HsWUq/Qp+C7PPnwUH5O1xQx0hLjKh5zeBkeu1r1AOa+Ez1QltoAHrdK2RPxkQ5hsnQnDrQ== dependencies: - "@honkit/asciidoc" "^4.0.7" - "@honkit/honkit-plugin-highlight" "^4.0.7" - "@honkit/honkit-plugin-theme-default" "^4.0.7" - "@honkit/markdown-legacy" "^4.0.7" + "@honkit/asciidoc" "^4.0.8" + "@honkit/honkit-plugin-highlight" "^4.0.8" + "@honkit/honkit-plugin-theme-default" "^4.0.8" + "@honkit/markdown-legacy" "^4.0.8" bash-color "^0.0.4" cheerio "^1.0.0-rc.12" chokidar "^3.3.0" @@ -11434,7 +11489,7 @@ honkit@^4.0.0: open "^7.0.0" q "^1.5.1" resolve "^1.17.0" - semver "^5.1.0" + semver "^7.5.2" send "^0.17.1" tiny-lr "^1.1.1" tmp "0.0.28" @@ -11498,9 +11553,9 @@ html-entities@1.2.0: integrity sha512-0md7tlUUyb0BEQGsZzbqty1CgV6RESOoxdivt94AScqhBhYsPCCQCOaGvur/RospMjYpPJ7iFe3zw4Bu4SVA8g== html-entities@^2.1.0, html-entities@^2.3.2: - version "2.3.5" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.5.tgz#9f117bf6a5962efc31e094f6c6dad3cf3b95e33e" - integrity sha512-72TJlcMkYsEJASa/3HnX7VT59htM7iSHbH59NSZbtc+22Ap0Txnlx91sfeB+/A7wNZg7UxtZdhAW4y+/jimrdg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== html-escaper@^2.0.0: version "2.0.2" @@ -11525,10 +11580,15 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + html-webpack-plugin@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== + version "5.5.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -11772,9 +11832,9 @@ immutable@^3.8.1: integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== immutable@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== import-cwd@^2.0.0: version "2.1.0" @@ -11798,7 +11858,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -11866,11 +11926,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA== - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -11991,7 +12046,7 @@ insert-module-globals@^7.2.1: undeclared-identifiers "^1.1.2" xtend "^4.0.0" -internal-slot@^1.0.3, internal-slot@^1.0.5: +internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -12005,6 +12060,11 @@ internal-slot@^1.0.3, internal-slot@^1.0.5: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + intersection-observer@^0.12.2: version "0.12.2" resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" @@ -12072,7 +12132,7 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -12099,6 +12159,13 @@ is-arrayish@^0.3.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -12169,10 +12236,10 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -12190,7 +12257,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -12252,6 +12319,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -12274,7 +12348,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -12319,6 +12393,11 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -12430,9 +12509,9 @@ is-reference@1.2.1, is-reference@^1.1.2, is-reference@^1.2.1: "@types/estree" "*" is-reference@^3.0.0, is-reference@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" - integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== dependencies: "@types/estree" "*" @@ -12466,6 +12545,11 @@ is-scoped@^2.1.0: dependencies: scoped-regex "^2.0.0" +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -12511,16 +12595,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -12537,6 +12617,11 @@ is-url-superb@^4.0.0: resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -12544,6 +12629,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.0, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -12650,12 +12743,12 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -12668,9 +12761,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -12680,6 +12773,17 @@ iterall@^1.2.1, iterall@^1.3.0: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jake@^10.8.5: version "10.8.7" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" @@ -12851,15 +12955,15 @@ jest-diff@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-docblock@^26.0.0: version "26.0.0" @@ -12957,10 +13061,10 @@ jest-get-type@^27.5.1: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^26.6.2: version "26.6.2" @@ -13086,15 +13190,15 @@ jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: jest-get-type "^27.5.1" pretty-format "^27.5.1" -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" jest-message-util@^26.6.2: version "26.6.2" @@ -13141,18 +13245,18 @@ jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.5.0" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" @@ -13456,12 +13560,12 @@ jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^29.5.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -13591,9 +13695,9 @@ jest@^27.4.3: jest-cli "^27.5.1" jiti@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== js-base64@^3.7.3: version "3.7.5" @@ -13630,6 +13734,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jschardet@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.0.0.tgz#898d2332e45ebabbdb6bf2feece9feea9a99e882" + integrity sha512-lJH6tJ77V8Nzd5QWRkFYCLc13a3vADkh3r/Fi8HupZGWk2OVVDfnZP8V/VgQgZ+lzW0kG2UGb5hFgt3V3ndotQ== + jsdom@^16.4.0, jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -13737,7 +13846,7 @@ json-text-sequence@~0.1.0: dependencies: delimit-stream "0.1.0" -json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: +json5@2.x, json5@^2.1.2, json5@^2.2.0, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -13780,6 +13889,15 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsonpointer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" @@ -13801,12 +13919,14 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" juice@^8.0.0: version "8.1.0" @@ -13824,10 +13944,10 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -katex@^0.16.0, katex@^0.16.7: - version "0.16.7" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.7.tgz#36be1d4ed96e8afdc5863407e70f8fb250aeafd5" - integrity sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA== +katex@^0.16.0, katex@^0.16.9: + version "0.16.9" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.9.tgz#bc62d8f7abfea6e181250f85a56e4ef292dcb1fa" + integrity sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ== dependencies: commander "^8.3.0" @@ -13838,10 +13958,10 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -13939,12 +14059,12 @@ latest-version@^5.1.0: package-json "^6.3.0" launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" layout-base@^1.0.0: version "1.0.2" @@ -13978,21 +14098,21 @@ levn@~0.3.0: type-check "~0.3.2" libphonenumber-js@^1.9.43: - version "1.10.34" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.34.tgz#63374bb988688ac28b03ed6c4b344d412199d56c" - integrity sha512-p6g4NaQH4gK1gre32+kV14Mk6GPo2EDcPDvjbi+D2ycsPFsN4gVWNbs0itdHLZqByg6YEK8mE7OeP200I/ScTQ== + version "1.10.47" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.47.tgz#1efdf08306960a222703e575e78eb76458944012" + integrity sha512-b4t7VQDV29xx/ni+58yl9KWPGjnDLDXCeCTLrD4V8vDpObXZRZBrg7uX/HWZ7YXiJKqdBDGgc+barUUTNB6Slw== libsodium-wrappers@^0.7.11: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#53bd20606dffcc54ea2122133c7da38218f575f7" - integrity sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q== + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== dependencies: - libsodium "^0.7.11" + libsodium "^0.7.13" -libsodium@^0.7.11: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" - integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" @@ -14075,29 +14195,29 @@ listr@^0.14.3: rxjs "^6.3.3" lit-element@^3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.2.tgz#9913bf220b85065f0e5f1bb8878cc44f36b50cfa" - integrity sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ== + version "3.3.3" + resolved "https://registry.yarnpkg.com/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" + integrity sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA== dependencies: "@lit-labs/ssr-dom-shim" "^1.1.0" "@lit/reactive-element" "^1.3.0" - lit-html "^2.7.0" + lit-html "^2.8.0" -lit-html@^2.7.0: - version "2.7.4" - resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.7.4.tgz#6d75001977c206683685b9d76594a516afda2954" - integrity sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g== +lit-html@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" + integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== dependencies: "@types/trusted-types" "^2.0.2" lit@^2.0.0-rc.2, lit@^2.3.1: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.5.tgz#60bc82990cfad169d42cd786999356dcf79b035f" - integrity sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ== + version "2.8.0" + resolved "https://registry.yarnpkg.com/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== dependencies: "@lit/reactive-element" "^1.6.0" lit-element "^3.3.0" - lit-html "^2.7.0" + lit-html "^2.8.0" livereload-js@^2.3.0: version "2.4.0" @@ -14305,7 +14425,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.1: +loupe@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== @@ -14371,7 +14491,7 @@ lunr@^2.3.9: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== -lz-string@^1.4.4: +lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== @@ -14391,9 +14511,9 @@ magic-string@^0.27.0: "@jridgewell/sourcemap-codec" "^1.4.13" magic-string@^0.30.0: - version "0.30.3" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" - integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== + version "0.30.4" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.4.tgz#c2c683265fc18dda49b56fc7318d33ca0332c98c" + integrity sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -14404,6 +14524,13 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -14754,6 +14881,20 @@ mdast-util-to-hast@^12.1.0: unist-util-position "^4.0.0" unist-util-visit "^4.0.0" +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: version "0.6.5" resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" @@ -14813,9 +14954,9 @@ media-typer@0.3.0: integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.1.2, memfs@^3.4.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.5.3.tgz#d9b40fe4f8d5788c5f895bda804cd0d9eeee9f3b" - integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== dependencies: fs-monkey "^1.0.4" @@ -14901,19 +15042,22 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.2.1.tgz#5183c956a64e1ed9cf0122cec6c6cb4900521966" - integrity sha512-gziwXLuAidRxPJxcA0LqPhToirGZ2J2gD+UrDEtGNeKb98BtcQde28UUcCUCmNplkQOwE7oynrzKcMe9i29AMw== +mermaid@^10.2.2: + version "10.5.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.5.0.tgz#e90512a65b5c6e29bd86cd04ce45aa31da2be76d" + integrity sha512-9l0o1uUod78D3/FVYPGSsgV+Z0tSnzLBDiC9rVzvelPxuO80HbN1oDr9ofpPETQy9XpypPQa26fr09VzEPfvWA== dependencies: - "@braintree/sanitize-url" "^6.0.2" + "@braintree/sanitize-url" "^6.0.1" + "@types/d3-scale" "^4.0.3" + "@types/d3-scale-chromatic" "^3.0.0" cytoscape "^3.23.0" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.1.0" d3 "^7.4.0" + d3-sankey "^0.12.3" dagre-d3-es "7.0.10" dayjs "^1.11.7" - dompurify "3.0.3" + dompurify "^3.0.5" elkjs "^0.8.2" khroma "^2.0.0" lodash-es "^4.17.21" @@ -15237,6 +15381,14 @@ micromark-util-character@^1.0.0: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-chunked@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" @@ -15283,6 +15435,11 @@ micromark-util-encode@^1.0.0: resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + micromark-util-events-to-acorn@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" @@ -15325,6 +15482,15 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-encode "^1.0.0" micromark-util-symbol "^1.0.0" +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-subtokenize@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" @@ -15340,11 +15506,21 @@ micromark-util-symbol@^1.0.0: resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: version "2.11.4" resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" @@ -15502,9 +15678,9 @@ minimatch@^5.0.1: brace-expansion "^2.0.1" minimatch@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" @@ -15728,7 +15904,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.0, neo-async@^2.6.2: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -15773,9 +15949,9 @@ next-mdx-remote@^4.2.1: vfile-matter "^3.0.1" next-seo@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.0.0.tgz#4568dc61a44dbdf5fe5ff44156cd0ff8804889a2" - integrity sha512-jKKt1p1z4otMA28AyeoAONixVjdYmgFCWwpEFtu+DwRHQDllVX3RjtyXbuCQiUZEfQ9rFPBpAI90vDeLZlMBdg== + version "6.1.0" + resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.1.0.tgz#b60b06958cc77e7ed56f0a61b2d6cd0afed88ebb" + integrity sha512-iMBpFoJsR5zWhguHJvsoBDxDSmdYTHtnVPB1ij+CD0NReQCP78ZxxbdL9qkKIf4oEuZEqZkrjAQLB0bkII7RYA== next-themes@^0.2.1: version "0.2.1" @@ -15783,38 +15959,38 @@ next-themes@^0.2.1: integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== next@^13.0.6: - version "13.4.6" - resolved "https://registry.yarnpkg.com/next/-/next-13.4.6.tgz#ebe52f5c74d60176d45b45e73f25a51103713ea4" - integrity sha512-sjVqjxU+U2aXZnYt4Ud6CTLNNwWjdSfMgemGpIQJcN3Z7Jni9xRWbR0ie5fQzCg87aLqQVhKA2ud2gPoqJ9lGw== + version "13.5.4" + resolved "https://registry.yarnpkg.com/next/-/next-13.5.4.tgz#7e6a93c9c2b9a2c78bf6906a6c5cc73ae02d5b4d" + integrity sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA== dependencies: - "@next/env" "13.4.6" - "@swc/helpers" "0.5.1" + "@next/env" "13.5.4" + "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" - postcss "8.4.14" + postcss "8.4.31" styled-jsx "5.1.1" watchpack "2.4.0" - zod "3.21.4" optionalDependencies: - "@next/swc-darwin-arm64" "13.4.6" - "@next/swc-darwin-x64" "13.4.6" - "@next/swc-linux-arm64-gnu" "13.4.6" - "@next/swc-linux-arm64-musl" "13.4.6" - "@next/swc-linux-x64-gnu" "13.4.6" - "@next/swc-linux-x64-musl" "13.4.6" - "@next/swc-win32-arm64-msvc" "13.4.6" - "@next/swc-win32-ia32-msvc" "13.4.6" - "@next/swc-win32-x64-msvc" "13.4.6" + "@next/swc-darwin-arm64" "13.5.4" + "@next/swc-darwin-x64" "13.5.4" + "@next/swc-linux-arm64-gnu" "13.5.4" + "@next/swc-linux-arm64-musl" "13.5.4" + "@next/swc-linux-x64-gnu" "13.5.4" + "@next/swc-linux-x64-musl" "13.5.4" + "@next/swc-win32-arm64-msvc" "13.5.4" + "@next/swc-win32-ia32-msvc" "13.5.4" + "@next/swc-win32-x64-msvc" "13.5.4" nextra-theme-docs@latest: - version "2.7.1" - resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.7.1.tgz#d92827af26a2797bb59b347674115329074fd0da" - integrity sha512-C2DtoGH15q22t4r2JC89lvvajmnyiqsv3PaqHJpoHRlF2eR5giuLhZC5Oahb9AENRDcnUIUvqVi/8NlfiIM0yQ== + version "2.13.2" + resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.13.2.tgz#7f0c2bdd83d8866201775edd654398417a564878" + integrity sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ== dependencies: "@headlessui/react" "^1.7.10" "@popperjs/core" "^2.11.6" - clsx "^1.2.1" - flexsearch "^0.7.21" + clsx "^2.0.0" + escape-string-regexp "^5.0.0" + flexsearch "^0.7.31" focus-visible "^5.2.0" git-url-parse "^13.1.0" intersection-observer "^0.12.2" @@ -15822,36 +15998,39 @@ nextra-theme-docs@latest: next-seo "^6.0.0" next-themes "^0.2.1" scroll-into-view-if-needed "^3.0.0" - zod "^3.20.2" + zod "^3.22.3" nextra@latest: - version "2.7.1" - resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.7.1.tgz#f3c01c45aa96e4a9285a3aee333e18e8e1d1bf71" - integrity sha512-qchTb7XSm357XAHf9MV9UlUSGolPEPE8iFnC/9KMwvhIoE4seyPYWMrnH84XraZCcGERvy9TrkFD30VE7Qv1MA== + version "2.13.2" + resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.13.2.tgz#d460c2551c1daf1ff0ebc52690ff66f583c3dc67" + integrity sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA== dependencies: + "@headlessui/react" "^1.7.10" "@mdx-js/mdx" "^2.3.0" "@mdx-js/react" "^2.3.0" - "@napi-rs/simple-git" "^0.1.8" - "@theguild/remark-mermaid" "^0.0.1" - clsx "^1.2.1" + "@napi-rs/simple-git" "^0.1.9" + "@theguild/remark-mermaid" "^0.0.5" + "@theguild/remark-npm2yarn" "^0.2.0" + clsx "^2.0.0" github-slugger "^2.0.0" graceful-fs "^4.2.11" gray-matter "^4.0.3" - katex "^0.16.7" + katex "^0.16.9" lodash.get "^4.4.2" next-mdx-remote "^4.2.1" p-limit "^3.1.0" - rehype-katex "^6.0.3" - rehype-pretty-code "0.9.4" + rehype-katex "^7.0.0" + rehype-pretty-code "0.9.11" + rehype-raw "^7.0.0" remark-gfm "^3.0.1" remark-math "^5.1.1" remark-reading-time "^2.0.1" - shiki "^0.14.2" + shiki "^0.14.3" slash "^3.0.0" title "^3.5.3" - unist-util-remove "^3.1.1" - unist-util-visit "^4.1.1" - zod "^3.20.2" + unist-util-remove "^4.0.0" + unist-util-visit "^5.0.0" + zod "^3.22.3" nice-try@^1.0.4: version "1.0.5" @@ -15892,17 +16071,17 @@ node-domexception@^1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@2, node-fetch@^2.6.0, node-fetch@^2.6.11, node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== +node-fetch@2, node-fetch@^2.6.0, node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-fetch@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.1.tgz#b3eea7b54b3a48020e46f4f88b9c5a7430d20b2e" - integrity sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow== + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.4" @@ -15914,9 +16093,9 @@ node-forge@^1: integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== node-int64@^0.4.0: version "0.4.0" @@ -15951,11 +16130,6 @@ node-pre-gyp@0.14.0: semver "^5.3.0" tar "^4.4.2" -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" @@ -16156,6 +16330,11 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-to-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/npm-to-yarn/-/npm-to-yarn-2.1.0.tgz#ff4e18028d18eb844691f1ccb556be5f3ccfde34" + integrity sha512-2C1IgJLdJngq1bSER7K7CGFszRr9s2rijEwvENPEgI0eK9xlD3tNwDc0UJnRj7FIT2aydWm72jB88uVswAhXHA== + npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -16200,9 +16379,9 @@ nunjucks@^3.2.0: commander "^5.1.0" nwsapi@^2.2.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" - integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== oauth-sign@~0.9.0: version "0.9.0" @@ -16233,6 +16412,14 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -16250,7 +16437,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -16261,41 +16448,51 @@ object.assign@^4.1.3, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.5, object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.5, object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.getownpropertydescriptors@^2.1.0: - version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" - integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + version "2.1.7" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" + integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== dependencies: - array.prototype.reduce "^1.0.5" + array.prototype.reduce "^1.0.6" call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" safe-array-concat "^1.0.0" +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + object.hasown@^1.1.0, object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.pick@^1.3.0: version "1.3.0" @@ -16305,13 +16502,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0, object.values@^1.1.5, object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -16410,17 +16607,17 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" org-regex@^1.0.0: version "1.0.0" @@ -16936,9 +17133,9 @@ pify@^5.0.0: integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== pirates@^4.0.1, pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" @@ -17842,12 +18039,12 @@ postcss@6.0.1: source-map "^0.5.6" supports-color "^3.2.3" -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== +postcss@8.4.31, postcss@^8.2.1, postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.4: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -17868,15 +18065,6 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.2.1, postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - preact-compat@^3.19.0: version "3.19.0" resolved "https://registry.yarnpkg.com/preact-compat/-/preact-compat-3.19.0.tgz#a71457b6a3bf051690a4411603bc2085aa061c2f" @@ -17907,14 +18095,14 @@ preact-transition-group@^1.1.1: integrity sha512-v89XLodCvylf5lMrhI+LqIhDsAjWfiDKV4keAU+L5yDtxmqn8uvjZXn+haKMEG0x0PZz81own19SuNJD5NlOFQ== preact@^10.11.3: - version "10.15.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" - integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== + version "10.18.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.1.tgz#3b84bb305f0b05f4ad5784b981d15fcec4e105da" + integrity sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg== preferred-pm@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.0.3.tgz#1b6338000371e3edbce52ef2e4f65eb2e73586d6" - integrity sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/preferred-pm/-/preferred-pm-3.1.2.tgz#aedb70550734a574dffcbf2ce82642bd1753bdd6" + integrity sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q== dependencies: find-up "^5.0.0" find-yarn-workspace-root2 "1.2.16" @@ -17936,11 +18124,16 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== -prettier@^2.7.1, prettier@latest: +prettier@^2.7.1: version "2.8.8" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@latest: + version "3.0.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" + integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -17983,12 +18176,12 @@ pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^29.0.0, pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^29.4.3" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -18042,9 +18235,9 @@ prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: react-is "^16.13.1" property-information@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" - integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" + integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== proto-list@~1.2.1: version "1.2.4" @@ -18112,11 +18305,11 @@ pupa@^2.1.1: escape-goat "^2.0.0" pvtsutils@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" - integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== dependencies: - tslib "^2.4.0" + tslib "^2.6.1" pvutils@^1.1.3: version "1.1.3" @@ -18140,7 +18333,7 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.11.0, qs@^6.4.0: +qs@^6.11.2, qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -18327,9 +18520,9 @@ react-is@^18.0.0: integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== react-qr-code@^2.0.7: - version "2.0.11" - resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.11.tgz#444c759a2100424972e17135fbe0e32eaffa19e8" - integrity sha512-P7mvVM5vk9NjGdHMt4Z0KWeeJYwRAtonHTghZT2r+AASinLUUKQ9wfsGH2lPKsT++gps7hXmaiMGRvwTDEL9OA== + version "2.0.12" + resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.12.tgz#98f99e9ad5ede46d73ab819e2dd9925c5f5d7a2d" + integrity sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg== dependencies: prop-types "^15.8.1" qr.js "0.0.0" @@ -18345,19 +18538,19 @@ react-refresh@^0.11.0: integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-router-dom@^6.3.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.12.0.tgz#372279caaaa1ffb0204926c83e93a139b112d861" - integrity sha512-UzLwZ3ZVaDr6YV0HdjwxuwtDKgwpJx9o1ea9fU0HV4tTvzdB8WPHzlLFMo5orchpIS84e8G4Erlhu7Rl84XDFQ== + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" + integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== dependencies: - "@remix-run/router" "1.6.3" - react-router "6.12.0" + "@remix-run/router" "1.9.0" + react-router "6.16.0" -react-router@6.12.0: - version "6.12.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.12.0.tgz#1afae9219c24c8611809469d7a386c8023ade39a" - integrity sha512-/tCGtLq9umxRvbYeIx3j94CmpQfue0E3qnetVm9luKhu58cR4t+3O4ZrQXBdXfJrBATOAj+wF/1ihJJQI8AoTw== +react-router@6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" + integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== dependencies: - "@remix-run/router" "1.6.3" + "@remix-run/router" "1.9.0" react-scripts@^5.0.1: version "5.0.1" @@ -18545,10 +18738,22 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -18562,15 +18767,20 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -18587,14 +18797,14 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.3: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpu-core@^5.3.1: version "5.3.2" @@ -18629,26 +18839,37 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -rehype-katex@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.3.tgz#83e5b929b0967978e9491c02117f55be3594d7e1" - integrity sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA== +rehype-katex@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-7.0.0.tgz#f5e9e2825981175a7b0a4d58ed9816c33576dfed" + integrity sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q== dependencies: - "@types/hast" "^2.0.0" - "@types/katex" "^0.14.0" - hast-util-from-html-isomorphic "^1.0.0" - hast-util-to-text "^3.1.0" + "@types/hast" "^3.0.0" + "@types/katex" "^0.16.0" + hast-util-from-html-isomorphic "^2.0.0" + hast-util-to-text "^4.0.0" katex "^0.16.0" - unist-util-visit "^4.0.0" + unist-util-visit-parents "^6.0.0" + vfile "^6.0.0" -rehype-pretty-code@0.9.4: - version "0.9.4" - resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.9.4.tgz#ab214026b530890c7a2e14c4f0881483e39e9cbc" - integrity sha512-3m4aQT15n8C+UizcZL0enaahoZwCDm5K1qKQ3DGgHE7U8l/DEEEJ/hm+uDe9yyK4sxVOSfZcRIMHrpJwLQi+Rg== +rehype-pretty-code@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.9.11.tgz#742017cbcfd5bd85466dfedd65b33a954aff7f2a" + integrity sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA== dependencies: + "@types/hast" "^2.0.0" hash-obj "^4.0.0" parse-numeric-range "^1.3.0" +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -18872,12 +19093,12 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.4, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.4.0: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +resolve@^1.1.4, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -19088,17 +19309,10 @@ rollup@^2.3.4, rollup@^2.43.1, rollup@^2.56.3: optionalDependencies: fsevents "~2.3.2" -rollup@^3.21.0: - version "3.24.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.24.0.tgz#865dee1fe0bb528747b59914dfab25e6f480e370" - integrity sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ== - optionalDependencies: - fsevents "~2.3.2" - -rollup@^3.28.1: - version "3.28.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.28.1.tgz#fb44aa6d5e65c7e13fd5bcfff266d0c4ea9ba433" - integrity sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw== +rollup@^3.27.1, rollup@^3.28.1: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -19160,13 +19374,13 @@ sade@^1.7.3, sade@^1.7.4: dependencies: mri "^1.1.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -19250,15 +19464,20 @@ sass-loader@^12.3.0: neo-async "^2.6.2" sass@*: - version "1.63.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.2.tgz#75f7d9a8e67d1d5b98a989507f4d98b6067b1f75" - integrity sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww== + version "1.69.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.0.tgz#5195075371c239ed556280cf2f5944d234f42679" + integrity sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -19295,19 +19514,19 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.2.0.tgz#7dff4881064a4f22c09f0c6a1457feb820fd0636" - integrity sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.1.0.tgz#4cff1e434c12ed39502378b9a3e24787b37df41d" - integrity sha512-Jw+GZVbP5IggB2WAn6UHI02LBwGmsIeYN/lNbSMZyDziQ7jmtAUrqKqDja+W89YHVs+KL/3IkIMltAklqB1vAw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -19320,9 +19539,9 @@ scoped-regex@^2.0.0: integrity sha512-g3WxHrqSWCZHGHlSrF51VXFdjImhwvH8ZO/pryFH56Qi0cDsZfylQa/t0jCzVQFNbNvM00HfHjkDPEuarKDSWQ== scroll-into-view-if-needed@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz#38fbfe770d490baff0fb2ba34ae3539f6ec44e13" - integrity sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz#fa9524518c799b45a2ef6bbffb92bcad0296d01f" + integrity sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== dependencies: compute-scroll-into-view "^3.0.2" @@ -19367,24 +19586,19 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^6.3.1: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -19483,6 +19697,15 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -19555,7 +19778,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1, shell-quote@^1.7.3: +shell-quote@^1.6.1, shell-quote@^1.7.3, shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -19565,10 +19788,10 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -shiki@^0.14.1, shiki@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.2.tgz#d51440800b701392b31ce2336036058e338247a1" - integrity sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A== +shiki@^0.14.1, shiki@^0.14.3: + version "0.14.4" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.4.tgz#2454969b466a5f75067d0f2fa0d7426d32881b20" + integrity sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ== dependencies: ansi-sequence-parser "^1.1.0" jsonc-parser "^3.2.0" @@ -19602,12 +19825,12 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sinon@*: - version "15.1.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-15.1.0.tgz#87656841545f7c63bd1e291df409fafd0e9aec09" - integrity sha512-cS5FgpDdE9/zx7no8bxROHymSlPLZzq0ChbbLk1DrxBfc+eTeBK3y8nIL+nu/0QeYydhhbLIr7ecHJpywjQaoQ== + version "16.1.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.0.tgz#645b836563c9bedb21defdbe48831cb2afb687f2" + integrity sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ== dependencies: "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^10.2.0" + "@sinonjs/fake-timers" "^10.3.0" "@sinonjs/samsam" "^8.0.0" diff "^5.1.0" nise "^5.1.4" @@ -19816,9 +20039,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdy-transport@^3.0.0: version "3.0.0" @@ -19858,9 +20081,9 @@ split@^1.0.1: through "2" sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" @@ -19904,6 +20127,13 @@ standalone-react-addons-pure-render-mixin@^0.1.1: resolved "https://registry.yarnpkg.com/standalone-react-addons-pure-render-mixin/-/standalone-react-addons-pure-render-mixin-0.1.1.tgz#3c7409f4c79c40de9ac72c616cf679a994f37551" integrity sha512-HFkwqpJmvz4vxHyzdeUcjtsp8Am+NauLXdU2/YXT1/InPbszaRo1cLPAy/58H7oOPNNjteqHcv04JEw+d9C+Xw== +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -19922,6 +20152,13 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-browserify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" @@ -20026,54 +20263,55 @@ string-width@^2.1.0, string-width@^2.1.1: strip-ansi "^4.0.0" string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz#311ef3a4e3c557dd999cdf88fbdde223f2ac0f95" + integrity sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@0.10: version "0.10.31" @@ -20183,7 +20421,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -20204,9 +20442,9 @@ style-loader@^3.3.1: integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== style-to-object@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" - integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== + version "0.4.2" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" + integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== dependencies: inline-style-parser "0.1.1" @@ -20235,9 +20473,9 @@ stylehacks@^5.1.1: postcss-selector-parser "^6.0.4" stylis@^4.1.3: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== subarg@^1.0.0: version "1.0.0" @@ -20258,9 +20496,9 @@ subscriptions-transport-ws@^0.11.0: ws "^5.2.0 || ^6.0.0 || ^7.0.0" sucrase@^3.32.0: - version "3.32.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" - integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" @@ -20358,14 +20596,14 @@ svelte-preprocess@^4.0.0: strip-indent "^3.0.0" svelte@^3.0.0: - version "3.59.1" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.59.1.tgz#3de3d56b9165748f32f3131589b8d183cabe7449" - integrity sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ== + version "3.59.2" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.59.2.tgz#a137b28e025a181292b2ae2e3dca90bf8ec73aec" + integrity sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA== svelte@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.0.tgz#0e4304c15524450b22fba02516eb72efbd8847b6" - integrity sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.1.tgz#33d603af4da103a5ad988d7fcc992a87421a1e6e" + integrity sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw== dependencies: "@ampproject/remapping" "^2.2.1" "@jridgewell/sourcemap-codec" "^1.4.15" @@ -20457,9 +20695,9 @@ table-layout@^0.4.2: wordwrapjs "^3.0.0" tailwindcss@^3.0.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3" - integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== + version "3.3.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" @@ -20481,7 +20719,6 @@ tailwindcss@^3.0.2: postcss-load-config "^4.0.1" postcss-nested "^6.0.1" postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" resolve "^1.22.2" sucrase "^3.32.0" @@ -20548,9 +20785,9 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.17.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.7.tgz#2a8b134826fe179b711969fd9d9a0c2479b2a8c3" - integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== + version "5.21.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" + integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -20924,7 +21161,7 @@ ts-typed-json@^0.2.2: dependencies: rsvp "^3.5.0" -tsconfig-paths@^3.14.1, tsconfig-paths@^3.5.0: +tsconfig-paths@^3.14.1, tsconfig-paths@^3.14.2, tsconfig-paths@^3.5.0: version "3.14.2" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== @@ -20939,10 +21176,10 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -20957,9 +21194,9 @@ tty-browserify@0.0.1: integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== tty-table@^4.1.5: - version "4.2.1" - resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.1.tgz#c06cd76c54542acf4e2b4a0e9a5802984b65cba6" - integrity sha512-xz0uKo+KakCQ+Dxj1D/tKn2FSyreSYWzdkL/BYhgN6oMW808g8QRMuh1atAV9fjTPbWBjfbkKQpI/5rEcnAc7g== + version "4.2.2" + resolved "https://registry.yarnpkg.com/tty-table/-/tty-table-4.2.2.tgz#2a548db0278be5023ed40280001e1908bb823463" + integrity sha512-2gvCArMZLxgvpZ2NvQKdnYWIFLe7I/z5JClMuhrDXunmKgSZcQKcZRjN9XjAFiToMz2pUo1dEIXyrm0AwgV5Tw== dependencies: chalk "^4.1.2" csv "^5.5.3" @@ -20981,47 +21218,47 @@ tunnel@0.0.6, tunnel@^0.0.6: resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== -turbo-darwin-64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.2.tgz#10a92e78b98e83a37de804f9ed598c3c9b73b884" - integrity sha512-sVLpVVANByfMgqf7OYPcZM4KiDnjGu7ITvAzBSa9Iwe14yoWLn8utrNsWCRaQEB6kEqBGLPmvL7AKwkl8M2Gqg== +turbo-darwin-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-darwin-64/-/turbo-darwin-64-1.10.15.tgz#8f1d80ca91e46909a2c80e416e475bc44c91ef9f" + integrity sha512-Sik5uogjkRTe1XVP9TC2GryEMOJCaKE2pM/O9uLn4koQDnWKGcLQv+mDU+H+9DXvKLnJnKCD18OVRkwK5tdpoA== -turbo-darwin-arm64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.2.tgz#e052da2257906724feadb5a0e26a847aed1289bb" - integrity sha512-TKG91DSoYQjsCft4XBx4lYycVT5n3UQB/nOKgv/WJCSfwshLWulya3yhP8JT5erv9rPF8gwgnx87lrCmT4EAVA== +turbo-darwin-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-darwin-arm64/-/turbo-darwin-arm64-1.10.15.tgz#4b6b29c9d10c8e286b27d372936c09a98f34449a" + integrity sha512-xwqyFDYUcl2xwXyGPmHkmgnNm4Cy0oNzMpMOBGRr5x64SErS7QQLR4VHb0ubiR+VAb8M+ECPklU6vD1Gm+wekg== -turbo-linux-64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.2.tgz#0a038f26da2693cfd2af1b842e29a13128224055" - integrity sha512-ZIzAkfrzjJFkSM/uEfxU6JjseCsT5PHRu0s0lmYce37ApQbv/HC7tI0cFhuosI30+O8109/mkyZykKE7AQfgqA== +turbo-linux-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-linux-64/-/turbo-linux-64-1.10.15.tgz#a892aae53946c68f311b2e71504af5b9768dd2c1" + integrity sha512-dM07SiO3RMAJ09Z+uB2LNUSkPp3I1IMF8goH5eLj+d8Kkwoxd/+qbUZOj9RvInyxU/IhlnO9w3PGd3Hp14m/nA== -turbo-linux-arm64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.2.tgz#2ff7272ec6426f91f56e71998e80eb805c20d963" - integrity sha512-G4uZA+RBQ5S1X/oUxO5KoLL2NDMkrrBZF52+00jQv6UEb9lWDgwzqSwoAGjdXxeDCrqMW5rBVwb/IBIF2/yhwA== +turbo-linux-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-linux-arm64/-/turbo-linux-arm64-1.10.15.tgz#9d241414e75c7457ea8371c36c4b9700ec7ca553" + integrity sha512-MkzKLkKYKyrz4lwfjNXH8aTny5+Hmiu4SFBZbx+5C0vOlyp6fV5jZANDBvLXWiDDL4DSEAuCEK/2cmN6FVH1ow== -turbo-windows-64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.2.tgz#2b05074f932bc6b032038624ebb7fd1b1e2f43ce" - integrity sha512-ObfQO37kGu1jBzFs/L+hybrCXBwdnimotJwzg7pCoSyGijKITlugrpJoPDKlg0eMr3/1Y6KUeHy26vZaDXrbuQ== +turbo-windows-64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-windows-64/-/turbo-windows-64-1.10.15.tgz#7d19853634482f01b7c4ae8d5e255321a2f7582c" + integrity sha512-3TdVU+WEH9ThvQGwV3ieX/XHebtYNHv9HARHauPwmVj3kakoALkpGxLclkHFBLdLKkqDvmHmXtcsfs6cXXRHJg== -turbo-windows-arm64@1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.2.tgz#75e904e2f9e06960e5639f6e3f71c6a8ac01f558" - integrity sha512-7S6dx4738R/FIT2cxbsunqgHN5LelXzuzkcaZgdkU33oswRf/6KOfOABzQLdTX7Uos59cBSdwayf6KQJxuOXUg== +turbo-windows-arm64@1.10.15: + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo-windows-arm64/-/turbo-windows-arm64-1.10.15.tgz#c7b0cf8732b02914b415577593afeda4155219fb" + integrity sha512-l+7UOBCbfadvPMYsX08hyLD+UIoAkg6ojfH+E8aud3gcA1padpjCJTh9gMpm3QdMbKwZteT5uUM+wyi6Rbbyww== turbo@latest: - version "1.10.2" - resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.2.tgz#b96be5aa32f6a0c7d4e50782aa720c550c3c6270" - integrity sha512-m9sR5XHhuzxUQACf0vI2qCG5OqDYAZiPTaAsTwECnwUF4/cXwEmcYddbLJnO+K9orNvcnjjent5oBNBVQ/o0ow== + version "1.10.15" + resolved "https://registry.yarnpkg.com/turbo/-/turbo-1.10.15.tgz#356731acb46991b4e337cce2f7ccd3279bc1f1a6" + integrity sha512-mKKkqsuDAQy1wCCIjCdG+jOCwUflhckDMSRoeBPcIL/CnCl7c5yRDFe7SyaXloUUkt4tUR0rvNIhVCcT7YeQpg== optionalDependencies: - turbo-darwin-64 "1.10.2" - turbo-darwin-arm64 "1.10.2" - turbo-linux-64 "1.10.2" - turbo-linux-arm64 "1.10.2" - turbo-windows-64 "1.10.2" - turbo-windows-arm64 "1.10.2" + turbo-darwin-64 "1.10.15" + turbo-darwin-arm64 "1.10.15" + turbo-linux-64 "1.10.15" + turbo-linux-arm64 "1.10.15" + turbo-windows-64 "1.10.15" + turbo-windows-arm64 "1.10.15" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -21047,7 +21284,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -21124,6 +21361,36 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -21146,9 +21413,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc-plugin-markdown@^3.15.2: - version "3.15.3" - resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.3.tgz#f5419a32b93efbdc0fcba60ca4de37727aeb8ba9" - integrity sha512-idntFYu3vfaY3eaD+w9DeRd0PmNGqGuNLKihPU9poxFGnATJYGn9dPtEhn2QrTdishFMg7jPXAhos+2T6YCWRQ== + version "3.16.0" + resolved "https://registry.yarnpkg.com/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.16.0.tgz#98da250271aafade8b6740a8116a97cd3941abcd" + integrity sha512-eeiC78fDNGFwemPIHiwRC+mEC7W5jwt3fceUev2gJ2nFnXpVHo8eRrpC9BLWZDee6ehnz/sPmNjizbXwpfaTBw== dependencies: handlebars "^4.7.7" @@ -21163,9 +21430,9 @@ typedoc@^0.24.4: shiki "^0.14.1" typescript@*: - version "5.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== typescript@^4.2.4, typescript@^4.5.5, typescript@^4.6.2, typescript@^4.9.3: version "4.9.5" @@ -21220,6 +21487,11 @@ undeclared-identifiers@^1.1.2: simple-concat "^1.0.0" xtend "^4.0.1" +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + underscore@^1.13.2: version "1.13.6" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" @@ -21300,13 +21572,13 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -unist-util-find-after@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" - integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== +unist-util-find-after@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" + integrity sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" unist-util-generated@^2.0.0: version "2.0.1" @@ -21325,6 +21597,13 @@ unist-util-is@^5.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" @@ -21339,6 +21618,13 @@ unist-util-position@^4.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + unist-util-remove-position@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" @@ -21347,14 +21633,22 @@ unist-util-remove-position@^4.0.0: "@types/unist" "^2.0.0" unist-util-visit "^4.0.0" -unist-util-remove@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-3.1.1.tgz#8bfa181aff916bd32a4ed30b3ed76d0c21c077df" - integrity sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw== +unist-util-remove-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz#fea68a25658409c9460408bc6b4991b965b52163" + integrity sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" + "@types/unist" "^3.0.0" + unist-util-visit "^5.0.0" + +unist-util-remove@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-4.0.0.tgz#94b7d6bbd24e42d2f841e947ed087be5c82b222e" + integrity sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" unist-util-stringify-position@^2.0.0: version "2.0.3" @@ -21370,6 +21664,13 @@ unist-util-stringify-position@^3.0.0: dependencies: "@types/unist" "^2.0.0" +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + unist-util-visit-parents@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" @@ -21394,14 +21695,13 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" -unist-util-visit@4.1.2, unist-util-visit@^4.0.0, unist-util-visit@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" unist-util-visit@^3.1.0: version "3.1.0" @@ -21412,6 +21712,24 @@ unist-util-visit@^3.1.0: unist-util-is "^5.0.0" unist-util-visit-parents "^4.0.0" +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -21471,10 +21789,10 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -21537,12 +21855,12 @@ url-parse@^1.5.3: requires-port "^1.0.0" url@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32" - integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA== + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== dependencies: punycode "^1.4.1" - qs "^6.11.0" + qs "^6.11.2" use@^3.1.0: version "3.1.1" @@ -21564,12 +21882,12 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ== +util@^0.10.4: + version "0.10.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== dependencies: - inherits "2.0.1" + inherits "2.0.3" util@~0.12.0: version "0.12.5" @@ -21593,9 +21911,9 @@ utils-merge@1.0.1: integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@*, uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== uuid@^3.3.2: version "3.4.0" @@ -21666,9 +21984,9 @@ validate-npm-package-name@^3.0.0: builtins "^1.0.3" validator@^13.7.0: - version "13.9.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" - integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== value-or-promise@1.0.11: version "1.0.11" @@ -21699,13 +22017,13 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vfile-location@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" - integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== dependencies: - "@types/unist" "^2.0.0" - vfile "^5.0.0" + "@types/unist" "^3.0.0" + vfile "^6.0.0" vfile-matter@^3.0.1: version "3.0.1" @@ -21732,6 +22050,14 @@ vfile-message@^3.0.0: "@types/unist" "^2.0.0" unist-util-stringify-position "^3.0.0" +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" @@ -21752,14 +22078,23 @@ vfile@^5.0.0, vfile@^5.3.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vfile@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + vite@^4.0.1, vite@^4.1.1: - version "4.3.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" - integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== + version "4.4.11" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.11.tgz#babdb055b08c69cfc4c468072a2e6c9ca62102b0" + integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== dependencies: - esbuild "^0.17.5" - postcss "^8.4.23" - rollup "^3.21.0" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2" @@ -21896,9 +22231,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.6.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -21906,7 +22241,7 @@ webpack-dev-server@^4.6.0: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -21961,9 +22296,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.86.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.86.0.tgz#b0eb81794b62aee0b7e7eb8c5073495217d9fc6d" - integrity sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg== + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -21974,7 +22309,7 @@ webpack@^5.64.4: acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.1" + enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -21984,7 +22319,7 @@ webpack@^5.64.4: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" @@ -22005,9 +22340,9 @@ websocket-extensions@>=0.1.1: integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== wget-improved@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/wget-improved/-/wget-improved-3.3.1.tgz#4ca99dc80db0ae388e99f4137f8deadd358630bc" - integrity sha512-OF22MM9ImbOcuB5ZV3ye0q1udaYeTP/V6LOfjNyGCNNC7bGB219ljZv6Wk5mPogeigJJ6CqheLScv17AFbsdGA== + version "3.4.0" + resolved "https://registry.yarnpkg.com/wget-improved/-/wget-improved-3.4.0.tgz#da4d2578e46c6ed8532e6d34cbdf8c7344fdd17c" + integrity sha512-mHCdqImHntGzaauaQrfhkcHO0sAOp9Fd/9v5PXwrvHK+nggRWG9en5UH72/WitJFv3d3iFwJSAVMrRaCjW6dAA== dependencies: minimist "1.2.6" tunnel "0.0.6" @@ -22020,9 +22355,9 @@ whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -22071,6 +22406,34 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" @@ -22084,17 +22447,16 @@ which-pm@2.0.0: load-yaml-file "^0.2.0" path-exists "^4.0.0" -which-typed-array@^1.1.2, which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@^1.2.9, which@^1.3.1: version "1.3.1" @@ -22124,10 +22486,10 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" @@ -22364,7 +22726,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@8.13.0, ws@^8.13.0: +ws@8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== @@ -22374,6 +22736,11 @@ ws@8.13.0, ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.13.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" @@ -22438,9 +22805,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + version "2.3.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" + integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== yargs-parser@20.2.4: version "20.2.4" @@ -22561,10 +22928,10 @@ zen-observable@0.8.15, zen-observable@^0.8.0: resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== -zod@3.21.4, zod@^3.20.2: - version "3.21.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" - integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== +zod@^3.22.3: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== zwitch@^1.0.0: version "1.0.5" From a7dd1d520e4954b64bf067f9727cb5bd98e7368a Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 9 Oct 2023 20:10:24 +0530 Subject: [PATCH 21/87] Fixed global process object in deno --- executor/src/deno.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/executor/src/deno.ts b/executor/src/deno.ts index 6999b7ba7..fbbc01ade 100644 --- a/executor/src/deno.ts +++ b/executor/src/deno.ts @@ -14,12 +14,7 @@ Object.defineProperty(globalThis, "global", { }); Object.defineProperty(globalThis, "process", { - value: { - ...processModule, - env: { - NODE_ENV: "production" - } - }, + value: processModule, enumerable: false, writable: true, configurable: true, From 26b09196e1739a53a931d4a38b63cfcbfafe37de Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 9 Oct 2023 20:33:57 +0530 Subject: [PATCH 22/87] Updated timeout for app install to 20 sec --- .../src/holochain_service/holochain_service_extension.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust-executor/src/holochain_service/holochain_service_extension.rs b/rust-executor/src/holochain_service/holochain_service_extension.rs index ca9b2ed48..62dc1c08f 100644 --- a/rust-executor/src/holochain_service/holochain_service_extension.rs +++ b/rust-executor/src/holochain_service/holochain_service_extension.rs @@ -17,7 +17,9 @@ use crate::holochain_service::{HolochainService, LocalConductorConfig}; use super::get_holochain_service; // The duration to use for timeouts -const TIMEOUT_DURATION: Duration = Duration::from_secs(5); +const TIMEOUT_DURATION: Duration = Duration::from_secs(10); + +const APP_INSTALL_TIMEOUT_DURATION: Duration = Duration::from_secs(20); #[op] async fn start_holochain_conductor(config: LocalConductorConfig) -> Result<(), AnyError> { @@ -46,7 +48,7 @@ async fn log_dht_status() -> Result<(), AnyError> { #[op] async fn install_app(install_app_payload: InstallAppPayload) -> Result { timeout( - TIMEOUT_DURATION, + APP_INSTALL_TIMEOUT_DURATION, async { let interface = get_holochain_service().await; interface.install_app(install_app_payload).await From 0dc6648750401fb184341163edfe4288aba95d2e Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 9 Oct 2023 21:33:51 +0530 Subject: [PATCH 23/87] Updated CI to install prtobuf & cmake --- .github/workflows/integration_cli.yml | 3 +++ .github/workflows/integration_js.yml | 2 +- .github/workflows/publish.yml | 6 +++++- .github/workflows/publish_staging.yml | 6 +++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration_cli.yml b/.github/workflows/integration_cli.yml index eae160233..899a174e8 100644 --- a/.github/workflows/integration_cli.yml +++ b/.github/workflows/integration_cli.yml @@ -28,6 +28,9 @@ jobs: override: true toolchain: 1.71.1 + - name: Install protobuf & cmake + run: brew install protobuf cmake + - name: Cache cargo id: cache-cargo uses: actions/cache@v3 diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 36b4402b0..1ccb5513a 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -60,7 +60,7 @@ jobs: - name: install system dependencies run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf - name: Install HC run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 51b14162b..449b0074d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -76,7 +76,11 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf + + - name: install dependencies (ubuntu only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index b03ab1a72..14d7f12d3 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -68,7 +68,11 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf + + - name: install dependencies (ubuntu only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV From e6f347a5f20bf7e2f4ac9bdef81626021cec2dac Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 9 Oct 2023 21:38:56 +0530 Subject: [PATCH 24/87] corrected protobuf name for linux --- .github/workflows/integration_js.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/publish_staging.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 1ccb5513a..9256ca060 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -60,7 +60,7 @@ jobs: - name: install system dependencies run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - name: Install HC run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 449b0074d..c05d952bd 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -76,7 +76,7 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - name: install dependencies (ubuntu only) if: matrix.platform == 'macos-latest' diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 14d7f12d3..133fce2af 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -68,7 +68,7 @@ jobs: if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - name: install dependencies (ubuntu only) if: matrix.platform == 'macos-latest' From 10de1dd9a3c2411487478cfeab7c2fcea9a6f357 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 10 Oct 2023 11:15:57 +0100 Subject: [PATCH 25/87] dont init new socket between language calls --- .../p-diff-sync/linksAdapter.ts | 40 ++++++++++--------- rust-executor/src/mainnet_seed.json | 2 +- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index db7c5ac76..b9bb9ca3c 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -22,38 +22,37 @@ export class LinkAdapter implements LinkSyncAdapter { gossipLogCount: number = 0; myCurrentRevision: Buffer | null = null; languageName: String | null = null; + socket: any; constructor(context: LanguageContext, name: String) { //@ts-ignore this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; this.languageName = name; - const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); console.log("Created socket connection"); - socket.on('error', (error: any) => { + this.socket.on('error', (error: any) => { console.error('Error:', error); }); - socket.on('connect', () => { + this.socket.on('connect', () => { console.log('Connected to the server'); try { - socket.emit("join-room", this.languageName); + this.socket.emit("join-room", this.languageName); console.log("Sent the join-room signal"); - socket.on("signal", (signal: any) => { - this.handleHolochainSignal(signal); - }); } catch (e) { console.error("Error in socket connection: ", e); } }); - socket.on('disconnect', () => { + this.socket.on("signal", (signal: any) => { + this.handleHolochainSignal(signal); + }); + this.socket.on('disconnect', () => { console.log('Disconnected from the server'); - socket.connect(); }); - socket.on('connect_error', (error) => { + this.socket.on('connect_error', (error) => { console.error('Connection Error:', error); - socket.connect(); }); - socket.on('reconnect_attempt', () => { + this.socket.on('reconnect_attempt', () => { console.log('Trying to reconnect...'); }); } @@ -95,8 +94,9 @@ export class LinkAdapter implements LinkSyncAdapter { broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); }; console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); - const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); - socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); + console.log("sync(); sending broadcast payload"); + console.log(JSON.stringify(broadcast_payload)); + this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); @@ -251,9 +251,7 @@ export class LinkAdapter implements LinkSyncAdapter { broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); }; console.log("commit sending referenceh hash", broadcast_payload.reference_hash); - //Use client to send to socketIO - const socket = io("wss://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); - socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); + this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } return res as string; } catch (e) { @@ -304,7 +302,13 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.handleHolochainSignal: Got lock"); //const parsed = JSON.parse(reference_hash); - //console.log("Parsed ref hash", parsed); + console.log("Handle holochain signal parsed ref hash"); + console.log(JSON.stringify({ + diff, + reference_hash, + reference, + broadcast_author + })); if (!Buffer.isBuffer(reference_hash)) { reference_hash = Buffer.from(reference_hash, 'base64'); } diff --git a/rust-executor/src/mainnet_seed.json b/rust-executor/src/mainnet_seed.json index a62385949..67ce9cefc 100644 --- a/rust-executor/src/mainnet_seed.json +++ b/rust-executor/src/mainnet_seed.json @@ -3,7 +3,7 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdhgUgUwrFSzZ2tDHyw1xbCn7ncSDeB1sgCGSPixW18hC6" + "QmzSYwdfZvt4WwS5TNxd8aKjz8UxSM2Bd2QvW3ReS45iLc5ujUX" ], "directMessageLanguage": "QmzSYwdp8xNu5UdWWsKQhzZs4JLYDBTk22T7ksoi3hhpscZAm3E", "agentLanguage": "QmzSYwdigpRrQTmtXcATD4zAFp1nqbXB1tVJT7ho1JaThaXCynL", From b2237bc5eeb63352bd37e9c3d999958178798baa Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 10 Oct 2023 11:16:11 +0100 Subject: [PATCH 26/87] wake the event loop future on each poll --- rust-executor/src/js_core/futures.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rust-executor/src/js_core/futures.rs b/rust-executor/src/js_core/futures.rs index 9ab3418ff..f50a612cd 100644 --- a/rust-executor/src/js_core/futures.rs +++ b/rust-executor/src/js_core/futures.rs @@ -23,7 +23,9 @@ impl Future for EventLoopFuture { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let worker = self.worker.try_lock(); if let Ok(mut worker) = worker { - worker.poll_event_loop(cx, false) + let res = worker.poll_event_loop(cx, false); + cx.waker().wake_by_ref(); + res } else { Poll::Pending } From 931c1912f52eeab55d38d63ff075b489bb2fe737 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 10 Oct 2023 11:47:16 +0100 Subject: [PATCH 27/87] cleanup --- .../p-diff-sync/linksAdapter.ts | 26 +++++++++---------- cli/seed_proto.json | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index b9bb9ca3c..3701d6607 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -93,9 +93,9 @@ export class LinkAdapter implements LinkSyncAdapter { if (broadcast_payload.reference.parents) { broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); }; - console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); - console.log("sync(); sending broadcast payload"); - console.log(JSON.stringify(broadcast_payload)); + // console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); + // console.log("sync(); sending broadcast payload"); + // console.log(JSON.stringify(broadcast_payload)); this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } } catch (e) { @@ -242,15 +242,15 @@ export class LinkAdapter implements LinkSyncAdapter { this.myCurrentRevision = res; } let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); - console.log('commit got broadcast payload', broadcast_payload.referencence_hash); - console.log("which has type", typeof broadcast_payload.reference_hash); + // console.log('commit got broadcast payload', broadcast_payload.referencence_hash); + // console.log("which has type", typeof broadcast_payload.reference_hash); if (broadcast_payload) { broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); if (broadcast_payload.reference.parents) { broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); }; - console.log("commit sending referenceh hash", broadcast_payload.reference_hash); + //console.log("commit sending referenceh hash", broadcast_payload.reference_hash); this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); } return res as string; @@ -302,13 +302,13 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.handleHolochainSignal: Got lock"); //const parsed = JSON.parse(reference_hash); - console.log("Handle holochain signal parsed ref hash"); - console.log(JSON.stringify({ - diff, - reference_hash, - reference, - broadcast_author - })); + // console.log("Handle holochain signal parsed ref hash"); + // console.log(JSON.stringify({ + // diff, + // reference_hash, + // reference, + // broadcast_author + // })); if (!Buffer.isBuffer(reference_hash)) { reference_hash = Buffer.from(reference_hash, 'base64'); } diff --git a/cli/seed_proto.json b/cli/seed_proto.json index 6eff62b50..e261ea2c2 100644 --- a/cli/seed_proto.json +++ b/cli/seed_proto.json @@ -4,7 +4,7 @@ { "meta": { "name": "perspectiveDiffSync", - "description": "Holochain based Perspective link sharing language", + "description": "Holochain based Perspective link sharing language, with revision signals sent with socket.io", "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", "possibleTemplateParams": ["uid", "name", "description"] }, From 6aea1c486c284039c399e83427e465fa17899588 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 10 Oct 2023 11:55:50 +0100 Subject: [PATCH 28/87] add back old holochain only link language --- .../p-diff-sync-socket-signaling/.gitignore | 19 + .../p-diff-sync-socket-signaling/README.md | 3 + .../p-diff-sync-socket-signaling/esbuild.ts | 39 + .../hc-dna/Cargo.lock | 2795 +++++++++++++++++ .../hc-dna/Cargo.toml | 11 + .../hc-dna/build.ps1 | 2 + .../hc-dna/build.sh | 3 + .../hc-dna/default.nix | 14 + .../hc-dna/holochain_version.nix | 20 + .../hc-dna/nix/sources.json | 14 + .../hc-dna/nix/sources.nix | 174 + .../hc-dna/workdir/dna.yaml | 21 + .../zomes/perspective_diff_sync/Cargo.toml | 28 + .../zomes/perspective_diff_sync/src/errors.rs | 25 + .../zomes/perspective_diff_sync/src/inputs.rs | 29 + .../zomes/perspective_diff_sync/src/lib.rs | 195 ++ .../src/link_adapter/chunked_diffs.rs | 207 ++ .../src/link_adapter/commit.rs | 171 + .../src/link_adapter/mod.rs | 10 + .../src/link_adapter/pull.rs | 846 +++++ .../src/link_adapter/render.rs | 42 + .../src/link_adapter/revisions.rs | 32 + .../src/link_adapter/snapshots.rs | 264 ++ .../src/link_adapter/test_graphs.rs | 1495 +++++++++ .../src/link_adapter/tests.rs | 103 + .../src/link_adapter/topo_sort.rs | 143 + .../src/link_adapter/workspace.rs | 1427 +++++++++ .../perspective_diff_sync/src/retriever.rs | 35 + .../src/retriever/holochain.rs | 199 ++ .../src/retriever/mock.rs | 530 ++++ .../src/telepresence/mod.rs | 2 + .../src/telepresence/signal.rs | 30 + .../src/telepresence/status.rs | 232 ++ .../zomes/perspective_diff_sync/src/utils.rs | 46 + .../Cargo.toml | 18 + .../src/impls.rs | 68 + .../src/lib.rs | 169 + .../hc-dna/zomes/tests/common.ts | 6 + .../zomes/tests/download-hc-binaries.sh | 14 + .../hc-dna/zomes/tests/index.ts | 49 + .../hc-dna/zomes/tests/package.json | 40 + .../hc-dna/zomes/tests/pull.ts | 273 ++ .../hc-dna/zomes/tests/queue.ts | 82 + .../hc-dna/zomes/tests/render.ts | 270 ++ .../hc-dna/zomes/tests/revisions.ts | 92 + .../hc-dna/zomes/tests/signals.ts | 106 + .../hc-dna/zomes/tests/stress.ts | 355 +++ .../hc-dna/zomes/tests/telepresence.ts | 172 + .../hc-dna/zomes/tests/tsconfig.json | 16 + .../hc-dna/zomes/tests/utils.ts | 86 + .../hc-dna/zomes/tests/yarn.lock | 1833 +++++++++++ .../p-diff-sync-socket-signaling/index.ts | 59 + .../integration-test.js | 20 + .../linksAdapter.ts | 378 +++ .../p-diff-sync-socket-signaling/package.json | 43 + .../rollup.config.hc-dna.js | 71 + .../telepresenceAdapter.ts | 39 + .../tsconfig.json | 8 + bootstrap-languages/p-diff-sync/esbuild.ts | 19 +- .../zomes/perspective_diff_sync/src/lib.rs | 14 - .../src/link_adapter/commit.rs | 37 +- .../src/link_adapter/pull.rs | 2 +- bootstrap-languages/p-diff-sync/index.ts | 5 +- .../p-diff-sync/linksAdapter.ts | 104 +- bootstrap-languages/p-diff-sync/package.json | 2 +- cli/seed_proto.json | 11 +- turbo.json | 2 +- 67 files changed, 13503 insertions(+), 166 deletions(-) create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/.gitignore create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/README.md create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/esbuild.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.toml create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.ps1 create mode 100755 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.sh create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/default.nix create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/holochain_version.nix create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.json create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.nix create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/workdir/dna.yaml create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/errors.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/inputs.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/lib.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/chunked_diffs.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/mod.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/render.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/revisions.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/test_graphs.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/tests.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/topo_sort.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/mock.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/mod.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/status.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/utils.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/Cargo.toml create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/impls.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/lib.rs create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/common.ts create mode 100755 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/download-hc-binaries.sh create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/index.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/package.json create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/pull.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/queue.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/render.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/revisions.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/signals.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/stress.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/telepresence.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/tsconfig.json create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/utils.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/yarn.lock create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/index.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/integration-test.js create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/linksAdapter.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/package.json create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/rollup.config.hc-dna.js create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/telepresenceAdapter.ts create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/tsconfig.json diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore new file mode 100644 index 000000000..d302556a5 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore @@ -0,0 +1,19 @@ +.cargo +target +hc-dna/workdir/perspective-diff-sync.dna +hc-dna/zomes/tests/node_modules +hc-dna/zomes/tests/out.log +node_modules +.hc* +perspect-diff-sync.dna +*.log +.turbo + +*.js +*.js.map +!rollup.config* +!.dna.js +!integration-test.js + +.ad4m-test +ad4m-test-* \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/README.md b/bootstrap-languages/p-diff-sync-socket-signaling/README.md new file mode 100644 index 000000000..dadc2cd48 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/README.md @@ -0,0 +1,3 @@ +# Perspective Diff Sync + +Git like holochain syncing DNA for sharing of mutation to a shared perspective. \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/esbuild.ts b/bootstrap-languages/p-diff-sync-socket-signaling/esbuild.ts new file mode 100644 index 000000000..e479a51dd --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/esbuild.ts @@ -0,0 +1,39 @@ +import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/mod.js"; +// Import the WASM build on platforms where running subprocesses is not +// permitted, such as Deno Deploy, or when running without `--allow-run`. +// import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/wasm.js"; + +import { denoPlugins } from "https://deno.land/x/esbuild_deno_loader@0.7.0/mod.ts"; +import { loadSource, resolveUrl } from "./customHttpDownloader.js"; + +const result = await esbuild.build({ + plugins: [ + { + name: `buffer-alias`, + setup(build) { + build.onResolve({ filter: new RegExp(`^buffer$`) }, (args) => { + return { path: `https://deno.land/std@0.177.0/node/buffer.ts`, namespace: 'imports' }; + }); + + build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) + + build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { + return loadSource(args) + }) + }, + }, + ...denoPlugins() + ], + entryPoints: ['index.ts'], + outfile: 'build/bundle.js', + bundle: true, + platform: 'node', + target: 'deno1.32.4', + format: 'esm', + globalName: 'perspective.diff.sync.language', + charset: 'ascii', + legalComments: 'inline' +}); +console.log(result.outputFiles); + +esbuild.stop(); \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock new file mode 100644 index 000000000..7482a52c9 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.lock @@ -0,0 +1,2795 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object 0.29.0", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" + +[[package]] +name = "bytecheck" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d11cac2c12b5adc6570dad2ee1b87eff4955dac476fe12d81e5fdd352e52406f" +dependencies = [ + "bytecheck_derive", + "ptr_meta", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13e576ebe98e605500b3c8041bb888e966653577172df6dd97398714eb30b9bf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "camino" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77df041dc383319cc661b428b6961a005db4d6808d5e12536931b1ca9556055" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1ec454bc3eead8719cb56e15dbbfecdbc14e4b3a3ae4936cc6e31f5fc0d07" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.13", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +dependencies = [ + "iana-time-zone", + "num-integer", + "num-traits", + "serde", + "time", + "winapi", +] + +[[package]] +name = "colored" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "corosensei" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9847f90f32a50b0dcbd68bc23ff242798b13080b97b0569f6ed96a45ce4cf2cd" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "libc", + "scopeguard", + "windows-sys 0.33.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +dependencies = [ + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli", + "log", + "regalloc", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" + +[[package]] +name = "cranelift-entity" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" + +[[package]] +name = "cranelift-frontend" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset", + "once_cell", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02" +dependencies = [ + "darling_core 0.14.1", + "darling_macro 0.14.1", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5" +dependencies = [ + "darling_core 0.14.1", + "quote", + "syn", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dot-generator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322e00783838d540a6288c25ae085983750521fb8cca82fc653eb2457c369565" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "dot-generator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aaac7ada45f71873ebce336491d1c1bc4a7c8042c7cea978168ad59e805b871" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "dot-structures" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545da7d6df7f8fd0de7106669a7d0bfa3dbcfa24d81da46906ad658188b2ff7c" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumset" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "futures" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gcollections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f551fdf23ef80329f754919669147a71c67b6cfe3569cd93b6fabdd62044377" +dependencies = [ + "bit-set", + "num-integer", + "num-traits", + "trilean", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] + +[[package]] +name = "graphviz-rust" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a478d6485a680dcea01e3deba796c01866d63dabf06a20df4f969aaa1bac3f43" +dependencies = [ + "dot-generator 0.2.0", + "dot-structures", + "into-attr", + "into-attr-derive", + "pest", + "pest_derive", + "rand", + "tempfile", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "hdi" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b12f620a0d22b7dcd534a849f0024b0b47c4343b15f1c0ec02e37f4990f6f16" +dependencies = [ + "hdk_derive", + "holo_hash", + "holochain_integrity_types", + "holochain_wasmer_guest", + "paste", + "serde", + "serde_bytes", + "tracing", + "tracing-core", +] + +[[package]] +name = "hdk" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d50da8f292a1b819ae6a7651e9c3cb2ec97f00729125ad9ec3d31df8154eef7" +dependencies = [ + "getrandom", + "hdi", + "hdk_derive", + "holo_hash", + "holochain_wasmer_guest", + "holochain_zome_types", + "paste", + "serde", + "serde_bytes", + "thiserror", + "tracing", + "tracing-core", +] + +[[package]] +name = "hdk_derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc855dc170fec9ca44d2b21cba90fb961ef92acadaae0f0c7d090312a6212552" +dependencies = [ + "darling 0.14.1", + "heck", + "holochain_integrity_types", + "paste", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "holo_hash" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a5aa5c7b7c2d99ba6769e58ead10d5d4ead9036724a54a7fcea1c0203aac00e" +dependencies = [ + "base64", + "blake2b_simd", + "derive_more", + "holochain_serialized_bytes", + "holochain_util", + "holochain_wasmer_common", + "kitsune_p2p_dht_arc", + "serde", + "serde_bytes", + "thiserror", +] + +[[package]] +name = "holochain_integrity_types" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdfffeca0c6dea328a1ff7097946a951035dd137f4b9ad0db00f5377cd6c9326" +dependencies = [ + "holo_hash", + "holochain_serialized_bytes", + "holochain_util", + "kitsune_p2p_dht", + "kitsune_p2p_timestamp", + "paste", + "serde", + "serde_bytes", + "subtle", + "tracing", +] + +[[package]] +name = "holochain_serialized_bytes" +version = "0.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9805b3e01e7b5c144782a0823db4dc895fec18a9ccd45a492ce7c7bf157a9e38" +dependencies = [ + "holochain_serialized_bytes_derive", + "rmp-serde", + "serde", + "serde-transcode", + "serde_bytes", + "serde_json", + "thiserror", +] + +[[package]] +name = "holochain_serialized_bytes_derive" +version = "0.0.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1077232d0c427d64feb9e138fa22800e447eafb1810682d6c13beb95333cb32c" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "holochain_util" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c507f39c150414b64bb2fe8da311dc4e925435be887f8dfc3a97f8183d829878" +dependencies = [ + "cfg-if 0.1.10", + "derive_more", + "dunce", + "futures", + "num_cpus", + "once_cell", +] + +[[package]] +name = "holochain_wasmer_common" +version = "0.0.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "223daec7ca62d4e36841a99d8799b29cc616f5976ad0e2975e6ca6810de8f14f" +dependencies = [ + "holochain_serialized_bytes", + "serde", + "serde_bytes", + "test-fuzz", + "thiserror", + "wasmer", + "wasmer-engine", +] + +[[package]] +name = "holochain_wasmer_guest" +version = "0.0.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92b2026e44595cb16108464973622577936605582aa22932933a5130ad32ce42" +dependencies = [ + "holochain_serialized_bytes", + "holochain_wasmer_common", + "parking_lot", + "paste", + "serde", + "tracing", +] + +[[package]] +name = "holochain_zome_types" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b77f5caa760c7b34019739fb3b0a986a235fa0a09086b8eaff8cf7a72a2a6ce" +dependencies = [ + "holo_hash", + "holochain_integrity_types", + "holochain_serialized_bytes", + "holochain_wasmer_common", + "kitsune_p2p_bin_data", + "kitsune_p2p_block", + "kitsune_p2p_dht", + "kitsune_p2p_timestamp", + "paste", + "serde", + "serde_bytes", + "subtle", + "thiserror", + "tracing", +] + +[[package]] +name = "home" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408" +dependencies = [ + "winapi", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c495f162af0bf17656d0014a0eded5f3cd2f365fdd204548c2869db89359dc7" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "once_cell", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "intervallum" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ccecd834666f695ecec3ff0d5fc32e32c91abea91a28fd0aceb4b35a82cee1" +dependencies = [ + "bit-set", + "gcollections", + "num-integer", + "num-traits", + "trilean", +] + +[[package]] +name = "into-attr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ec0dd848c05d2695dd73818984fb156ac8cbcbfdf4e474243590bfcc2468e9" +dependencies = [ + "dot-structures", +] + +[[package]] +name = "into-attr-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b88c3c684271aa7810934ae69a0b904c59f478cb551f3f388cc1c384f0c3145" +dependencies = [ + "dot-generator 0.1.0", + "dot-structures", + "into-attr", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "js-sys" +version = "0.3.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kitsune_p2p_bin_data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb0b2032c0ee5683bc4d4c7c705f545992655bd5dc6235e62d0f916197a5c0af" +dependencies = [ + "base64", + "derive_more", + "holochain_util", + "kitsune_p2p_dht_arc", + "serde", + "serde_bytes", + "shrinkwraprs", +] + +[[package]] +name = "kitsune_p2p_block" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e15586a9b4f1ec2190d1b92b706995f15a871003955548e6be434cadd75413dd" +dependencies = [ + "kitsune_p2p_bin_data", + "kitsune_p2p_timestamp", + "serde", + "serde_bytes", +] + +[[package]] +name = "kitsune_p2p_dht" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf6ff683970365a1c3b71192a116abeb986512ced906e4e25cc7ad40bf65b1b3" +dependencies = [ + "colored", + "derivative", + "derive_more", + "futures", + "gcollections", + "intervallum", + "kitsune_p2p_dht_arc", + "kitsune_p2p_timestamp", + "must_future", + "num-traits", + "once_cell", + "rand", + "serde", + "statrs", + "thiserror", + "tracing", +] + +[[package]] +name = "kitsune_p2p_dht_arc" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f71f358459319708884f9295f122cb7b69a8589300fb232b573a36af04d0a7bc" +dependencies = [ + "derive_more", + "gcollections", + "intervallum", + "num-traits", + "serde", +] + +[[package]] +name = "kitsune_p2p_timestamp" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e173408aabd1fccedec2ba096b8feac7ef769c435294607f4ae5bc5b83ebc9e" +dependencies = [ + "chrono", + "derive_more", + "serde", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" + +[[package]] +name = "libloading" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +dependencies = [ + "cfg-if 1.0.0", + "winapi", +] + +[[package]] +name = "libm" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" + +[[package]] +name = "lock_api" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "loupe" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matrixmultiply" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95af15f345b17af2efc8ead6080fb8bc376f8cec1b35277b935637595fe77498" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" +dependencies = [ + "adler", +] + +[[package]] +name = "more-asserts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" + +[[package]] +name = "must_future" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a160ffed3c2f98d2906c67a9b6e4e1f09cca7e17e3f780286a349061459eeebe" +dependencies = [ + "futures", + "pin-utils", +] + +[[package]] +name = "nalgebra" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "462fffe4002f4f2e1f6a9dcf12cc1a6fc0e15989014efc02a941d3e0f5dc2120" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "rand", + "rand_distr", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-complex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "crc32fast", + "hashbrown 0.11.2", + "indexmap", + "memchr", +] + +[[package]] +name = "object" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys 0.42.0", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "perspective_diff_sync" +version = "0.0.1" +dependencies = [ + "chrono", + "derive_more", + "dot-structures", + "graphviz-rust", + "hdk", + "holo_hash", + "itertools 0.10.3", + "lazy_static", + "maplit", + "perspective_diff_sync_integrity", + "petgraph", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "perspective_diff_sync_integrity" +version = "0.0.1" +dependencies = [ + "chrono", + "derive_more", + "hdi", + "hdk", + "holo_hash", + "serde", +] + +[[package]] +name = "pest" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb779fcf4bb850fbbb0edc96ff6cf34fd90c4b1a112ce042653280d9a7364048" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502b62a6d0245378b04ffe0a7fb4f4419a4815fce813bd8a0ec89a56e07d67b1" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451e629bf49b750254da26132f1a5a9d11fd8a95a3df51d15c4abd1ba154cb6c" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcec162c71c45e269dfc3fc2916eaeb97feab22993a21bcce4721d08cd7801a6" +dependencies = [ + "once_cell", + "pest", + "sha1", +] + +[[package]] +name = "petgraph" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regalloc" +version = "0.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "rend" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79af64b4b6362ffba04eef3a4e10829718a4896dac19daa741851c86781edf95" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cec2b3485b07d96ddfd3134767b8a447b45ea4eb91448d0a35180ec0ffd5ed15" +dependencies = [ + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eaedadc88b53e36dd32d940ed21ae4d850d5916f2581526921f553a72ac34c4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "rmp" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723ecff9ad04f4ad92fe1c8ca6c20d2196d9286e9c60727c4cb5511629260e9d" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.13", +] + +[[package]] +name = "rustversion" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-transcode" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_bytes" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha1" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006769ba83e921b3085caa8334186b00cf92b4cb1a6cf4632fbccc8eff5c7549" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + +[[package]] +name = "shrinkwraprs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" +dependencies = [ + "bitflags", + "itertools 0.8.2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "simba" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e82063457853d00243beda9952e910b82593e4b07ae9f721b9278a99a0d3d5c" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "statrs" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05bdbb8e4e78216a85785a85d3ec3183144f98d0097b9281802c019bb07a6f05" +dependencies = [ + "approx", + "lazy_static", + "nalgebra", + "num-traits", + "rand", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + +[[package]] +name = "subprocess" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2e86926081dda636c546d8c5e641661049d7562a68f5488be4a1f7f66f6086" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "target-lexicon" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "test-fuzz" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125df852011c4f8f31df5620f4aea38ecddb5dfb4d9bc569b30485b15ffc3d4e" +dependencies = [ + "serde", + "test-fuzz-internal", + "test-fuzz-macro", + "test-fuzz-runtime", +] + +[[package]] +name = "test-fuzz-internal" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58071dc2471840e9f374eeb0f6e405a31bccb3cc5d59bb4598f02cafc274b5c4" +dependencies = [ + "cargo_metadata", + "proc-macro2", + "quote", + "serde", + "strum_macros", +] + +[[package]] +name = "test-fuzz-macro" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856bbca0314c328004691b9c0639fb198ca764d1ce0e20d4dd8b78f2697c2a6f" +dependencies = [ + "darling 0.14.1", + "if_chain", + "lazy_static", + "proc-macro2", + "quote", + "subprocess", + "syn", + "test-fuzz-internal", + "toolchain_find", + "unzip-n", +] + +[[package]] +name = "test-fuzz-runtime" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "303774eb17994c2ddb59c460369f4c3a55496f013380278d78eeebd2deb896ac" +dependencies = [ + "bincode", + "hex", + "num-traits", + "serde", + "sha-1", + "test-fuzz-internal", +] + +[[package]] +name = "thiserror" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1b05ca9d106ba7d2e31a9dab4a64e7be2cce415321966ea3132c49a656e252" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8f2591983642de85c921015f3f070c665a197ed69e417af436115e3a1407487" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "toolchain_find" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e85654a10e7a07a47c6f19d93818f3f343e22927f2fa280c84f7c8042743413" +dependencies = [ + "home", + "lazy_static", + "regex", + "semver 0.11.0", + "walkdir", +] + +[[package]] +name = "tracing" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" +dependencies = [ + "cfg-if 1.0.0", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "trilean" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683ba5022fe6dbd7133cad150478ccf51bdb6d861515181e5fc6b4323d4fa424" + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "unicode-ident" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" + +[[package]] +name = "unicode-width" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" + +[[package]] +name = "unzip-n" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7e85a0596447f0f2ac090e16bc4c516c6fe91771fb0c0ccf7fa3dae896b9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" + +[[package]] +name = "wasm-encoder" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d443c5a7daae71697d97ec12ad70b4fe8766d3a0f4db16158ac8b781365892f7" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8d8361c9d006ea3d7797de7bd6b1492ffd0f91a22430cfda6c1658ad57bedf" +dependencies = [ + "cfg-if 1.0.0", + "indexmap", + "js-sys", + "loupe", + "more-asserts", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-derive", + "wasmer-engine", + "wasmer-engine-dylib", + "wasmer-engine-universal", + "wasmer-types", + "wasmer-vm", + "wat", + "winapi", +] + +[[package]] +name = "wasmer-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aaf9428c29c1d8ad2ac0e45889ba8a568a835e33fd058964e5e500f2f7ce325" +dependencies = [ + "enumset", + "loupe", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67a6cd866aed456656db2cfea96c18baabbd33f676578482b85c51e1ee19d2c" +dependencies = [ + "enumset", + "loupe", + "rkyv", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon", + "thiserror", + "wasmer-types", + "wasmparser", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48be2f9f6495f08649e4f8b946a2cbbe119faf5a654aa1457f9504a99d23dae0" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e50405cc2a2f74ff574584710a5f2c1d5c93744acce2ca0866084739284b51" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "wasmer-engine" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f98f010978c244db431b392aeab0661df7ea0822343334f8f2a920763548e45" +dependencies = [ + "backtrace", + "enumset", + "lazy_static", + "loupe", + "memmap2", + "more-asserts", + "rustc-demangle", + "serde", + "serde_bytes", + "target-lexicon", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-engine-dylib" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0358af9c154724587731175553805648d9acb8f6657880d165e378672b7e53" +dependencies = [ + "cfg-if 1.0.0", + "enum-iterator", + "enumset", + "leb128", + "libloading", + "loupe", + "object 0.28.4", + "rkyv", + "serde", + "tempfile", + "tracing", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-engine", + "wasmer-object", + "wasmer-types", + "wasmer-vm", + "which", +] + +[[package]] +name = "wasmer-engine-universal" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440dc3d93c9ca47865a4f4edd037ea81bf983b5796b59b3d712d844b32dbef15" +dependencies = [ + "cfg-if 1.0.0", + "enumset", + "leb128", + "loupe", + "region", + "rkyv", + "wasmer-compiler", + "wasmer-engine", + "wasmer-engine-universal-artifact", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-engine-universal-artifact" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f1db3f54152657eb6e86c44b66525ff7801dad8328fe677da48dd06af9ad41" +dependencies = [ + "enum-iterator", + "enumset", + "loupe", + "rkyv", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-object" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d831335ff3a44ecf451303f6f891175c642488036b92ceceb24ac8623a8fa8b" +dependencies = [ + "object 0.28.4", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-types" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39df01ea05dc0a9bab67e054c7cb01521e53b35a7bb90bd02eca564ed0b2667f" +dependencies = [ + "backtrace", + "enum-iterator", + "indexmap", + "loupe", + "more-asserts", + "rkyv", + "serde", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d965fa61f4dc4cdb35a54daaf7ecec3563fbb94154a6c35433f879466247dd" +dependencies = [ + "backtrace", + "cc", + "cfg-if 1.0.0", + "corosensei", + "enum-iterator", + "indexmap", + "lazy_static", + "libc", + "loupe", + "mach", + "memoffset", + "more-asserts", + "region", + "rkyv", + "scopeguard", + "serde", + "thiserror", + "wasmer-artifact", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.83.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" + +[[package]] +name = "wast" +version = "46.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0ab19660e3ea6891bba69167b9be40fad00fb1fe3dd39c5eebcee15607131b" +dependencies = [ + "leb128", + "memchr", + "unicode-width", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f775282def4d5bffd94d60d6ecd57bfe6faa46171cdbf8d32bd5458842b1e3e" +dependencies = [ + "wast", +] + +[[package]] +name = "which" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc 0.42.0", + "windows_i686_gnu 0.42.0", + "windows_i686_msvc 0.42.0", + "windows_x86_64_gnu 0.42.0", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc 0.42.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" + +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" + +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.toml b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.toml new file mode 100644 index 000000000..208186f1e --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/Cargo.toml @@ -0,0 +1,11 @@ +[workspace] +members = [ + "zomes/perspective_diff_sync", + "zomes/perspective_diff_sync_integrity" +] + +[profile.dev] +opt-level = "z" + +[profile.release] +opt-level = "z" \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.ps1 b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.ps1 new file mode 100644 index 000000000..81582cbd3 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.ps1 @@ -0,0 +1,2 @@ +cargo build --release --target wasm32-unknown-unknown +hc dna pack workdir \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.sh b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.sh new file mode 100755 index 000000000..a089cc772 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash +CARGO_TARGET_DIR=target cargo build --release --target wasm32-unknown-unknown +hc dna pack workdir \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/default.nix b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/default.nix new file mode 100644 index 000000000..33f97a914 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/default.nix @@ -0,0 +1,14 @@ +let + holonixPath = (import ./nix/sources.nix).holonix; # points to the current state of the Holochain repository + holonix = import (holonixPath) { + holochainVersionId = "main"; + }; + nixpkgs = holonix.pkgs; +in nixpkgs.mkShell { + inputsFrom = [ holonix.main ]; + packages = with nixpkgs; [ + binaryen + nodejs-16_x + swiProlog + ]; +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/holochain_version.nix b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/holochain_version.nix new file mode 100644 index 000000000..acfe9651f --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/holochain_version.nix @@ -0,0 +1,20 @@ +# This file was generated with the following command: +# update-holochain-versions --git-src=revision:holochain-0.0.161 --lair-version-req=~0.2 --output-file=holochain_version.nix +# For usage instructions please visit https://github.com/holochain/holochain-nixpkgs/#readme + +{ + url = "https://github.com/holochain/holochain"; + rev = "holochain-0.2.2"; + sha256 = "sha256-xp1DTVrhGZc1CZr6LvBFZZhoOUbUPpg3/mWOj4DDXjI="; + cargoLock = { + outputHashes = { + }; + }; + + binsFilter = [ + "holochain" + "hc" + "kitsune-p2p-proxy" + "kitsune-p2p-tx2-proxy" + ]; +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.json b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.json new file mode 100644 index 000000000..451563814 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.json @@ -0,0 +1,14 @@ +{ + "holonix": { + "branch": "main", + "description": "NixOS && Holochain", + "homepage": "", + "owner": "holochain", + "repo": "holonix", + "rev": "241c1754a37881f51f2f33921a2777b38c34fa24", + "sha256": "sha256:0zaa477kyzpsrcc3nk1jznp4gchwm4pk5p37pwkq6mjhiizcxshy", + "type": "tarball", + "url": "https://github.com/holochain/holonix/archive/241c1754a37881f51f2f33921a2777b38c34fa24.tar.gz", + "url_template": "https://github.com///archive/.tar.gz" + } +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.nix b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.nix new file mode 100644 index 000000000..fe2468872 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/nix/sources.nix @@ -0,0 +1,174 @@ +# This file has been generated by Niv. + +let + + # + # The fetchers. fetch_ fetches specs of type . + # + + fetch_file = pkgs: name: spec: + let + name' = sanitizeName name + "-src"; + in + if spec.builtin or true then + builtins_fetchurl { inherit (spec) url sha256; name = name'; } + else + pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; + + fetch_tarball = pkgs: name: spec: + let + name' = sanitizeName name + "-src"; + in + if spec.builtin or true then + builtins_fetchTarball { name = name'; inherit (spec) url sha256; } + else + pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; + + fetch_git = name: spec: + let + ref = + if spec ? ref then spec.ref else + if spec ? branch then "refs/heads/${spec.branch}" else + if spec ? tag then "refs/tags/${spec.tag}" else + abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; + in + builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; }; + + fetch_local = spec: spec.path; + + fetch_builtin-tarball = name: throw + ''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. + $ niv modify ${name} -a type=tarball -a builtin=true''; + + fetch_builtin-url = name: throw + ''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. + $ niv modify ${name} -a type=file -a builtin=true''; + + # + # Various helpers + # + + # https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 + sanitizeName = name: + ( + concatMapStrings (s: if builtins.isList s then "-" else s) + ( + builtins.split "[^[:alnum:]+._?=-]+" + ((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) + ) + ); + + # The set of packages used when specs are fetched using non-builtins. + mkPkgs = sources: system: + let + sourcesNixpkgs = + import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; + hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; + hasThisAsNixpkgsPath = == ./.; + in + if builtins.hasAttr "nixpkgs" sources + then sourcesNixpkgs + else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then + import {} + else + abort + '' + Please specify either (through -I or NIX_PATH=nixpkgs=...) or + add a package called "nixpkgs" to your sources.json. + ''; + + # The actual fetching function. + fetch = pkgs: name: spec: + + if ! builtins.hasAttr "type" spec then + abort "ERROR: niv spec ${name} does not have a 'type' attribute" + else if spec.type == "file" then fetch_file pkgs name spec + else if spec.type == "tarball" then fetch_tarball pkgs name spec + else if spec.type == "git" then fetch_git name spec + else if spec.type == "local" then fetch_local spec + else if spec.type == "builtin-tarball" then fetch_builtin-tarball name + else if spec.type == "builtin-url" then fetch_builtin-url name + else + abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; + + # If the environment variable NIV_OVERRIDE_${name} is set, then use + # the path directly as opposed to the fetched source. + replace = name: drv: + let + saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name; + ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; + in + if ersatz == "" then drv else + # this turns the string into an actual Nix path (for both absolute and + # relative paths) + if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; + + # Ports of functions for older nix versions + + # a Nix version of mapAttrs if the built-in doesn't exist + mapAttrs = builtins.mapAttrs or ( + f: set: with builtins; + listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) + ); + + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 + range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); + + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 + stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); + + # https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 + stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); + concatMapStrings = f: list: concatStrings (map f list); + concatStrings = builtins.concatStringsSep ""; + + # https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 + optionalAttrs = cond: as: if cond then as else {}; + + # fetchTarball version that is compatible between all the versions of Nix + builtins_fetchTarball = { url, name ? null, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchTarball; + in + if lessThan nixVersion "1.12" then + fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) + else + fetchTarball attrs; + + # fetchurl version that is compatible between all the versions of Nix + builtins_fetchurl = { url, name ? null, sha256 }@attrs: + let + inherit (builtins) lessThan nixVersion fetchurl; + in + if lessThan nixVersion "1.12" then + fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) + else + fetchurl attrs; + + # Create the final "sources" from the config + mkSources = config: + mapAttrs ( + name: spec: + if builtins.hasAttr "outPath" spec + then abort + "The values in sources.json should not have an 'outPath' attribute" + else + spec // { outPath = replace name (fetch config.pkgs name spec); } + ) config.sources; + + # The "config" used by the fetchers + mkConfig = + { sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null + , sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile) + , system ? builtins.currentSystem + , pkgs ? mkPkgs sources system + }: rec { + # The sources, i.e. the attribute set of spec name to spec + inherit sources; + + # The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers + inherit pkgs; + }; + +in +mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/workdir/dna.yaml b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/workdir/dna.yaml new file mode 100644 index 000000000..8a41b760b --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/workdir/dna.yaml @@ -0,0 +1,21 @@ +--- +manifest_version: 1 +name: "perspective-diff-sync" +integrity: + network_seed: 00000000-0000-0000-0000-000000000000 + properties: { + "enforce_spam_limit": 20, + "max_chunk_interval": 3599000, + "active_agent_duration_s": 300, + "enable_signals": true + } + origin_time: 2022-02-11T23:05:19.470323Z + zomes: + - name: perspective_diff_sync_integrity + bundled: ../target/wasm32-unknown-unknown/release/perspective_diff_sync_integrity.wasm +coordinator: + zomes: + - name: perspective_diff_sync + bundled: ../target/wasm32-unknown-unknown/release/perspective_diff_sync.wasm + dependencies: + - name: perspective_diff_sync_integrity \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml new file mode 100644 index 000000000..cfda8d8c6 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/Cargo.toml @@ -0,0 +1,28 @@ +[package] +authors = ["josh@junto.foundation"] +edition = "2018" +name = "perspective_diff_sync" +version = "0.0.1" + +[lib] +crate-type = ["cdylib", "rlib"] +name = "perspective_diff_sync" + +[dependencies] +derive_more = "0" +serde = "1" +lazy_static = "*" +chrono = { version = "0.4.22", default-features = false, features = ["clock", "std", "oldtime", "serde"] } +thiserror = "1.0.20" +petgraph = "0.6.2" +maplit = "1.0.2" +graphviz-rust = "0.2.1" +dot-structures = "0.1.0" +itertools = "0.10.3" +perspective_diff_sync_integrity = { path = "../perspective_diff_sync_integrity" } +sha2 = "0.10.5" +hdk = "0.2.2" +holo_hash = "0.2.2" + +[features] +test = [] \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/errors.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/errors.rs new file mode 100644 index 000000000..83eb919ab --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/errors.rs @@ -0,0 +1,25 @@ +use hdk::prelude::*; +use holo_hash::error::HoloHashError; +use std::convert::Infallible; + +#[derive(thiserror::Error, Debug)] +pub enum SocialContextError { + #[error(transparent)] + Serialization(#[from] SerializedBytesError), + #[error(transparent)] + Infallible(#[from] Infallible), + #[error(transparent)] + EntryError(#[from] EntryError), + #[error(transparent)] + Wasm(#[from] WasmError), + #[error(transparent)] + HoloHashError(#[from] HoloHashError), + #[error("Internal Error. Error: {0}")] + InternalError(&'static str), + #[error("No common ancestor found")] + NoCommonAncestorFound, + #[error("No did found")] + NoDidFound, +} + +pub type SocialContextResult = Result; diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/inputs.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/inputs.rs new file mode 100644 index 000000000..403cc7f92 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/inputs.rs @@ -0,0 +1,29 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::PerspectiveExpression; + +use crate::Hash; + +#[derive(Serialize, Deserialize, Clone, SerializedBytes, Debug, PartialEq, Eq, Hash)] +pub struct ExpressionProof { + pub signature: String, + pub key: String, +} + +#[derive(Serialize, Deserialize, Clone, SerializedBytes, Debug, PartialEq, Eq, Hash)] +pub struct Triple { + pub source: Option, + pub target: Option, + pub predicate: Option, +} + +#[derive(Serialize, Deserialize, Clone, SerializedBytes, Debug)] +pub struct SignalData { + pub remote_agent_did: String, + pub payload: PerspectiveExpression, +} + +#[derive(Serialize, Deserialize, Clone, SerializedBytes, Debug)] +pub struct PullArguments { + pub hash: Hash, + pub is_scribe: bool, +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/lib.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/lib.rs new file mode 100644 index 000000000..e837a592b --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/lib.rs @@ -0,0 +1,195 @@ +#[macro_use] +extern crate lazy_static; + +use hdk::prelude::*; +use inputs::PullArguments; +use lazy_static::lazy_static; + +use perspective_diff_sync_integrity::{ + HashBroadcast, OnlineAgent, OnlineAgentAndAction, Perspective, PerspectiveDiff, + PerspectiveExpression, PullResult, +}; + +mod errors; +mod inputs; +mod link_adapter; +mod retriever; +mod telepresence; +mod utils; + +#[macro_use] +extern crate maplit; + +pub type Hash = HoloHash; + +#[hdk_extern] +fn init(_: ()) -> ExternResult { + let mut functions = BTreeSet::new(); + functions.insert((zome_info()?.name, "get_online_status".into())); + //TODO; is this next function needed? + functions.insert((zome_info()?.name, "recv_remote_signal".into())); + + let functions: GrantedFunctions = GrantedFunctions::Listed(functions); + + create_cap_grant(CapGrantEntry { + tag: "".into(), + // empty access converts to unrestricted + access: ().into(), + functions, + })?; + link_adapter::commit::add_active_agent_link::() + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(InitCallbackResult::Pass) +} + +/// LinkLanguage implementation + +#[hdk_extern] +pub fn commit(diff: PerspectiveDiff) -> ExternResult { + link_adapter::commit::commit::(diff) + .map_err(|error| utils::err(&format!("{}", error))) +} + +#[hdk_extern] +pub fn current_revision(_: ()) -> ExternResult> { + link_adapter::revisions::current_revision::() + .map_err(|error| utils::err(&format!("{}", error))) + .map(|val| val.map(|val| val.hash)) +} + +#[hdk_extern] +pub fn sync(_: ()) -> ExternResult> { + link_adapter::commit::broadcast_current::() + .map_err(|error| utils::err(&format!("{}", error))) +} + +#[hdk_extern] +pub fn get_broadcast_payload(_: ()) -> ExternResult> { + link_adapter::commit::get_broadcast_payload::() + .map_err(|error| utils::err(&format!("{}", error))) +} + +#[hdk_extern] +pub fn pull(args: PullArguments) -> ExternResult { + link_adapter::pull::pull::(true, args.hash, args.is_scribe) + .map_err(|error| utils::err(&format!("{}", error))) +} + +#[hdk_extern] +pub fn render(_: ()) -> ExternResult { + link_adapter::render::render::() + .map_err(|error| utils::err(&format!("{}", error))) +} + +#[hdk_extern] +pub fn update_current_revision(_hash: Hash) -> ExternResult<()> { + #[cfg(feature = "test")] + { + link_adapter::revisions::update_current_revision::( + _hash, + utils::get_now().unwrap(), + ) + .map_err(|err| utils::err(&format!("{}", err)))?; + } + Ok(()) +} + +/// Signal handling + +#[hdk_extern] +fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { + //Check if its a normal diff expression signal + match HashBroadcast::try_from(signal.clone()) { + Ok(broadcast) => { + debug!("Received broadcast: {:?} in HOLOCHAIN", broadcast); + link_adapter::pull::handle_broadcast::(broadcast) + .map_err(|err| utils::err(&format!("{}", err)))?; + } + //Check if its a broadcast message + Err(_) => match PerspectiveExpression::try_from(signal.clone()) { + Ok(sig) => emit_signal(sig)?, + //Check if its an online ping + Err(_) => return Err(utils::err(&format!("Signal not recognized: {:?}", signal))), + }, + }; + Ok(()) +} + +#[hdk_extern] +pub fn handle_broadcast(broadcast: HashBroadcast) -> ExternResult<()> { + link_adapter::pull::handle_broadcast::(broadcast) + .map_err(|err| utils::err(&format!("{}", err)))?; + Ok(()) +} + +// Telepresence implementation + +#[hdk_extern] +pub fn set_online_status(status: PerspectiveExpression) -> ExternResult<()> { + telepresence::status::set_online_status(status) + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(()) +} + +#[hdk_extern] +pub fn create_did_pub_key_link(did: String) -> ExternResult<()> { + telepresence::status::create_did_pub_key_link(did) + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(()) +} + +#[hdk_extern] +pub fn get_online_agents(_: ()) -> ExternResult> { + let res = telepresence::status::get_online_agents() + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +#[hdk_extern] +pub fn get_online_status(_: ()) -> ExternResult { + let res = telepresence::status::get_online_status() + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +#[hdk_extern] +pub fn get_agents_status(agent: AgentPubKey) -> ExternResult> { + let res = telepresence::status::get_agents_status(agent); + Ok(res) +} + +#[hdk_extern] +pub fn send_signal(signal_data: inputs::SignalData) -> ExternResult { + let res = telepresence::signal::send_signal(signal_data) + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +#[hdk_extern] +pub fn send_broadcast(data: PerspectiveExpression) -> ExternResult { + let res = telepresence::signal::send_broadcast(data) + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +#[hdk_extern] +pub fn get_active_agents(_: ()) -> ExternResult> { + let res = retriever::holochain::get_active_agents() + .map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +#[hdk_extern] +pub fn get_others(_: ()) -> ExternResult> { + let res = + telepresence::status::get_others().map_err(|error| utils::err(&format!("{}", error)))?; + Ok(res) +} + +//not loading from DNA properies since dna zome properties is always null for some reason +lazy_static! { + pub static ref ACTIVE_AGENT_DURATION: chrono::Duration = chrono::Duration::seconds(3600); + pub static ref ENABLE_SIGNALS: bool = true; + pub static ref SNAPSHOT_INTERVAL: usize = 100; + pub static ref CHUNK_SIZE: u16 = 10000; +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/chunked_diffs.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/chunked_diffs.rs new file mode 100644 index 000000000..5a6912dc2 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/chunked_diffs.rs @@ -0,0 +1,207 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + EntryTypes, LinkExpression, PerspectiveDiff, +}; + +use crate::{Hash, CHUNK_SIZE}; +use crate::errors::{SocialContextResult}; +use crate::retriever::{PerspectiveDiffRetreiver}; + +#[derive(Clone)] +pub struct ChunkedDiffs { + max_changes_per_chunk: u16, + pub chunks: Vec +} + +impl ChunkedDiffs { + pub fn new(max: u16) -> Self { + Self { + max_changes_per_chunk: max, + chunks: vec![PerspectiveDiff::new()], + } + } + + pub fn add_additions(&mut self, links: Vec) { + let mut reverse_links = links.into_iter().rev().collect::>(); + while reverse_links.len() > 0 { + let len = self.chunks.len(); + let current_chunk = self.chunks.get_mut(len-1).expect("must have at least one"); + + while current_chunk.total_diff_number() < self.max_changes_per_chunk.into() && reverse_links.len() > 0 { + current_chunk.additions.push(reverse_links.pop().unwrap()); + } + + if reverse_links.len() > 0 { + self.chunks.push(PerspectiveDiff::new()) + } + } + } + + pub fn add_removals(&mut self, links: Vec) { + let mut reverse_links = links.into_iter().rev().collect::>(); + while reverse_links.len() > 0 { + let len = self.chunks.len(); + let current_chunk = self.chunks.get_mut(len-1).expect("must have at least one"); + + while current_chunk.total_diff_number() < self.max_changes_per_chunk.into() && reverse_links.len() > 0 { + current_chunk.removals.push(reverse_links.pop().unwrap()); + } + + if reverse_links.len() > 0 { + self.chunks.push(PerspectiveDiff::new()) + } + } + } + + pub fn into_entries(self) -> SocialContextResult> { + debug!("ChunkedDiffs.into_entries()"); + self.chunks + .into_iter() + .map(|chunk_diff| { + debug!("ChunkedDiffs writing chunk of size: {}", chunk_diff.total_diff_number()); + Retreiver::create_entry(EntryTypes::PerspectiveDiff(chunk_diff)) + }) + .collect() + } + + pub fn from_entries(hashes: Vec) -> SocialContextResult { + let mut diffs = Vec::new(); + for hash in hashes.into_iter() { + diffs.push(Retreiver::get::(hash)?); + } + + Ok(ChunkedDiffs { + max_changes_per_chunk: *CHUNK_SIZE, + chunks: diffs, + }) + } + + pub fn into_aggregated_diff(self) -> PerspectiveDiff { + self.chunks.into_iter().reduce(|accum, item| { + let mut temp = accum.clone(); + temp.additions.append(&mut item.additions.clone()); + temp.removals.append(&mut item.removals.clone()); + temp + }) + .unwrap_or(PerspectiveDiff::new()) + } +} + + +#[cfg(test)] +mod tests { + use super::ChunkedDiffs; + use crate::utils::create_link_expression; + use crate::retriever::{GLOBAL_MOCKED_GRAPH, MockPerspectiveGraph}; + + #[test] + fn can_chunk() { + let mut chunks = ChunkedDiffs::new(5); + + chunks.add_additions(vec![ + create_link_expression("a", "1"), + create_link_expression("a", "2"), + create_link_expression("a", "3"), + ]); + + assert_eq!(chunks.chunks.len(), 1); + + chunks.add_additions(vec![ + create_link_expression("a", "4"), + create_link_expression("a", "5"), + create_link_expression("a", "6"), + ]); + + assert_eq!(chunks.chunks.len(), 2); + + chunks.add_removals(vec![ + create_link_expression("a", "1"), + create_link_expression("a", "2"), + create_link_expression("a", "3"), + create_link_expression("a", "4"), + create_link_expression("a", "5"), + create_link_expression("a", "6"), + ]); + + assert_eq!(chunks.chunks.len(), 3); + } + + #[test] + fn can_aggregate() { + let mut chunks = ChunkedDiffs::new(5); + + let _a1 = create_link_expression("a", "1"); + let _a2 = create_link_expression("a", "2"); + let _r1 = create_link_expression("r", "1"); + let _r2 = create_link_expression("r", "2"); + let _r3 = create_link_expression("r", "3"); + let _r4 = create_link_expression("r", "4"); + + + chunks.add_additions(vec![_a1.clone()]); + chunks.add_additions(vec![_a2.clone()]); + chunks.add_removals(vec![_r1.clone(),_r2.clone(),_r3.clone(),_r4.clone()]); + + assert_eq!(chunks.chunks.len(), 2); + + let diff = chunks.into_aggregated_diff(); + + assert_eq!(diff.additions, vec![_a1,_a2]); + assert_eq!(diff.removals, vec![_r1,_r2,_r3,_r4]); + } + + #[test] + fn can_chunk_big_diffs() { + let mut chunks = ChunkedDiffs::new(500); + + let mut big_diff_add = Vec::new(); + for i in 0..5000 { + big_diff_add.push(create_link_expression("a", &format!("{}", i))); + } + chunks.add_additions(big_diff_add); + + let mut big_diff_remove = Vec::new(); + for i in 0..800 { + big_diff_remove.push(create_link_expression("a", &format!("{}", i))); + } + chunks.add_removals(big_diff_remove); + + let mut big_diff_add = Vec::new(); + for i in 0..213 { + big_diff_add.push(create_link_expression("a", &format!("{}", i))); + } + chunks.add_additions(big_diff_add); + + assert_eq!(chunks.chunks.len(), 13); + for i in 0..12 { + assert_eq!(chunks.chunks[i].total_diff_number(), 500); + } + assert_eq!(chunks.chunks[12].total_diff_number(), 13); + } + + #[test] + fn can_write_and_read_entries() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot("digraph{}").expect("can create mock graph from empty dot"); + } + update(); + + let mut chunks = ChunkedDiffs::new(500); + + let mut big_diff_add = Vec::new(); + for i in 0..5000 { + big_diff_add.push(create_link_expression("a", &format!("{}", i))); + } + chunks.add_additions(big_diff_add); + + assert_eq!(chunks.chunks.len(), 10); + + let chunks_clone = chunks.clone(); + let hashes = chunks.into_entries::().expect("into_entries does not error"); + let read_chunks = ChunkedDiffs::from_entries::(hashes).expect("from_entries does not error"); + + assert_eq!(read_chunks.chunks.len(), 10); + assert_eq!(format!("{:?}", read_chunks.chunks), format!("{:?}", chunks_clone.chunks)); + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs new file mode 100644 index 000000000..6dd6f9392 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -0,0 +1,171 @@ +//use chrono::Timelike; +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + EntryTypes, HashBroadcast, LinkTypes, PerspectiveDiff, PerspectiveDiffEntryReference, +}; + +use crate::errors::SocialContextResult; +use crate::link_adapter::revisions::{current_revision, update_current_revision}; +use crate::link_adapter::snapshots::generate_snapshot; +use crate::retriever::holochain::{get_active_agent_anchor, get_active_agents}; +use crate::retriever::PerspectiveDiffRetreiver; +use crate::telepresence::status::get_my_did; +use crate::utils::get_now; +use crate::{Hash, ENABLE_SIGNALS, SNAPSHOT_INTERVAL}; + +pub fn commit( + diff: PerspectiveDiff, +) -> SocialContextResult> { + debug!("===PerspectiveDiffSync.commit(): Function start"); + let now_fn_start = get_now()?.time(); + let current_revision = current_revision::()?; + + let mut entries_since_snapshot = 0; + if current_revision.is_some() { + let current = Retriever::get::( + current_revision.clone().unwrap().hash, + )?; + entries_since_snapshot = current.diffs_since_snapshot; + }; + debug!( + "===PerspectiveDiffSync.commit(): Entries since snapshot: {:#?}", + entries_since_snapshot + ); + //Add one since we are comitting an entry here + entries_since_snapshot += 1; + + let create_snapshot_here = if entries_since_snapshot >= *SNAPSHOT_INTERVAL { + entries_since_snapshot = 0; + true + } else { + false + }; + + let now = get_now()?.time(); + let diff_entry_create = Retriever::create_entry(EntryTypes::PerspectiveDiff(diff.clone()))?; + let diff_entry_ref_entry = PerspectiveDiffEntryReference { + diff: diff_entry_create.clone(), + parents: current_revision.map(|val| vec![val.hash]), + diffs_since_snapshot: entries_since_snapshot, + }; + let diff_entry_reference = Retriever::create_entry(EntryTypes::PerspectiveDiffEntryReference( + diff_entry_ref_entry.clone(), + ))?; + let after = get_now()?.time(); + // debug!( + // "===PerspectiveDiffSync.commit(): Created diff entry ref: {:#?}", + // diff_entry_reference + // ); + debug!( + "===PerspectiveDiffSync.commit() - Profiling: Took {} to create a PerspectiveDiff", + (after - now).num_milliseconds() + ); + + if create_snapshot_here { + //fetch all the diff's, we need a new function which will traverse graph and then return + diffs + next found snapshot + //create new snapshot linked from above diff_entry_reference + let snapshot = generate_snapshot(diff_entry_reference.clone())?; + + let now = get_now()?.time(); + Retriever::create_entry(EntryTypes::Snapshot(snapshot.clone()))?; + create_link( + hash_entry(diff_entry_ref_entry.clone())?, + hash_entry(snapshot)?, + LinkTypes::Snapshot, + LinkTag::new("snapshot"), + )?; + let after = get_now()?.time(); + debug!("===PerspectiveDiffSync.commit() - Profiling: Took {} to create snapshot entry and link", (after - now).num_milliseconds()); + }; + + let now = get_now()?; + let now_profile = get_now()?.time(); + //update_latest_revision::(diff_entry_reference.clone(), now.clone())?; + let after = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.commit() - Profiling: Took {} to update the latest revision", + (after - now_profile).num_milliseconds() + ); + update_current_revision::(diff_entry_reference.clone(), now)?; + + // if *ENABLE_SIGNALS { + // // let signal_data = PerspectiveDiffReference { + // // diff, + // // reference: diff_entry_ref_entry, + // // reference_hash: diff_entry_reference.clone(), + // // }; + // // send_revision_signal(signal_data)?; + // broadcast_current::()?; + // }; + + let after_fn_end = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.commit() - Profiling: Took {} to complete whole commit function", + (after_fn_end - now_fn_start).num_milliseconds() + ); + Ok(diff_entry_reference) +} + +pub fn add_active_agent_link() -> SocialContextResult<()> { + debug!("===PerspectiveDiffSync.add_active_agent_link(): Function start"); + let now_fn_start = get_now()?.time(); + let agent_root_entry = get_active_agent_anchor(); + let _agent_root_entry_action = + Retriever::create_entry(EntryTypes::Anchor(agent_root_entry.clone()))?; + + let agent = agent_info()?.agent_initial_pubkey; + create_link( + hash_entry(agent_root_entry)?, + agent, + LinkTypes::Index, + LinkTag::new("active_agent"), + )?; + let after_fn_end = get_now()?.time(); + debug!("===PerspectiveDiffSync.add_active_agent_link() - Profiling: Took {} to complete whole add_active_agent_link()", (after_fn_end - now_fn_start).num_milliseconds()); + Ok(()) +} + +pub fn broadcast_current() -> SocialContextResult> +{ + //debug!("Running broadcast_current"); + let current = current_revision::()?; + //debug!("Current revision: {:#?}", current); + + if current.is_some() { + let current_revision = current.clone().unwrap(); + let entry_ref = + Retriever::get::(current_revision.hash.clone())?; + let diff = Retriever::get::(entry_ref.diff.clone())?; + + let signal_data = HashBroadcast { + reference: entry_ref, + reference_hash: current_revision.hash.clone(), + diff, + broadcast_author: get_my_did()?.unwrap(), + }; + + let recent_agents = get_active_agents()?; + //debug!("Recent agents: {:#?}", recent_agents); + remote_signal(signal_data.get_sb()?, recent_agents.clone())?; + }; + Ok(current.map(|rev| rev.hash)) +} + +pub fn get_broadcast_payload() -> SocialContextResult> { + match current_revision::()? { + Some(current) => { + let current_revision = current; + let entry_ref = + Retriever::get::(current_revision.hash.clone())?; + let diff = Retriever::get::(entry_ref.diff.clone())?; + + Ok(Some(HashBroadcast { + reference: entry_ref, + reference_hash: current_revision.hash.clone(), + diff, + broadcast_author: get_my_did()?.unwrap(), + })) + }, + None => Ok(None) + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/mod.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/mod.rs new file mode 100644 index 000000000..385f55db2 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/mod.rs @@ -0,0 +1,10 @@ +pub(crate) mod chunked_diffs; +pub(crate) mod commit; +pub(crate) mod pull; +pub(crate) mod render; +pub(crate) mod revisions; +pub(crate) mod snapshots; +pub(crate) mod test_graphs; +pub(crate) mod tests; +pub(crate) mod topo_sort; +pub(crate) mod workspace; diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs new file mode 100644 index 000000000..9059b9b32 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs @@ -0,0 +1,846 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + EntryTypes, HashBroadcast, PerspectiveDiff, PerspectiveDiffEntryReference, PullResult, +}; + +use crate::errors::SocialContextResult; +use crate::link_adapter::revisions::{current_revision, update_current_revision}; +use crate::link_adapter::workspace::{Workspace, NULL_NODE}; +use crate::retriever::PerspectiveDiffRetreiver; +use crate::utils::get_now; +use crate::Hash; + +fn merge( + latest: Hash, + current: Hash, +) -> SocialContextResult { + debug!("===PerspectiveDiffSync.merge(): Function start"); + let fn_start = get_now()?.time(); + + let latest_diff = Retriever::get::(latest.clone())?; + let current_diff = Retriever::get::(current.clone())?; + //Create the merge diff + let merge_diff = PerspectiveDiff { + additions: vec![], + removals: vec![], + }; + let merge_entry_hash = + Retriever::create_entry(EntryTypes::PerspectiveDiff(merge_diff.clone()))?; + + //Create the merge entry reference + let merge_entry_reference = PerspectiveDiffEntryReference { + parents: Some(vec![latest, current]), + diff: merge_entry_hash.clone(), + diffs_since_snapshot: latest_diff.diffs_since_snapshot + + current_diff.diffs_since_snapshot + + 1, + }; + let merge_entry_reference_hash = Retriever::create_entry( + EntryTypes::PerspectiveDiffEntryReference(merge_entry_reference.clone()), + )?; + debug!( + "===PerspectiveDiffSync.merge(): Commited merge entry: {:#?}", + merge_entry_reference_hash + ); + + let now = get_now()?; + update_current_revision::(merge_entry_reference_hash.clone(), now)?; + + let fn_end = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.merge() - Profiling: Took: {} to complete merge() function", + (fn_end - fn_start).num_milliseconds() + ); + Ok(merge_entry_reference_hash) +} + +pub fn pull( + emit: bool, + theirs: Hash, + is_scribe: bool, +) -> SocialContextResult { + debug!("===PerspectiveDiffSync.pull(): Function start"); + let fn_start = get_now()?.time(); + + let current = current_revision::()?; + let current_hash = current.clone().map(|val| val.hash); + debug!( + "===PerspectiveDiffSync.pull(): Pull made with theirs: {:#?} and current: {:#?}", + theirs, current + ); + + let theirs_hash = theirs.clone(); + + if Some(theirs_hash) == current_hash { + return Ok(PullResult { + diff: PerspectiveDiff::default(), + current_revision: current_hash, + }); + } + + let mut workspace = Workspace::new(); + + if current.is_none() { + workspace.collect_only_from_latest::(theirs.clone())?; + let diff = workspace.squashed_diff::()?; + update_current_revision::(theirs, get_now()?)?; + emit_signal(diff.clone())?; + return Ok(PullResult { + diff: PerspectiveDiff::default(), + current_revision: None, + }); + } + + let current = current.expect("current missing handled above"); + + workspace.build_diffs::(theirs.clone(), current.hash.clone())?; + + // First check if we are actually ahead of them -> we don't have to do anything + // they will have to merge with / or fast-forward to our current + if workspace.all_ancestors(¤t.hash)?.contains(&theirs) { + return Ok(PullResult { + diff: PerspectiveDiff::default(), + current_revision: Some(current.hash), + }); + } + + let fast_forward_possible = workspace.all_ancestors(&theirs)?.contains(¤t.hash); + + // If we can't fast forward, we have to merge + // but if we are not a scribe, we can't merge + // so in that case, we can't do anything + if !fast_forward_possible && !is_scribe { + debug!("===PerspectiveDiffSync.pull(): Have to merge but I'm not a scribe. Exiting without change..."); + return Ok(PullResult { + diff: PerspectiveDiff::default(), + current_revision: Some(current.hash), + }); + } + + //Get all the diffs which exist between current and the last ancestor that we got + let seen_diffs = workspace.all_ancestors(¤t.hash)?; + // println!("SEEN DIFFS: {:#?}", seen_diffs); + + //Get all the diffs in the graph which we havent seen + let unseen_diffs = if seen_diffs.len() > 0 { + let diffs = workspace + .sorted_diffs + .clone() + .expect("should be unseen diffs after build_diffs() call") + .into_iter() + .filter(|val| { + if val.0 == NULL_NODE() { + return false; + }; + if val.0 == current.hash { + return false; + }; + if seen_diffs.contains(&val.0) { + return false; + }; + true + }) + .collect::>(); + diffs + } else { + workspace + .sorted_diffs + .expect("should be unseen diffs after build_diffs() call") + .into_iter() + .filter(|val| val.0 != NULL_NODE() && val.0 != current.hash) + .collect::>() + }; + + let (diffs, current_revision) = if fast_forward_possible { + debug!("===PerspectiveDiffSync.pull(): There are paths between current and latest, lets fast forward the changes we have missed!"); + let mut out = PerspectiveDiff { + additions: vec![], + removals: vec![], + }; + for diff in unseen_diffs { + let diff_entry = Retriever::get::(diff.1.diff.clone())?; + out.additions.append(&mut diff_entry.additions.clone()); + out.removals.append(&mut diff_entry.removals.clone()); + } + update_current_revision::(theirs.clone(), get_now()?)?; + let fn_end = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.pull() - Profiling: Took: {} to complete pull() function", + (fn_end - fn_start).num_milliseconds() + ); + (out, theirs) + } else if is_scribe { + debug!("===PerspectiveDiffSync.pull():There are no paths between current and latest, we must merge current and latest"); + //Get the entries we missed from unseen diff + let mut out = PerspectiveDiff { + additions: vec![], + removals: vec![], + }; + for diff in unseen_diffs { + let diff_entry = Retriever::get::(diff.1.diff.clone())?; + out.additions.append(&mut diff_entry.additions.clone()); + out.removals.append(&mut diff_entry.removals.clone()); + } + + let merge_hash = merge::(theirs, current.hash)?; + let fn_end = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.pull() - Profiling: Took: {} to complete pull() function", + (fn_end - fn_start).num_milliseconds() + ); + (out, merge_hash) + } else { + ( + PerspectiveDiff { + additions: vec![], + removals: vec![], + }, + current.hash, + ) + }; + + //Emit the signal in case the client connection has a timeout during the zome call + if emit { + if diffs.additions.len() > 0 || diffs.removals.len() > 0 { + emit_signal(diffs.clone())?; + } + } + Ok(PullResult { + diff: diffs, + current_revision: Some(current_revision), + }) +} + +pub fn handle_broadcast( + broadcast: HashBroadcast, +) -> SocialContextResult<()> { + // debug!("===PerspectiveDiffSync.fast_forward_signal(): Function start"); + // let fn_start = get_now()?.time(); + let diff_reference = broadcast.reference.clone(); + let revision = broadcast.reference_hash.clone(); + + let current_revision = current_revision::()?; + + if current_revision.is_some() { + let current_revision = current_revision.unwrap(); + if revision == current_revision.hash { + // debug!("===PerspectiveDiffSync.fast_forward_signal(): Revision is the same as current"); + }; + if diff_reference.parents == Some(vec![current_revision.hash]) { + // debug!("===PerspectiveDiffSync.fast_forward_signal(): Revisions parent is the same as current, we can fast forward our current"); + update_current_revision::(revision, get_now()?)?; + emit_signal(broadcast.diff.clone())?; + }; + }; + //emit_signal(broadcast)?; + // let fn_end = get_now()?.time(); + // debug!("===PerspectiveDiffSync.fast_forward_signal() - Profiling: Took: {} to complete fast_forward_signal() function", (fn_end - fn_start).num_milliseconds()); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::pull; + use crate::retriever::{ + create_node_id_link_expression, create_node_id_vec, node_id_hash, MockPerspectiveGraph, + PerspectiveDiffRetreiver, GLOBAL_MOCKED_GRAPH, + }; + use crate::utils::create_link_expression; + use dot_structures; + + #[test] + fn test_fast_forward_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + + 1 -> 0 + 2 -> 0 + 3 -> 1 + 3 -> 2 + + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let update_current = + MockPerspectiveGraph::update_current_revision(current_node_hash, chrono::Utc::now()); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash, true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let node_1 = &node_id_hash(&dot_structures::Id::Plain(String::from("1"))).to_string(); + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_1, node_1), + create_link_expression(node_3, node_3), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + } + + #[test] + fn test_complex_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + + 3 -> 2 + 4 -> 2 + 5 -> 3 + 5 -> 4 + 6 -> 5 + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let update_current = + MockPerspectiveGraph::update_current_revision(current_node_hash, chrono::Utc::now()); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let node_2 = &node_id_hash(&dot_structures::Id::Plain(String::from("2"))).to_string(); + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let node_4 = &node_id_hash(&dot_structures::Id::Plain(String::from("4"))).to_string(); + let node_5 = &node_id_hash(&dot_structures::Id::Plain(String::from("5"))).to_string(); + let node_6 = &node_id_hash(&dot_structures::Id::Plain(String::from("6"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_2, node_2), + create_link_expression(node_3, node_3), + create_link_expression(node_4, node_4), + create_link_expression(node_5, node_5), + create_link_expression(node_6, node_6), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //Test that a merge actually happened and current was updated + let new_current = MockPerspectiveGraph::current_revision(); + assert!(new_current.is_ok()); + let new_current = new_current.unwrap(); + + assert!(new_current.unwrap().hash != latest_node_hash); + } + + #[test] + fn test_complex_fast_forward() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + + 3 -> 2 + 4 -> 2 + 5 -> 3 + 5 -> 4 + 6 -> 5 + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let update_current = + MockPerspectiveGraph::update_current_revision(current_node_hash, chrono::Utc::now()); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash, true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let node_5 = &node_id_hash(&dot_structures::Id::Plain(String::from("5"))).to_string(); + let node_6 = &node_id_hash(&dot_structures::Id::Plain(String::from("6"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_3, node_3), + create_link_expression(node_5, node_5), + create_link_expression(node_6, node_6), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + } + + #[test] + fn test_fast_forward_after_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 7 [ label = "7" ] + + 3 -> 2 + 4 -> 2 + 5 -> 3 + 5 -> 4 + 6 -> 5 + 7 -> 1 + 7 -> 6 + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("7"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + let update_current = + MockPerspectiveGraph::update_current_revision(current_node_hash, chrono::Utc::now()); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash, true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let node_1 = &node_id_hash(&dot_structures::Id::Plain(String::from("1"))).to_string(); + let node_7 = &node_id_hash(&dot_structures::Id::Plain(String::from("7"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_1, node_1), + create_link_expression(node_7, node_7), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + } + + #[test] + fn test_pull_complex_merge_implicit_zero() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 4 -> 2 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 6 -> 5 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let latest_node_hash = node_1; + + let current_node_hash = node_6; + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let node_1 = &node_id_hash(&dot_structures::Id::Plain(String::from("1"))).to_string(); + let expected_additions = vec![create_link_expression(node_1, node_1)]; + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + assert!(pull_res + .unwrap() + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_pull_complex_merge_implicit_zero_reversed() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 4 -> 2 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 6 -> 5 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let latest_node_hash = node_6; + + let current_node_hash = node_1; + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let node_6 = &node_id_hash(&dot_structures::Id::Plain(String::from("6"))).to_string(); + let node_5 = &node_id_hash(&dot_structures::Id::Plain(String::from("5"))).to_string(); + let node_4 = &node_id_hash(&dot_structures::Id::Plain(String::from("4"))).to_string(); + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let node_2 = &node_id_hash(&dot_structures::Id::Plain(String::from("2"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_6, node_6), + create_link_expression(node_5, node_5), + create_link_expression(node_4, node_4), + create_link_expression(node_3, node_3), + create_link_expression(node_2, node_2), + ]; + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + assert!(pull_res + .unwrap() + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_three_null_parents() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + + 4 -> 2 + 4 -> 3 + 5 -> 4 + 5 -> 1 + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + println!("{:#?}", pull_res); + let pull_res = pull_res.unwrap(); + + let node_5 = &node_id_hash(&dot_structures::Id::Plain(String::from("5"))).to_string(); + let node_4 = &node_id_hash(&dot_structures::Id::Plain(String::from("4"))).to_string(); + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let node_1 = &node_id_hash(&dot_structures::Id::Plain(String::from("1"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_5, node_5), + create_link_expression(node_4, node_4), + create_link_expression(node_3, node_3), + create_link_expression(node_1, node_1), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that no merge was created + //let latest = MockPerspectiveGraph::latest_revision(); + //assert!(latest.unwrap().unwrap().hash == latest_node_hash); + } + + #[test] + fn test_four_null_parents() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + + 4 -> 2 + 4 -> 3 + 5 -> 4 + 5 -> 1 + }"#, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + println!("{:#?}", pull_res); + let pull_res = pull_res.unwrap(); + + let node_5 = &node_id_hash(&dot_structures::Id::Plain(String::from("5"))).to_string(); + let node_4 = &node_id_hash(&dot_structures::Id::Plain(String::from("4"))).to_string(); + let node_3 = &node_id_hash(&dot_structures::Id::Plain(String::from("3"))).to_string(); + let node_2 = &node_id_hash(&dot_structures::Id::Plain(String::from("2"))).to_string(); + let node_1 = &node_id_hash(&dot_structures::Id::Plain(String::from("1"))).to_string(); + let expected_additions = vec![ + create_link_expression(node_5, node_5), + create_link_expression(node_4, node_4), + create_link_expression(node_3, node_3), + create_link_expression(node_2, node_2), + create_link_expression(node_1, node_1), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_high_complex_graph() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + &crate::link_adapter::test_graphs::HIGH_COMPLEX_GRAPH, + ) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("52"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("55"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + //println!("{:#?}", pull_res); + let pull_res = pull_res.unwrap(); + + let mut expected_additions = create_node_id_vec(23, 52); + expected_additions.push(create_node_id_link_expression(20)); + expected_additions.push(create_node_id_link_expression(21)); + + for addition in expected_additions.clone() { + assert!(pull_res.diff.additions.contains(&addition)); + } + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_late_join() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot(&crate::link_adapter::test_graphs::LATE_JOIN) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("314"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("313"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + //println!("{:#?}", pull_res); + let pull_res = pull_res.unwrap(); + + let expected_additions = vec![create_node_id_link_expression(314)]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_late_join_from_syncd() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot(&crate::link_adapter::test_graphs::LATE_JOIN2) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("304"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("301"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let expected_additions = vec![ + create_node_id_link_expression(304), + create_node_id_link_expression(303), + create_node_id_link_expression(302), + ]; + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } + + #[test] + fn test_late_join_from_unsyncd() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot(&crate::link_adapter::test_graphs::LATE_JOIN2) + .unwrap(); + } + update(); + + let latest_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("301"))); + + let current_node_hash = node_id_hash(&dot_structures::Id::Plain(String::from("304"))); + let update_current = MockPerspectiveGraph::update_current_revision( + current_node_hash.clone(), + chrono::Utc::now(), + ); + assert!(update_current.is_ok()); + + let pull_res = pull::(false, latest_node_hash.clone(), true); + assert!(pull_res.is_ok()); + let pull_res = pull_res.unwrap(); + + let expected_additions = create_node_id_vec(1, 301); + + assert!(pull_res + .diff + .additions + .iter() + .all(|item| expected_additions.contains(item))); + + //ensure that merge was created and thus current revision got updated + let current = MockPerspectiveGraph::current_revision(); + assert!(current.unwrap().unwrap().hash != current_node_hash); + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/render.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/render.rs new file mode 100644 index 000000000..1b41a886d --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/render.rs @@ -0,0 +1,42 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::PerspectiveDiff; + +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::link_adapter::revisions::current_revision; +use crate::link_adapter::workspace::Workspace; +use crate::retriever::PerspectiveDiffRetreiver; +use crate::utils::get_now; +use crate::Perspective; + +pub fn render() -> SocialContextResult { + debug!("===PerspectiveDiffSync.render(): Function start"); + let fn_start = get_now()?.time(); + + let current = current_revision::()?.ok_or(SocialContextError::InternalError( + "Can't render when we have no current revision", + ))?; + + debug!("===PerspectiveDiffSync.render(): current: {:?}", current); + + let mut workspace = Workspace::new(); + workspace.collect_only_from_latest::(current.hash)?; + + let mut perspective = Perspective { links: vec![] }; + for diff_node in workspace.entry_map { + let diff_entry = Retriever::get::(diff_node.1.diff.clone())?; + + for addition in diff_entry.additions { + perspective.links.push(addition); + } + for removal in diff_entry.removals { + perspective.links.retain(|l| l != &removal); + } + } + + let fn_end = get_now()?.time(); + debug!( + "===PerspectiveDiffSync.render() - Profiling: Took: {} to complete render() function", + (fn_end - fn_start).num_milliseconds() + ); + Ok(perspective) +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/revisions.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/revisions.rs new file mode 100644 index 000000000..e0a7cd09f --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/revisions.rs @@ -0,0 +1,32 @@ +use chrono::{DateTime, Utc}; +use hdk::prelude::debug; +use perspective_diff_sync_integrity::LocalHashReference; + +use crate::errors::SocialContextResult; +use crate::retriever::PerspectiveDiffRetreiver; +use crate::utils::get_now; +use crate::Hash; + +pub fn update_current_revision( + hash: Hash, + timestamp: DateTime, +) -> SocialContextResult<()> { + debug!("===PerspectiveDiffSync.update_current_revision(): Function start"); + let now = get_now()?.time(); + let res = Retriever::update_current_revision(hash, timestamp); + let after = get_now()?.time(); + debug!("===PerspectiveDiffSync.update_current_revision() - Profiling: Took: {} to update current_revision", (after - now).num_milliseconds()); + res +} + +//Latest revision as seen from our local state +pub fn current_revision( +) -> SocialContextResult> { + //debug!("===PerspectiveDiffSync.current_revision(): Function start"); + //let now = get_now()?.time(); + let rev = Retriever::current_revision()?; + // debug!("===PerspectiveDiffSync.current_revision(): rev = {:?}", rev); + //let after = get_now()?.time(); + //debug!("===PerspectiveDiffSync.current_revision() - Profiling: Took: {} to get the current_revision", (after - now).num_milliseconds()); + Ok(rev) +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs new file mode 100644 index 000000000..e366c16a5 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/snapshots.rs @@ -0,0 +1,264 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + LinkExpression, LinkTypes, PerspectiveDiff, PerspectiveDiffEntryReference, Snapshot, +}; + +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::link_adapter::chunked_diffs::ChunkedDiffs; +use crate::retriever::HolochainRetreiver; +use crate::utils::get_now; +use crate::{Hash, CHUNK_SIZE}; + +struct SearchPosition { + hash: Hash, + is_unseen: bool, +} + +pub fn generate_snapshot( + latest: HoloHash, +) -> SocialContextResult { + debug!("===PerspectiveDiffSync.generate_snapshot(): Function start"); + let fn_start = get_now()?.time(); + let mut search_position = SearchPosition { + hash: latest.clone(), + is_unseen: false, + }; + let mut seen: HashSet = HashSet::new(); + let mut unseen_parents = vec![]; + + let mut all_additions = BTreeSet::new(); + let mut all_removals = BTreeSet::new(); + + loop { + let diff = get(search_position.hash.clone(), GetOptions::latest())? + .ok_or(SocialContextError::InternalError( + "generate_snapshot(): Could not find entry while populating search", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + if diff.diffs_since_snapshot == 0 && search_position.hash != latest { + let now = get_now()?.time(); + // let input = GetLinksInputBuilder::try_new( + // hash_entry(&diff)?, + // LinkTypes::Snapshot + // ) + // .unwrap() + // .tag_prefix(LinkTag::new("snapshot")) + // .build(); + let mut snapshot_links = get_links(hash_entry(&diff)?, LinkTypes::Snapshot, Some(LinkTag::new("snapshot")))?; + let after = get_now()?.time(); + debug!("===PerspectiveDiffSync.generate_snapshot() - Profiling: Took {} to get the snapshot links", (after - now).num_milliseconds()); + if snapshot_links.len() == 0 { + debug!("===PerspectiveDiffSync.generate_snapshot() - ERROR: Did not find snapshot link where we expected to!"); + let should_break = handle_parents( + diff, + &mut search_position, + &mut seen, + &mut unseen_parents, + &mut all_additions, + &mut all_removals, + )?; + if should_break { + break; + } + } else { + let now = get_now()?.time(); + //get snapshot and add elements to out + let snapshot = get( + snapshot_links + .remove(0) + .target + .into_entry_hash() + .expect("Could not get entry_hash"), + GetOptions::latest(), + )? + .ok_or(SocialContextError::InternalError( + "Could not find diff entry for given diff entry reference", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + let after = get_now()?.time(); + debug!("===PerspectiveDiffSync.generate_snapshot() - Profiling: Took {} to get the snapshot entry", (after - now).num_milliseconds()); + + let diff = ChunkedDiffs::from_entries::(snapshot.diff_chunks)? + .into_aggregated_diff(); + for addition in diff.additions.iter() { + all_additions.insert(addition.clone()); + } + for removal in diff.removals.iter() { + all_removals.insert(removal.clone()); + } + for hash in snapshot.included_diffs.iter() { + seen.insert(hash.clone()); + } + //Be careful with break here where there are still unseen parents + if unseen_parents.len() == 0 { + // debug!("No more unseen parents within snapshot block"); + break; + } else { + search_position = unseen_parents.remove(0); + } + }; + } else { + let should_break = handle_parents( + diff, + &mut search_position, + &mut seen, + &mut unseen_parents, + &mut all_additions, + &mut all_removals, + )?; + if should_break { + break; + } + } + } + + let mut chunked_diffs = ChunkedDiffs::new(*CHUNK_SIZE); + + chunked_diffs.add_additions(all_additions.into_iter().collect()); + chunked_diffs.add_removals(all_removals.into_iter().collect()); + + let snapshot = Snapshot { + diff_chunks: chunked_diffs.into_entries::()?, + included_diffs: seen.into_iter().collect(), + }; + + let fn_end = get_now()?.time(); + debug!("===PerspectiveDiffSync.generate_snapshot() - Profiling: Took: {} to complete generate_snapshot function", (fn_end - fn_start).num_milliseconds()); + Ok(snapshot) +} + +fn handle_parents( + diff: PerspectiveDiffEntryReference, + search_position: &mut SearchPosition, + seen: &mut HashSet, + unseen_parents: &mut Vec, + all_additions: &mut BTreeSet, + all_removals: &mut BTreeSet, +) -> SocialContextResult { + //Check if entry is already in graph + if !seen.contains(&search_position.hash) { + seen.insert(search_position.hash.clone()); + let diff_entry = get(diff.diff.clone(), GetOptions::latest())? + .ok_or(SocialContextError::InternalError( + "Could not find diff entry for given diff entry reference", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + + for addition in diff_entry.additions.iter() { + all_additions.insert(addition.clone()); + } + for removal in diff_entry.removals.iter() { + all_removals.insert(removal.clone()); + } + + if diff.parents.is_none() { + //No parents, we have reached the end of the chain + //Now move onto traversing unseen parents, or break if we dont have any other paths to search + if unseen_parents.len() == 0 { + // debug!("No more unseen items within parent block"); + Ok(true) + } else { + // debug!("Moving onto unseen fork items within parent block"); + *search_position = unseen_parents.remove(0); + Ok(false) + } + } else { + //Do the fork traversals + let mut parents = diff.parents.unwrap(); + //Check if all parents have already been seen, if so then break or move onto next unseen parents + //TODO; we should use a seen set here versus array iter + if parents.iter().all(|val| seen.contains(val)) { + if unseen_parents.len() == 0 { + // debug!("Parents of item seen and unseen 0"); + return Ok(true); + } else { + // debug!("last moving onto unseen"); + *search_position = unseen_parents.remove(0); + Ok(false) + } + } else { + *search_position = SearchPosition { + hash: parents.remove(0), + is_unseen: false, + }; + // debug!("Appending parents to look up"); + unseen_parents.append( + &mut parents + .into_iter() + .map(|val| SearchPosition { + hash: val, + is_unseen: true, + }) + .collect(), + ); + Ok(false) + } + } + } else if search_position.is_unseen { + //The parent for this branch is already seen so likely already explored and we are part of the main branch + if unseen_parents.len() == 0 { + // debug!("No more unseen items within parent block"); + Ok(true) + } else { + // debug!("Moving onto unseen fork items within parent block"); + *search_position = unseen_parents.remove(0); + Ok(false) + } + } else { + if diff.parents.is_none() { + //No parents, we have reached the end of the chain + //Now move onto traversing unseen parents, or break if we dont have any other paths to search + if unseen_parents.len() == 0 { + // debug!("No more unseen items within parent block"); + Ok(true) + } else { + // debug!("Moving onto unseen fork items within parent block"); + *search_position = unseen_parents.remove(0); + Ok(false) + } + } else { + //Do the fork traversals + let mut parents = diff.parents.unwrap(); + //Check if all parents have already been seen, if so then break or move onto next unseen parents + //TODO; we should use a seen set here versus array iter + if parents.iter().all(|val| seen.contains(val)) { + if unseen_parents.len() == 0 { + // debug!("Parents of item seen and unseen 0"); + Ok(true) + } else { + // debug!("last moving onto unseen"); + *search_position = unseen_parents.remove(0); + Ok(false) + } + } else { + *search_position = SearchPosition { + hash: parents.remove(0), + is_unseen: false, + }; + // debug!("Appending parents to look up"); + unseen_parents.append( + &mut parents + .into_iter() + .map(|val| SearchPosition { + hash: val, + is_unseen: true, + }) + .collect(), + ); + Ok(false) + } + } + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/test_graphs.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/test_graphs.rs new file mode 100644 index 000000000..fea27288c --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/test_graphs.rs @@ -0,0 +1,1495 @@ +lazy_static! { + pub static ref LATE_JOIN: String = String::from(r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 7 [ label = "7" ] + 8 [ label = "8" ] + 9 [ label = "9" ] + 10 [ label = "10" ] + 11 [ label = "11" ] + 12 [ label = "12" ] + 13 [ label = "13" ] + 14 [ label = "14" ] + 15 [ label = "15" ] + 16 [ label = "16" ] + 17 [ label = "17" ] + 18 [ label = "18" ] + 19 [ label = "19" ] + 20 [ label = "20" ] + 21 [ label = "21" ] + 22 [ label = "22" ] + 23 [ label = "23" ] + 24 [ label = "24" ] + 25 [ label = "25" ] + 26 [ label = "26" ] + 27 [ label = "27" ] + 28 [ label = "28" ] + 29 [ label = "29" ] + 30 [ label = "30" ] + 31 [ label = "31" ] + 32 [ label = "32" ] + 33 [ label = "33" ] + 34 [ label = "34" ] + 35 [ label = "35" ] + 36 [ label = "36" ] + 37 [ label = "37" ] + 38 [ label = "38" ] + 39 [ label = "39" ] + 40 [ label = "40" ] + 41 [ label = "41" ] + 42 [ label = "42" ] + 43 [ label = "43" ] + 44 [ label = "44" ] + 45 [ label = "45" ] + 46 [ label = "46" ] + 47 [ label = "47" ] + 48 [ label = "48" ] + 49 [ label = "49" ] + 50 [ label = "50" ] + 51 [ label = "51" ] + 52 [ label = "52" ] + 53 [ label = "53" ] + 54 [ label = "54" ] + 55 [ label = "55" ] + 56 [ label = "56" ] + 57 [ label = "57" ] + 58 [ label = "58" ] + 59 [ label = "59" ] + 60 [ label = "60" ] + 61 [ label = "61" ] + 62 [ label = "62" ] + 63 [ label = "63" ] + 64 [ label = "64" ] + 65 [ label = "65" ] + 66 [ label = "66" ] + 67 [ label = "67" ] + 68 [ label = "68" ] + 69 [ label = "69" ] + 70 [ label = "70" ] + 71 [ label = "71" ] + 72 [ label = "72" ] + 73 [ label = "73" ] + 74 [ label = "74" ] + 75 [ label = "75" ] + 76 [ label = "76" ] + 77 [ label = "77" ] + 78 [ label = "78" ] + 79 [ label = "79" ] + 80 [ label = "80" ] + 81 [ label = "81" ] + 82 [ label = "82" ] + 83 [ label = "83" ] + 84 [ label = "84" ] + 85 [ label = "85" ] + 86 [ label = "86" ] + 87 [ label = "87" ] + 88 [ label = "88" ] + 89 [ label = "89" ] + 90 [ label = "90" ] + 91 [ label = "91" ] + 92 [ label = "92" ] + 93 [ label = "93" ] + 94 [ label = "94" ] + 95 [ label = "95" ] + 96 [ label = "96" ] + 97 [ label = "97" ] + 98 [ label = "98" ] + 99 [ label = "99" ] + 100 [ label = "100" ] + 101 [ label = "101" ] + 102 [ label = "102" ] + 103 [ label = "103" ] + 104 [ label = "104" ] + 105 [ label = "105" ] + 106 [ label = "106" ] + 107 [ label = "107" ] + 108 [ label = "108" ] + 109 [ label = "109" ] + 110 [ label = "110" ] + 111 [ label = "111" ] + 112 [ label = "112" ] + 113 [ label = "113" ] + 114 [ label = "114" ] + 115 [ label = "115" ] + 116 [ label = "116" ] + 117 [ label = "117" ] + 118 [ label = "118" ] + 119 [ label = "119" ] + 120 [ label = "120" ] + 121 [ label = "121" ] + 122 [ label = "122" ] + 123 [ label = "123" ] + 124 [ label = "124" ] + 125 [ label = "125" ] + 126 [ label = "126" ] + 127 [ label = "127" ] + 128 [ label = "128" ] + 129 [ label = "129" ] + 130 [ label = "130" ] + 131 [ label = "131" ] + 132 [ label = "132" ] + 133 [ label = "133" ] + 134 [ label = "134" ] + 135 [ label = "135" ] + 136 [ label = "136" ] + 137 [ label = "137" ] + 138 [ label = "138" ] + 139 [ label = "139" ] + 140 [ label = "140" ] + 141 [ label = "141" ] + 142 [ label = "142" ] + 143 [ label = "143" ] + 144 [ label = "144" ] + 145 [ label = "145" ] + 146 [ label = "146" ] + 147 [ label = "147" ] + 148 [ label = "148" ] + 149 [ label = "149" ] + 150 [ label = "150" ] + 151 [ label = "151" ] + 152 [ label = "152" ] + 153 [ label = "153" ] + 154 [ label = "154" ] + 155 [ label = "155" ] + 156 [ label = "156" ] + 157 [ label = "157" ] + 158 [ label = "158" ] + 159 [ label = "159" ] + 160 [ label = "160" ] + 161 [ label = "161" ] + 162 [ label = "162" ] + 163 [ label = "163" ] + 164 [ label = "164" ] + 165 [ label = "165" ] + 166 [ label = "166" ] + 167 [ label = "167" ] + 168 [ label = "168" ] + 169 [ label = "169" ] + 170 [ label = "170" ] + 171 [ label = "171" ] + 172 [ label = "172" ] + 173 [ label = "173" ] + 174 [ label = "174" ] + 175 [ label = "175" ] + 176 [ label = "176" ] + 177 [ label = "177" ] + 178 [ label = "178" ] + 179 [ label = "179" ] + 180 [ label = "180" ] + 181 [ label = "181" ] + 182 [ label = "182" ] + 183 [ label = "183" ] + 184 [ label = "184" ] + 185 [ label = "185" ] + 186 [ label = "186" ] + 187 [ label = "187" ] + 188 [ label = "188" ] + 189 [ label = "189" ] + 190 [ label = "190" ] + 191 [ label = "191" ] + 192 [ label = "192" ] + 193 [ label = "193" ] + 194 [ label = "194" ] + 195 [ label = "195" ] + 196 [ label = "196" ] + 197 [ label = "197" ] + 198 [ label = "198" ] + 199 [ label = "199" ] + 200 [ label = "200" ] + 201 [ label = "201" ] + 202 [ label = "202" ] + 203 [ label = "203" ] + 204 [ label = "204" ] + 205 [ label = "205" ] + 206 [ label = "206" ] + 207 [ label = "207" ] + 208 [ label = "208" ] + 209 [ label = "209" ] + 210 [ label = "210" ] + 211 [ label = "211" ] + 212 [ label = "212" ] + 213 [ label = "213" ] + 214 [ label = "214" ] + 215 [ label = "215" ] + 216 [ label = "216" ] + 217 [ label = "217" ] + 218 [ label = "218" ] + 219 [ label = "219" ] + 220 [ label = "220" ] + 221 [ label = "221" ] + 222 [ label = "222" ] + 223 [ label = "223" ] + 224 [ label = "224" ] + 225 [ label = "225" ] + 226 [ label = "226" ] + 227 [ label = "227" ] + 228 [ label = "228" ] + 229 [ label = "229" ] + 230 [ label = "230" ] + 231 [ label = "231" ] + 232 [ label = "232" ] + 233 [ label = "233" ] + 234 [ label = "234" ] + 235 [ label = "235" ] + 236 [ label = "236" ] + 237 [ label = "237" ] + 238 [ label = "238" ] + 239 [ label = "239" ] + 240 [ label = "240" ] + 241 [ label = "241" ] + 242 [ label = "242" ] + 243 [ label = "243" ] + 244 [ label = "244" ] + 245 [ label = "245" ] + 246 [ label = "246" ] + 247 [ label = "247" ] + 248 [ label = "248" ] + 249 [ label = "249" ] + 250 [ label = "250" ] + 251 [ label = "251" ] + 252 [ label = "252" ] + 253 [ label = "253" ] + 254 [ label = "254" ] + 255 [ label = "255" ] + 256 [ label = "256" ] + 257 [ label = "257" ] + 258 [ label = "258" ] + 259 [ label = "259" ] + 260 [ label = "260" ] + 261 [ label = "261" ] + 262 [ label = "262" ] + 263 [ label = "263" ] + 264 [ label = "264" ] + 265 [ label = "265" ] + 266 [ label = "266" ] + 267 [ label = "267" ] + 268 [ label = "268" ] + 269 [ label = "269" ] + 270 [ label = "270" ] + 271 [ label = "271" ] + 272 [ label = "272" ] + 273 [ label = "273" ] + 274 [ label = "274" ] + 275 [ label = "275" ] + 276 [ label = "276" ] + 277 [ label = "277" ] + 278 [ label = "278" ] + 279 [ label = "279" ] + 280 [ label = "280" ] + 281 [ label = "281" ] + 282 [ label = "282" ] + 283 [ label = "283" ] + 284 [ label = "284" ] + 285 [ label = "285" ] + 286 [ label = "286" ] + 287 [ label = "287" ] + 288 [ label = "288" ] + 289 [ label = "289" ] + 290 [ label = "290" ] + 291 [ label = "291" ] + 292 [ label = "292" ] + 293 [ label = "293" ] + 294 [ label = "294" ] + 295 [ label = "295" ] + 296 [ label = "296" ] + 297 [ label = "297" ] + 298 [ label = "298" ] + 299 [ label = "299" ] + 300 [ label = "300" ] + 301 [ label = "301" ] + 302 [ label = "302" ] + 303 [ label = "303" ] + 304 [ label = "304" ] + 305 [ label = "305" ] + 306 [ label = "306" ] + 307 [ label = "307" ] + 308 [ label = "308" ] + 309 [ label = "309" ] + 310 [ label = "310" ] + 311 [ label = "311" ] + 312 [ label = "312" ] + 313 [ label = "313" ] + 314 [ label = "314" ] + 3 -> 2 [ label = "()" ] + 4 -> 3 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 6 -> 5 [ label = "()" ] + 7 -> 6 [ label = "()" ] + 8 -> 7 [ label = "()" ] + 9 -> 8 [ label = "()" ] + 11 -> 10 [ label = "()" ] + 11 -> 9 [ label = "()" ] + 12 -> 10 [ label = "()" ] + 13 -> 12 [ label = "()" ] + 14 -> 13 [ label = "()" ] + 14 -> 11 [ label = "()" ] + 15 -> 14 [ label = "()" ] + 16 -> 15 [ label = "()" ] + 17 -> 16 [ label = "()" ] + 18 -> 17 [ label = "()" ] + 19 -> 18 [ label = "()" ] + 20 -> 19 [ label = "()" ] + 21 -> 16 [ label = "()" ] + 22 -> 21 [ label = "()" ] + 23 -> 20 [ label = "()" ] + 23 -> 22 [ label = "()" ] + 24 -> 23 [ label = "()" ] + 25 -> 24 [ label = "()" ] + 26 -> 25 [ label = "()" ] + 27 -> 26 [ label = "()" ] + 28 -> 25 [ label = "()" ] + 29 -> 28 [ label = "()" ] + 30 -> 29 [ label = "()" ] + 30 -> 27 [ label = "()" ] + 32 -> 31 [ label = "()" ] + 32 -> 30 [ label = "()" ] + 33 -> 32 [ label = "()" ] + 34 -> 32 [ label = "()" ] + 35 -> 34 [ label = "()" ] + 35 -> 33 [ label = "()" ] + 36 -> 35 [ label = "()" ] + 37 -> 36 [ label = "()" ] + 38 -> 37 [ label = "()" ] + 39 -> 38 [ label = "()" ] + 40 -> 35 [ label = "()" ] + 41 -> 40 [ label = "()" ] + 42 -> 39 [ label = "()" ] + 42 -> 41 [ label = "()" ] + 43 -> 42 [ label = "()" ] + 44 -> 43 [ label = "()" ] + 45 -> 44 [ label = "()" ] + 46 -> 45 [ label = "()" ] + 47 -> 46 [ label = "()" ] + 48 -> 47 [ label = "()" ] + 49 -> 48 [ label = "()" ] + 50 -> 49 [ label = "()" ] + 51 -> 50 [ label = "()" ] + 52 -> 51 [ label = "()" ] + 53 -> 52 [ label = "()" ] + 54 -> 53 [ label = "()" ] + 55 -> 54 [ label = "()" ] + 56 -> 55 [ label = "()" ] + 57 -> 56 [ label = "()" ] + 58 -> 57 [ label = "()" ] + 59 -> 58 [ label = "()" ] + 60 -> 59 [ label = "()" ] + 61 -> 60 [ label = "()" ] + 62 -> 61 [ label = "()" ] + 63 -> 62 [ label = "()" ] + 64 -> 63 [ label = "()" ] + 65 -> 64 [ label = "()" ] + 66 -> 65 [ label = "()" ] + 67 -> 66 [ label = "()" ] + 68 -> 67 [ label = "()" ] + 69 -> 68 [ label = "()" ] + 70 -> 69 [ label = "()" ] + 71 -> 70 [ label = "()" ] + 72 -> 71 [ label = "()" ] + 73 -> 72 [ label = "()" ] + 74 -> 73 [ label = "()" ] + 75 -> 74 [ label = "()" ] + 76 -> 75 [ label = "()" ] + 77 -> 76 [ label = "()" ] + 78 -> 77 [ label = "()" ] + 79 -> 78 [ label = "()" ] + 80 -> 79 [ label = "()" ] + 81 -> 80 [ label = "()" ] + 82 -> 81 [ label = "()" ] + 83 -> 82 [ label = "()" ] + 84 -> 83 [ label = "()" ] + 85 -> 84 [ label = "()" ] + 86 -> 85 [ label = "()" ] + 87 -> 86 [ label = "()" ] + 88 -> 87 [ label = "()" ] + 89 -> 88 [ label = "()" ] + 90 -> 89 [ label = "()" ] + 91 -> 90 [ label = "()" ] + 92 -> 91 [ label = "()" ] + 93 -> 92 [ label = "()" ] + 94 -> 93 [ label = "()" ] + 95 -> 94 [ label = "()" ] + 96 -> 95 [ label = "()" ] + 97 -> 96 [ label = "()" ] + 98 -> 97 [ label = "()" ] + 99 -> 98 [ label = "()" ] + 100 -> 99 [ label = "()" ] + 101 -> 100 [ label = "()" ] + 102 -> 101 [ label = "()" ] + 103 -> 102 [ label = "()" ] + 104 -> 103 [ label = "()" ] + 105 -> 104 [ label = "()" ] + 106 -> 105 [ label = "()" ] + 107 -> 106 [ label = "()" ] + 108 -> 107 [ label = "()" ] + 109 -> 108 [ label = "()" ] + 110 -> 81 [ label = "()" ] + 111 -> 110 [ label = "()" ] + 112 -> 111 [ label = "()" ] + 113 -> 100 [ label = "()" ] + 113 -> 112 [ label = "()" ] + 114 -> 109 [ label = "()" ] + 114 -> 113 [ label = "()" ] + 115 -> 1 [ label = "()" ] + 115 -> 114 [ label = "()" ] + 116 -> 1 [ label = "()" ] + 116 -> 114 [ label = "()" ] + 117 -> 115 [ label = "()" ] + 117 -> 116 [ label = "()" ] + 118 -> 117 [ label = "()" ] + 119 -> 118 [ label = "()" ] + 120 -> 119 [ label = "()" ] + 121 -> 120 [ label = "()" ] + 122 -> 121 [ label = "()" ] + 123 -> 122 [ label = "()" ] + 124 -> 123 [ label = "()" ] + 125 -> 124 [ label = "()" ] + 126 -> 125 [ label = "()" ] + 127 -> 126 [ label = "()" ] + 128 -> 127 [ label = "()" ] + 129 -> 128 [ label = "()" ] + 130 -> 129 [ label = "()" ] + 131 -> 130 [ label = "()" ] + 132 -> 131 [ label = "()" ] + 133 -> 132 [ label = "()" ] + 134 -> 133 [ label = "()" ] + 135 -> 134 [ label = "()" ] + 136 -> 135 [ label = "()" ] + 137 -> 136 [ label = "()" ] + 138 -> 115 [ label = "()" ] + 138 -> 116 [ label = "()" ] + 139 -> 138 [ label = "()" ] + 140 -> 127 [ label = "()" ] + 140 -> 139 [ label = "()" ] + 141 -> 139 [ label = "()" ] + 142 -> 137 [ label = "()" ] + 142 -> 141 [ label = "()" ] + 143 -> 142 [ label = "()" ] + 143 -> 140 [ label = "()" ] + 144 -> 143 [ label = "()" ] + 145 -> 144 [ label = "()" ] + 146 -> 145 [ label = "()" ] + 147 -> 146 [ label = "()" ] + 148 -> 147 [ label = "()" ] + 149 -> 148 [ label = "()" ] + 150 -> 149 [ label = "()" ] + 151 -> 150 [ label = "()" ] + 152 -> 151 [ label = "()" ] + 153 -> 152 [ label = "()" ] + 154 -> 153 [ label = "()" ] + 155 -> 154 [ label = "()" ] + 156 -> 155 [ label = "()" ] + 157 -> 156 [ label = "()" ] + 158 -> 157 [ label = "()" ] + 159 -> 158 [ label = "()" ] + 160 -> 159 [ label = "()" ] + 161 -> 160 [ label = "()" ] + 162 -> 161 [ label = "()" ] + 163 -> 162 [ label = "()" ] + 164 -> 163 [ label = "()" ] + 165 -> 164 [ label = "()" ] + 166 -> 165 [ label = "()" ] + 167 -> 166 [ label = "()" ] + 168 -> 167 [ label = "()" ] + 169 -> 168 [ label = "()" ] + 170 -> 169 [ label = "()" ] + 171 -> 170 [ label = "()" ] + 172 -> 171 [ label = "()" ] + 173 -> 172 [ label = "()" ] + 174 -> 173 [ label = "()" ] + 175 -> 174 [ label = "()" ] + 176 -> 175 [ label = "()" ] + 177 -> 176 [ label = "()" ] + 178 -> 177 [ label = "()" ] + 179 -> 178 [ label = "()" ] + 180 -> 179 [ label = "()" ] + 181 -> 180 [ label = "()" ] + 182 -> 181 [ label = "()" ] + 183 -> 182 [ label = "()" ] + 184 -> 183 [ label = "()" ] + 185 -> 184 [ label = "()" ] + 186 -> 185 [ label = "()" ] + 187 -> 186 [ label = "()" ] + 188 -> 187 [ label = "()" ] + 189 -> 188 [ label = "()" ] + 190 -> 189 [ label = "()" ] + 191 -> 190 [ label = "()" ] + 192 -> 191 [ label = "()" ] + 193 -> 192 [ label = "()" ] + 194 -> 193 [ label = "()" ] + 195 -> 192 [ label = "()" ] + 196 -> 195 [ label = "()" ] + 197 -> 192 [ label = "()" ] + 198 -> 197 [ label = "()" ] + 199 -> 198 [ label = "()" ] + 199 -> 196 [ label = "()" ] + 200 -> 199 [ label = "()" ] + 200 -> 194 [ label = "()" ] + 201 -> 200 [ label = "()" ] + 202 -> 201 [ label = "()" ] + 203 -> 202 [ label = "()" ] + 204 -> 203 [ label = "()" ] + 205 -> 204 [ label = "()" ] + 206 -> 205 [ label = "()" ] + 207 -> 206 [ label = "()" ] + 208 -> 207 [ label = "()" ] + 209 -> 208 [ label = "()" ] + 210 -> 209 [ label = "()" ] + 211 -> 210 [ label = "()" ] + 212 -> 211 [ label = "()" ] + 213 -> 212 [ label = "()" ] + 214 -> 213 [ label = "()" ] + 215 -> 214 [ label = "()" ] + 216 -> 215 [ label = "()" ] + 217 -> 216 [ label = "()" ] + 218 -> 217 [ label = "()" ] + 219 -> 218 [ label = "()" ] + 220 -> 219 [ label = "()" ] + 221 -> 220 [ label = "()" ] + 222 -> 221 [ label = "()" ] + 223 -> 222 [ label = "()" ] + 224 -> 223 [ label = "()" ] + 225 -> 224 [ label = "()" ] + 226 -> 225 [ label = "()" ] + 227 -> 226 [ label = "()" ] + 228 -> 227 [ label = "()" ] + 229 -> 228 [ label = "()" ] + 230 -> 229 [ label = "()" ] + 231 -> 230 [ label = "()" ] + 232 -> 231 [ label = "()" ] + 233 -> 232 [ label = "()" ] + 234 -> 233 [ label = "()" ] + 235 -> 231 [ label = "()" ] + 236 -> 235 [ label = "()" ] + 237 -> 236 [ label = "()" ] + 238 -> 237 [ label = "()" ] + 239 -> 236 [ label = "()" ] + 240 -> 239 [ label = "()" ] + 240 -> 238 [ label = "()" ] + 241 -> 236 [ label = "()" ] + 242 -> 238 [ label = "()" ] + 242 -> 241 [ label = "()" ] + 243 -> 239 [ label = "()" ] + 243 -> 242 [ label = "()" ] + 244 -> 243 [ label = "()" ] + 245 -> 234 [ label = "()" ] + 245 -> 244 [ label = "()" ] + 246 -> 245 [ label = "()" ] + 247 -> 245 [ label = "()" ] + 247 -> 240 [ label = "()" ] + 248 -> 246 [ label = "()" ] + 248 -> 247 [ label = "()" ] + 249 -> 248 [ label = "()" ] + 250 -> 249 [ label = "()" ] + 251 -> 248 [ label = "()" ] + 252 -> 250 [ label = "()" ] + 252 -> 251 [ label = "()" ] + 253 -> 250 [ label = "()" ] + 253 -> 251 [ label = "()" ] + 254 -> 253 [ label = "()" ] + 254 -> 252 [ label = "()" ] + 255 -> 254 [ label = "()" ] + 256 -> 255 [ label = "()" ] + 257 -> 256 [ label = "()" ] + 258 -> 255 [ label = "()" ] + 259 -> 258 [ label = "()" ] + 259 -> 256 [ label = "()" ] + 260 -> 258 [ label = "()" ] + 261 -> 260 [ label = "()" ] + 262 -> 260 [ label = "()" ] + 262 -> 259 [ label = "()" ] + 263 -> 261 [ label = "()" ] + 263 -> 262 [ label = "()" ] + 264 -> 263 [ label = "()" ] + 264 -> 257 [ label = "()" ] + 265 -> 264 [ label = "()" ] + 266 -> 265 [ label = "()" ] + 267 -> 266 [ label = "()" ] + 268 -> 265 [ label = "()" ] + 269 -> 268 [ label = "()" ] + 269 -> 267 [ label = "()" ] + 270 -> 269 [ label = "()" ] + 271 -> 270 [ label = "()" ] + 272 -> 271 [ label = "()" ] + 273 -> 272 [ label = "()" ] + 274 -> 273 [ label = "()" ] + 275 -> 274 [ label = "()" ] + 276 -> 275 [ label = "()" ] + 277 -> 276 [ label = "()" ] + 278 -> 277 [ label = "()" ] + 279 -> 278 [ label = "()" ] + 280 -> 279 [ label = "()" ] + 281 -> 280 [ label = "()" ] + 282 -> 281 [ label = "()" ] + 283 -> 282 [ label = "()" ] + 284 -> 283 [ label = "()" ] + 285 -> 284 [ label = "()" ] + 286 -> 285 [ label = "()" ] + 287 -> 285 [ label = "()" ] + 288 -> 286 [ label = "()" ] + 288 -> 287 [ label = "()" ] + 289 -> 288 [ label = "()" ] + 290 -> 289 [ label = "()" ] + 291 -> 290 [ label = "()" ] + 292 -> 291 [ label = "()" ] + 293 -> 292 [ label = "()" ] + 294 -> 293 [ label = "()" ] + 295 -> 294 [ label = "()" ] + 296 -> 295 [ label = "()" ] + 297 -> 296 [ label = "()" ] + 298 -> 297 [ label = "()" ] + 299 -> 298 [ label = "()" ] + 300 -> 299 [ label = "()" ] + 301 -> 300 [ label = "()" ] + 302 -> 301 [ label = "()" ] + 303 -> 300 [ label = "()" ] + 304 -> 301 [ label = "()" ] + 304 -> 303 [ label = "()" ] + 305 -> 304 [ label = "()" ] + 305 -> 302 [ label = "()" ] + 306 -> 305 [ label = "()" ] + 307 -> 306 [ label = "()" ] + 308 -> 307 [ label = "()" ] + 309 -> 308 [ label = "()" ] + 310 -> 309 [ label = "()" ] + 311 -> 310 [ label = "()" ] + 312 -> 311 [ label = "()" ] + 313 -> 312 [ label = "()" ] + }"#); + pub static ref LATE_JOIN2: String = String::from(r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 7 [ label = "7" ] + 8 [ label = "8" ] + 9 [ label = "9" ] + 10 [ label = "10" ] + 11 [ label = "11" ] + 12 [ label = "12" ] + 13 [ label = "13" ] + 14 [ label = "14" ] + 15 [ label = "15" ] + 16 [ label = "16" ] + 17 [ label = "17" ] + 18 [ label = "18" ] + 19 [ label = "19" ] + 20 [ label = "20" ] + 21 [ label = "21" ] + 22 [ label = "22" ] + 23 [ label = "23" ] + 24 [ label = "24" ] + 25 [ label = "25" ] + 26 [ label = "26" ] + 27 [ label = "27" ] + 28 [ label = "28" ] + 29 [ label = "29" ] + 30 [ label = "30" ] + 31 [ label = "31" ] + 32 [ label = "32" ] + 33 [ label = "33" ] + 34 [ label = "34" ] + 35 [ label = "35" ] + 36 [ label = "36" ] + 37 [ label = "37" ] + 38 [ label = "38" ] + 39 [ label = "39" ] + 40 [ label = "40" ] + 41 [ label = "41" ] + 42 [ label = "42" ] + 43 [ label = "43" ] + 44 [ label = "44" ] + 45 [ label = "45" ] + 46 [ label = "46" ] + 47 [ label = "47" ] + 48 [ label = "48" ] + 49 [ label = "49" ] + 50 [ label = "50" ] + 51 [ label = "51" ] + 52 [ label = "52" ] + 53 [ label = "53" ] + 54 [ label = "54" ] + 55 [ label = "55" ] + 56 [ label = "56" ] + 57 [ label = "57" ] + 58 [ label = "58" ] + 59 [ label = "59" ] + 60 [ label = "60" ] + 61 [ label = "61" ] + 62 [ label = "62" ] + 63 [ label = "63" ] + 64 [ label = "64" ] + 65 [ label = "65" ] + 66 [ label = "66" ] + 67 [ label = "67" ] + 68 [ label = "68" ] + 69 [ label = "69" ] + 70 [ label = "70" ] + 71 [ label = "71" ] + 72 [ label = "72" ] + 73 [ label = "73" ] + 74 [ label = "74" ] + 75 [ label = "75" ] + 76 [ label = "76" ] + 77 [ label = "77" ] + 78 [ label = "78" ] + 79 [ label = "79" ] + 80 [ label = "80" ] + 81 [ label = "81" ] + 82 [ label = "82" ] + 83 [ label = "83" ] + 84 [ label = "84" ] + 85 [ label = "85" ] + 86 [ label = "86" ] + 87 [ label = "87" ] + 88 [ label = "88" ] + 89 [ label = "89" ] + 90 [ label = "90" ] + 91 [ label = "91" ] + 92 [ label = "92" ] + 93 [ label = "93" ] + 94 [ label = "94" ] + 95 [ label = "95" ] + 96 [ label = "96" ] + 97 [ label = "97" ] + 98 [ label = "98" ] + 99 [ label = "99" ] + 100 [ label = "100" ] + 101 [ label = "101" ] + 102 [ label = "102" ] + 103 [ label = "103" ] + 104 [ label = "104" ] + 105 [ label = "105" ] + 106 [ label = "106" ] + 107 [ label = "107" ] + 108 [ label = "108" ] + 109 [ label = "109" ] + 110 [ label = "110" ] + 111 [ label = "111" ] + 112 [ label = "112" ] + 113 [ label = "113" ] + 114 [ label = "114" ] + 115 [ label = "115" ] + 116 [ label = "116" ] + 117 [ label = "117" ] + 118 [ label = "118" ] + 119 [ label = "119" ] + 120 [ label = "120" ] + 121 [ label = "121" ] + 122 [ label = "122" ] + 123 [ label = "123" ] + 124 [ label = "124" ] + 125 [ label = "125" ] + 126 [ label = "126" ] + 127 [ label = "127" ] + 128 [ label = "128" ] + 129 [ label = "129" ] + 130 [ label = "130" ] + 131 [ label = "131" ] + 132 [ label = "132" ] + 133 [ label = "133" ] + 134 [ label = "134" ] + 135 [ label = "135" ] + 136 [ label = "136" ] + 137 [ label = "137" ] + 138 [ label = "138" ] + 139 [ label = "139" ] + 140 [ label = "140" ] + 141 [ label = "141" ] + 142 [ label = "142" ] + 143 [ label = "143" ] + 144 [ label = "144" ] + 145 [ label = "145" ] + 146 [ label = "146" ] + 147 [ label = "147" ] + 148 [ label = "148" ] + 149 [ label = "149" ] + 150 [ label = "150" ] + 151 [ label = "151" ] + 152 [ label = "152" ] + 153 [ label = "153" ] + 154 [ label = "154" ] + 155 [ label = "155" ] + 156 [ label = "156" ] + 157 [ label = "157" ] + 158 [ label = "158" ] + 159 [ label = "159" ] + 160 [ label = "160" ] + 161 [ label = "161" ] + 162 [ label = "162" ] + 163 [ label = "163" ] + 164 [ label = "164" ] + 165 [ label = "165" ] + 166 [ label = "166" ] + 167 [ label = "167" ] + 168 [ label = "168" ] + 169 [ label = "169" ] + 170 [ label = "170" ] + 171 [ label = "171" ] + 172 [ label = "172" ] + 173 [ label = "173" ] + 174 [ label = "174" ] + 175 [ label = "175" ] + 176 [ label = "176" ] + 177 [ label = "177" ] + 178 [ label = "178" ] + 179 [ label = "179" ] + 180 [ label = "180" ] + 181 [ label = "181" ] + 182 [ label = "182" ] + 183 [ label = "183" ] + 184 [ label = "184" ] + 185 [ label = "185" ] + 186 [ label = "186" ] + 187 [ label = "187" ] + 188 [ label = "188" ] + 189 [ label = "189" ] + 190 [ label = "190" ] + 191 [ label = "191" ] + 192 [ label = "192" ] + 193 [ label = "193" ] + 194 [ label = "194" ] + 195 [ label = "195" ] + 196 [ label = "196" ] + 197 [ label = "197" ] + 198 [ label = "198" ] + 199 [ label = "199" ] + 200 [ label = "200" ] + 201 [ label = "201" ] + 202 [ label = "202" ] + 203 [ label = "203" ] + 204 [ label = "204" ] + 205 [ label = "205" ] + 206 [ label = "206" ] + 207 [ label = "207" ] + 208 [ label = "208" ] + 209 [ label = "209" ] + 210 [ label = "210" ] + 211 [ label = "211" ] + 212 [ label = "212" ] + 213 [ label = "213" ] + 214 [ label = "214" ] + 215 [ label = "215" ] + 216 [ label = "216" ] + 217 [ label = "217" ] + 218 [ label = "218" ] + 219 [ label = "219" ] + 220 [ label = "220" ] + 221 [ label = "221" ] + 222 [ label = "222" ] + 223 [ label = "223" ] + 224 [ label = "224" ] + 225 [ label = "225" ] + 226 [ label = "226" ] + 227 [ label = "227" ] + 228 [ label = "228" ] + 229 [ label = "229" ] + 230 [ label = "230" ] + 231 [ label = "231" ] + 232 [ label = "232" ] + 233 [ label = "233" ] + 234 [ label = "234" ] + 235 [ label = "235" ] + 236 [ label = "236" ] + 237 [ label = "237" ] + 238 [ label = "238" ] + 239 [ label = "239" ] + 240 [ label = "240" ] + 241 [ label = "241" ] + 242 [ label = "242" ] + 243 [ label = "243" ] + 244 [ label = "244" ] + 245 [ label = "245" ] + 246 [ label = "246" ] + 247 [ label = "247" ] + 248 [ label = "248" ] + 249 [ label = "249" ] + 250 [ label = "250" ] + 251 [ label = "251" ] + 252 [ label = "252" ] + 253 [ label = "253" ] + 254 [ label = "254" ] + 255 [ label = "255" ] + 256 [ label = "256" ] + 257 [ label = "257" ] + 258 [ label = "258" ] + 259 [ label = "259" ] + 260 [ label = "260" ] + 261 [ label = "261" ] + 262 [ label = "262" ] + 263 [ label = "263" ] + 264 [ label = "264" ] + 265 [ label = "265" ] + 266 [ label = "266" ] + 267 [ label = "267" ] + 268 [ label = "268" ] + 269 [ label = "269" ] + 270 [ label = "270" ] + 271 [ label = "271" ] + 272 [ label = "272" ] + 273 [ label = "273" ] + 274 [ label = "274" ] + 275 [ label = "275" ] + 276 [ label = "276" ] + 277 [ label = "277" ] + 278 [ label = "278" ] + 279 [ label = "279" ] + 280 [ label = "280" ] + 281 [ label = "281" ] + 282 [ label = "282" ] + 283 [ label = "283" ] + 284 [ label = "284" ] + 285 [ label = "285" ] + 286 [ label = "286" ] + 287 [ label = "287" ] + 288 [ label = "288" ] + 289 [ label = "289" ] + 290 [ label = "290" ] + 291 [ label = "291" ] + 292 [ label = "292" ] + 293 [ label = "293" ] + 294 [ label = "294" ] + 295 [ label = "295" ] + 296 [ label = "296" ] + 297 [ label = "297" ] + 298 [ label = "298" ] + 299 [ label = "299" ] + 300 [ label = "300" ] + 301 [ label = "301" ] + 302 [ label = "302" ] + 303 [ label = "303" ] + 304 [ label = "304" ] + 6 -> 5 [ label = "()" ] + 7 -> 6 [ label = "()" ] + 8 -> 7 [ label = "()" ] + 9 -> 8 [ label = "()" ] + 10 -> 9 [ label = "()" ] + 11 -> 10 [ label = "()" ] + 12 -> 11 [ label = "()" ] + 13 -> 12 [ label = "()" ] + 14 -> 3 [ label = "()" ] + 14 -> 13 [ label = "()" ] + 15 -> 14 [ label = "()" ] + 16 -> 15 [ label = "()" ] + 17 -> 16 [ label = "()" ] + 18 -> 17 [ label = "()" ] + 19 -> 18 [ label = "()" ] + 20 -> 19 [ label = "()" ] + 21 -> 20 [ label = "()" ] + 22 -> 2 [ label = "()" ] + 22 -> 18 [ label = "()" ] + 23 -> 22 [ label = "()" ] + 24 -> 23 [ label = "()" ] + 25 -> 24 [ label = "()" ] + 26 -> 25 [ label = "()" ] + 26 -> 21 [ label = "()" ] + 27 -> 22 [ label = "()" ] + 28 -> 24 [ label = "()" ] + 28 -> 27 [ label = "()" ] + 29 -> 28 [ label = "()" ] + 30 -> 29 [ label = "()" ] + 31 -> 30 [ label = "()" ] + 32 -> 31 [ label = "()" ] + 33 -> 32 [ label = "()" ] + 33 -> 25 [ label = "()" ] + 34 -> 32 [ label = "()" ] + 34 -> 26 [ label = "()" ] + 35 -> 34 [ label = "()" ] + 36 -> 35 [ label = "()" ] + 37 -> 36 [ label = "()" ] + 38 -> 37 [ label = "()" ] + 39 -> 38 [ label = "()" ] + 40 -> 39 [ label = "()" ] + 41 -> 40 [ label = "()" ] + 42 -> 41 [ label = "()" ] + 43 -> 42 [ label = "()" ] + 44 -> 43 [ label = "()" ] + 45 -> 34 [ label = "()" ] + 45 -> 33 [ label = "()" ] + 46 -> 41 [ label = "()" ] + 46 -> 45 [ label = "()" ] + 47 -> 44 [ label = "()" ] + 47 -> 46 [ label = "()" ] + 48 -> 45 [ label = "()" ] + 48 -> 4 [ label = "()" ] + 49 -> 41 [ label = "()" ] + 49 -> 45 [ label = "()" ] + 50 -> 44 [ label = "()" ] + 50 -> 49 [ label = "()" ] + 51 -> 47 [ label = "()" ] + 51 -> 50 [ label = "()" ] + 52 -> 48 [ label = "()" ] + 52 -> 51 [ label = "()" ] + 53 -> 52 [ label = "()" ] + 53 -> 51 [ label = "()" ] + 54 -> 52 [ label = "()" ] + 55 -> 54 [ label = "()" ] + 56 -> 52 [ label = "()" ] + 57 -> 56 [ label = "()" ] + 58 -> 57 [ label = "()" ] + 59 -> 58 [ label = "()" ] + 60 -> 59 [ label = "()" ] + 61 -> 60 [ label = "()" ] + 62 -> 61 [ label = "()" ] + 63 -> 62 [ label = "()" ] + 64 -> 63 [ label = "()" ] + 65 -> 64 [ label = "()" ] + 66 -> 48 [ label = "()" ] + 66 -> 51 [ label = "()" ] + 67 -> 53 [ label = "()" ] + 67 -> 66 [ label = "()" ] + 68 -> 67 [ label = "()" ] + 68 -> 65 [ label = "()" ] + 69 -> 68 [ label = "()" ] + 70 -> 55 [ label = "()" ] + 70 -> 69 [ label = "()" ] + 71 -> 55 [ label = "()" ] + 71 -> 68 [ label = "()" ] + 72 -> 71 [ label = "()" ] + 72 -> 70 [ label = "()" ] + 74 -> 73 [ label = "()" ] + 75 -> 74 [ label = "()" ] + 75 -> 71 [ label = "()" ] + 76 -> 74 [ label = "()" ] + 77 -> 73 [ label = "()" ] + 77 -> 55 [ label = "()" ] + 78 -> 77 [ label = "()" ] + 78 -> 72 [ label = "()" ] + 79 -> 77 [ label = "()" ] + 80 -> 79 [ label = "()" ] + 80 -> 78 [ label = "()" ] + 81 -> 79 [ label = "()" ] + 82 -> 81 [ label = "()" ] + 83 -> 82 [ label = "()" ] + 84 -> 83 [ label = "()" ] + 85 -> 84 [ label = "()" ] + 85 -> 80 [ label = "()" ] + 86 -> 84 [ label = "()" ] + 87 -> 86 [ label = "()" ] + 88 -> 87 [ label = "()" ] + 89 -> 88 [ label = "()" ] + 90 -> 89 [ label = "()" ] + 90 -> 85 [ label = "()" ] + 91 -> 89 [ label = "()" ] + 92 -> 91 [ label = "()" ] + 93 -> 92 [ label = "()" ] + 94 -> 93 [ label = "()" ] + 95 -> 94 [ label = "()" ] + 96 -> 95 [ label = "()" ] + 97 -> 96 [ label = "()" ] + 98 -> 97 [ label = "()" ] + 99 -> 98 [ label = "()" ] + 100 -> 99 [ label = "()" ] + 101 -> 100 [ label = "()" ] + 102 -> 101 [ label = "()" ] + 103 -> 102 [ label = "()" ] + 103 -> 68 [ label = "()" ] + 104 -> 93 [ label = "()" ] + 104 -> 90 [ label = "()" ] + 105 -> 102 [ label = "()" ] + 105 -> 104 [ label = "()" ] + 106 -> 103 [ label = "()" ] + 106 -> 105 [ label = "()" ] + 107 -> 1 [ label = "()" ] + 107 -> 106 [ label = "()" ] + 108 -> 107 [ label = "()" ] + 108 -> 106 [ label = "()" ] + 109 -> 108 [ label = "()" ] + 110 -> 108 [ label = "()" ] + 111 -> 109 [ label = "()" ] + 111 -> 110 [ label = "()" ] + 112 -> 110 [ label = "()" ] + 113 -> 74 [ label = "()" ] + 113 -> 112 [ label = "()" ] + 114 -> 112 [ label = "()" ] + 114 -> 111 [ label = "()" ] + 115 -> 74 [ label = "()" ] + 115 -> 114 [ label = "()" ] + 116 -> 74 [ label = "()" ] + 116 -> 114 [ label = "()" ] + 117 -> 116 [ label = "()" ] + 117 -> 115 [ label = "()" ] + 118 -> 117 [ label = "()" ] + 118 -> 113 [ label = "()" ] + 119 -> 113 [ label = "()" ] + 119 -> 116 [ label = "()" ] + 120 -> 117 [ label = "()" ] + 120 -> 119 [ label = "()" ] + 121 -> 120 [ label = "()" ] + 121 -> 75 [ label = "()" ] + 122 -> 121 [ label = "()" ] + 122 -> 118 [ label = "()" ] + 123 -> 122 [ label = "()" ] + 123 -> 113 [ label = "()" ] + 124 -> 123 [ label = "()" ] + 125 -> 124 [ label = "()" ] + 126 -> 124 [ label = "()" ] + 127 -> 125 [ label = "()" ] + 127 -> 126 [ label = "()" ] + 128 -> 127 [ label = "()" ] + 129 -> 123 [ label = "()" ] + 130 -> 129 [ label = "()" ] + 131 -> 130 [ label = "()" ] + 132 -> 131 [ label = "()" ] + 133 -> 132 [ label = "()" ] + 134 -> 133 [ label = "()" ] + 135 -> 134 [ label = "()" ] + 136 -> 135 [ label = "()" ] + 137 -> 136 [ label = "()" ] + 138 -> 137 [ label = "()" ] + 139 -> 138 [ label = "()" ] + 140 -> 139 [ label = "()" ] + 141 -> 140 [ label = "()" ] + 142 -> 141 [ label = "()" ] + 143 -> 142 [ label = "()" ] + 144 -> 143 [ label = "()" ] + 145 -> 144 [ label = "()" ] + 146 -> 145 [ label = "()" ] + 147 -> 146 [ label = "()" ] + 148 -> 147 [ label = "()" ] + 149 -> 148 [ label = "()" ] + 150 -> 149 [ label = "()" ] + 151 -> 150 [ label = "()" ] + 152 -> 151 [ label = "()" ] + 153 -> 152 [ label = "()" ] + 154 -> 153 [ label = "()" ] + 155 -> 154 [ label = "()" ] + 156 -> 155 [ label = "()" ] + 157 -> 156 [ label = "()" ] + 158 -> 157 [ label = "()" ] + 159 -> 158 [ label = "()" ] + 160 -> 159 [ label = "()" ] + 161 -> 129 [ label = "()" ] + 161 -> 128 [ label = "()" ] + 162 -> 161 [ label = "()" ] + 162 -> 128 [ label = "()" ] + 163 -> 162 [ label = "()" ] + 163 -> 128 [ label = "()" ] + 164 -> 163 [ label = "()" ] + 165 -> 164 [ label = "()" ] + 166 -> 130 [ label = "()" ] + 166 -> 165 [ label = "()" ] + 167 -> 165 [ label = "()" ] + 168 -> 167 [ label = "()" ] + 169 -> 168 [ label = "()" ] + 170 -> 166 [ label = "()" ] + 170 -> 169 [ label = "()" ] + 171 -> 170 [ label = "()" ] + 172 -> 171 [ label = "()" ] + 173 -> 172 [ label = "()" ] + 174 -> 168 [ label = "()" ] + 175 -> 171 [ label = "()" ] + 175 -> 174 [ label = "()" ] + 176 -> 175 [ label = "()" ] + 177 -> 176 [ label = "()" ] + 178 -> 172 [ label = "()" ] + 178 -> 177 [ label = "()" ] + 179 -> 173 [ label = "()" ] + 179 -> 178 [ label = "()" ] + 180 -> 179 [ label = "()" ] + 180 -> 177 [ label = "()" ] + 181 -> 76 [ label = "()" ] + 181 -> 180 [ label = "()" ] + 182 -> 181 [ label = "()" ] + 182 -> 180 [ label = "()" ] + 183 -> 181 [ label = "()" ] + 183 -> 180 [ label = "()" ] + 184 -> 183 [ label = "()" ] + 184 -> 180 [ label = "()" ] + 185 -> 184 [ label = "()" ] + 185 -> 182 [ label = "()" ] + 186 -> 185 [ label = "()" ] + 187 -> 186 [ label = "()" ] + 188 -> 187 [ label = "()" ] + 189 -> 188 [ label = "()" ] + 190 -> 189 [ label = "()" ] + 191 -> 190 [ label = "()" ] + 192 -> 191 [ label = "()" ] + 193 -> 192 [ label = "()" ] + 194 -> 134 [ label = "()" ] + 194 -> 193 [ label = "()" ] + 195 -> 134 [ label = "()" ] + 195 -> 191 [ label = "()" ] + 196 -> 195 [ label = "()" ] + 196 -> 193 [ label = "()" ] + 197 -> 195 [ label = "()" ] + 197 -> 193 [ label = "()" ] + 198 -> 197 [ label = "()" ] + 198 -> 194 [ label = "()" ] + 199 -> 198 [ label = "()" ] + 200 -> 198 [ label = "()" ] + 200 -> 196 [ label = "()" ] + 201 -> 199 [ label = "()" ] + 201 -> 200 [ label = "()" ] + 202 -> 201 [ label = "()" ] + 203 -> 202 [ label = "()" ] + 204 -> 201 [ label = "()" ] + 204 -> 200 [ label = "()" ] + 205 -> 203 [ label = "()" ] + 205 -> 204 [ label = "()" ] + 206 -> 205 [ label = "()" ] + 206 -> 204 [ label = "()" ] + 207 -> 206 [ label = "()" ] + 208 -> 206 [ label = "()" ] + 208 -> 204 [ label = "()" ] + 209 -> 185 [ label = "()" ] + 210 -> 209 [ label = "()" ] + 211 -> 195 [ label = "()" ] + 211 -> 210 [ label = "()" ] + 212 -> 201 [ label = "()" ] + 212 -> 211 [ label = "()" ] + 213 -> 212 [ label = "()" ] + 213 -> 206 [ label = "()" ] + 214 -> 213 [ label = "()" ] + 214 -> 208 [ label = "()" ] + 215 -> 214 [ label = "()" ] + 215 -> 208 [ label = "()" ] + 216 -> 212 [ label = "()" ] + 216 -> 207 [ label = "()" ] + 217 -> 215 [ label = "()" ] + 217 -> 216 [ label = "()" ] + 218 -> 214 [ label = "()" ] + 218 -> 216 [ label = "()" ] + 219 -> 218 [ label = "()" ] + 219 -> 217 [ label = "()" ] + 220 -> 219 [ label = "()" ] + 220 -> 215 [ label = "()" ] + 221 -> 220 [ label = "()" ] + 221 -> 215 [ label = "()" ] + 222 -> 221 [ label = "()" ] + 222 -> 218 [ label = "()" ] + 223 -> 221 [ label = "()" ] + 223 -> 217 [ label = "()" ] + 224 -> 222 [ label = "()" ] + 224 -> 223 [ label = "()" ] + 225 -> 224 [ label = "()" ] + 225 -> 223 [ label = "()" ] + 226 -> 225 [ label = "()" ] + 227 -> 225 [ label = "()" ] + 228 -> 227 [ label = "()" ] + 229 -> 228 [ label = "()" ] + 230 -> 227 [ label = "()" ] + 230 -> 226 [ label = "()" ] + 231 -> 230 [ label = "()" ] + 231 -> 229 [ label = "()" ] + 232 -> 231 [ label = "()" ] + 232 -> 228 [ label = "()" ] + 233 -> 232 [ label = "()" ] + 233 -> 229 [ label = "()" ] + 234 -> 232 [ label = "()" ] + 234 -> 229 [ label = "()" ] + 235 -> 234 [ label = "()" ] + 235 -> 233 [ label = "()" ] + 236 -> 235 [ label = "()" ] + 237 -> 236 [ label = "()" ] + 238 -> 237 [ label = "()" ] + 239 -> 238 [ label = "()" ] + 240 -> 239 [ label = "()" ] + 241 -> 240 [ label = "()" ] + 242 -> 241 [ label = "()" ] + 243 -> 242 [ label = "()" ] + 244 -> 243 [ label = "()" ] + 245 -> 244 [ label = "()" ] + 246 -> 245 [ label = "()" ] + 247 -> 246 [ label = "()" ] + 248 -> 246 [ label = "()" ] + 249 -> 248 [ label = "()" ] + 249 -> 247 [ label = "()" ] + 250 -> 249 [ label = "()" ] + 250 -> 247 [ label = "()" ] + 251 -> 250 [ label = "()" ] + 252 -> 250 [ label = "()" ] + 253 -> 252 [ label = "()" ] + 254 -> 251 [ label = "()" ] + 254 -> 253 [ label = "()" ] + 255 -> 254 [ label = "()" ] + 256 -> 255 [ label = "()" ] + 257 -> 256 [ label = "()" ] + 258 -> 257 [ label = "()" ] + 259 -> 258 [ label = "()" ] + 260 -> 259 [ label = "()" ] + 261 -> 260 [ label = "()" ] + 262 -> 261 [ label = "()" ] + 263 -> 262 [ label = "()" ] + 264 -> 263 [ label = "()" ] + 265 -> 264 [ label = "()" ] + 266 -> 265 [ label = "()" ] + 267 -> 263 [ label = "()" ] + 268 -> 267 [ label = "()" ] + 268 -> 266 [ label = "()" ] + 269 -> 250 [ label = "()" ] + 270 -> 269 [ label = "()" ] + 270 -> 268 [ label = "()" ] + 271 -> 137 [ label = "()" ] + 271 -> 270 [ label = "()" ] + 272 -> 139 [ label = "()" ] + 272 -> 271 [ label = "()" ] + 273 -> 272 [ label = "()" ] + 274 -> 273 [ label = "()" ] + 275 -> 274 [ label = "()" ] + 276 -> 275 [ label = "()" ] + 277 -> 276 [ label = "()" ] + 278 -> 270 [ label = "()" ] + 278 -> 268 [ label = "()" ] + 279 -> 278 [ label = "()" ] + 279 -> 268 [ label = "()" ] + 280 -> 279 [ label = "()" ] + 281 -> 280 [ label = "()" ] + 282 -> 281 [ label = "()" ] + 283 -> 282 [ label = "()" ] + 284 -> 283 [ label = "()" ] + 285 -> 284 [ label = "()" ] + 286 -> 285 [ label = "()" ] + 287 -> 278 [ label = "()" ] + 287 -> 268 [ label = "()" ] + 288 -> 286 [ label = "()" ] + 288 -> 287 [ label = "()" ] + 289 -> 288 [ label = "()" ] + 289 -> 279 [ label = "()" ] + 290 -> 154 [ label = "()" ] + 290 -> 289 [ label = "()" ] + 291 -> 160 [ label = "()" ] + 291 -> 290 [ label = "()" ] + 292 -> 289 [ label = "()" ] + 293 -> 292 [ label = "()" ] + 294 -> 293 [ label = "()" ] + 295 -> 294 [ label = "()" ] + 296 -> 269 [ label = "()" ] + 297 -> 296 [ label = "()" ] + 298 -> 297 [ label = "()" ] + 299 -> 298 [ label = "()" ] + 300 -> 299 [ label = "()" ] + 300 -> 295 [ label = "()" ] + 301 -> 291 [ label = "()" ] + 301 -> 300 [ label = "()" ] + + 304 -> 303 [ label = "()" ] + 303 -> 302 [ label = "()" ] + }"#); + pub static ref HIGH_COMPLEX_GRAPH: String = String::from(r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 7 [ label = "7" ] + 8 [ label = "8" ] + 9 [ label = "9" ] + 10 [ label = "10" ] + 11 [ label = "11" ] + 12 [ label = "12" ] + 13 [ label = "13" ] + 14 [ label = "14" ] + 15 [ label = "15" ] + 16 [ label = "16" ] + 17 [ label = "17" ] + 18 [ label = "18" ] + 19 [ label = "19" ] + 20 [ label = "20" ] + 21 [ label = "21" ] + 22 [ label = "22" ] + 23 [ label = "23" ] + 24 [ label = "24" ] + 25 [ label = "25" ] + 26 [ label = "26" ] + 27 [ label = "27" ] + 28 [ label = "28" ] + 29 [ label = "29" ] + 30 [ label = "30" ] + 31 [ label = "31" ] + 32 [ label = "32" ] + 33 [ label = "33" ] + 34 [ label = "34" ] + 35 [ label = "35" ] + 36 [ label = "36" ] + 37 [ label = "37" ] + 38 [ label = "38" ] + 39 [ label = "39" ] + 40 [ label = "40" ] + 41 [ label = "41" ] + 42 [ label = "42" ] + 43 [ label = "43" ] + 44 [ label = "44" ] + 45 [ label = "45" ] + 46 [ label = "46" ] + 47 [ label = "47" ] + 48 [ label = "48" ] + 49 [ label = "49" ] + 50 [ label = "50" ] + 51 [ label = "51" ] + 52 [ label = "52" ] + 53 [ label = "53" ] + 54 [ label = "54" ] + 55 [ label = "55" ] + 2 -> 1 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 6 -> 5 [ label = "()" ] + 7 -> 6 [ label = "()" ] + 8 -> 7 [ label = "()" ] + 9 -> 8 [ label = "()" ] + 10 -> 9 [ label = "()" ] + 11 -> 10 [ label = "()" ] + 12 -> 11 [ label = "()" ] + 13 -> 3 [ label = "()" ] + 13 -> 12 [ label = "()" ] + 14 -> 13 [ label = "()" ] + 15 -> 14 [ label = "()" ] + 16 -> 15 [ label = "()" ] + 18 -> 17 [ label = "()" ] + 18 -> 16 [ label = "()" ] + 19 -> 18 [ label = "()" ] + 20 -> 19 [ label = "()" ] + 21 -> 20 [ label = "()" ] + 22 -> 2 [ label = "()" ] + 22 -> 19 [ label = "()" ] + 23 -> 22 [ label = "()" ] + 23 -> 21 [ label = "()" ] + 24 -> 23 [ label = "()" ] + 25 -> 24 [ label = "()" ] + 26 -> 25 [ label = "()" ] + 27 -> 26 [ label = "()" ] + 28 -> 27 [ label = "()" ] + 29 -> 28 [ label = "()" ] + 30 -> 29 [ label = "()" ] + 31 -> 30 [ label = "()" ] + 32 -> 31 [ label = "()" ] + 33 -> 32 [ label = "()" ] + 34 -> 33 [ label = "()" ] + 35 -> 33 [ label = "()" ] + 36 -> 34 [ label = "()" ] + 36 -> 35 [ label = "()" ] + 37 -> 36 [ label = "()" ] + 38 -> 37 [ label = "()" ] + 39 -> 38 [ label = "()" ] + 40 -> 39 [ label = "()" ] + 42 -> 41 [ label = "()" ] + 42 -> 40 [ label = "()" ] + 43 -> 42 [ label = "()" ] + 44 -> 41 [ label = "()" ] + 44 -> 40 [ label = "()" ] + 45 -> 41 [ label = "()" ] + 45 -> 40 [ label = "()" ] + 46 -> 43 [ label = "()" ] + 46 -> 45 [ label = "()" ] + 47 -> 44 [ label = "()" ] + 47 -> 46 [ label = "()" ] + 48 -> 44 [ label = "()" ] + 48 -> 46 [ label = "()" ] + 49 -> 46 [ label = "()" ] + 50 -> 49 [ label = "()" ] + 50 -> 47 [ label = "()" ] + 51 -> 49 [ label = "()" ] + 51 -> 48 [ label = "()" ] + 52 -> 51 [ label = "()" ] + 52 -> 50 [ label = "()" ] + 54 -> 53 [ label = "()" ] + 55 -> 54 [ label = "()" ] + 55 -> 22 [ label = "()" ] + }"#); +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/tests.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/tests.rs new file mode 100644 index 000000000..809291288 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/tests.rs @@ -0,0 +1,103 @@ +#[test] +pub fn test_merge_fast_forward() { + use hdk::prelude::*; + + use crate::link_adapter::workspace::Workspace; + use crate::retriever::{Associations, GraphInput, MockPerspectiveGraph, GLOBAL_MOCKED_GRAPH}; + + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::new(GraphInput { + nodes: 6, + associations: vec![ + Associations { + node_source: 1, + node_targets: vec![0], + }, + Associations { + node_source: 2, + node_targets: vec![0], + }, + Associations { + node_source: 3, + node_targets: vec![1], + }, + Associations { + node_source: 4, + node_targets: vec![2], + }, + Associations { + node_source: 5, + node_targets: vec![3, 4], + }, + ], + }); + } + update(); + + let mut workspace = Workspace::new(); + let res = workspace.collect_until_common_ancestor::( + ActionHash::from_raw_36(vec![5; 36]), + ActionHash::from_raw_36(vec![4; 36]), + ); + assert!(res.is_ok()); + assert_eq!(res.unwrap(), ActionHash::from_raw_36(vec![0; 36])); +} + +#[test] +pub fn test_fork_with_none_source() { + use hdk::prelude::*; + + use crate::link_adapter::workspace::Workspace; + use crate::retriever::{GraphInput, MockPerspectiveGraph, GLOBAL_MOCKED_GRAPH}; + + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::new(GraphInput { + nodes: 2, + associations: vec![], + }); + } + update(); + + let mut workspace = Workspace::new(); + let res = workspace.collect_until_common_ancestor::( + ActionHash::from_raw_36(vec![0; 36]), + ActionHash::from_raw_36(vec![1; 36]), + ); + assert!(res.is_ok()); + //TODO; this is a problem since our pull code is not expecting to find a common ancestor, since both tips are forks + //but in the case below where we have a merge entry we need to register the None node as a common ancestor so we can traverse the "their" branch back until the root + //and not break the traversal with common ancestor as the "ours" node as was happening before + // + //So what do we actually need to return here? + assert_eq!(res.unwrap(), ActionHash::from_raw_36(vec![0xdb; 36])); +} + +#[test] +pub fn test_merge_fast_forward_none_source() { + use hdk::prelude::*; + + use crate::link_adapter::workspace::Workspace; + use crate::retriever::{Associations, GraphInput, MockPerspectiveGraph, GLOBAL_MOCKED_GRAPH}; + + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::new(GraphInput { + nodes: 3, + associations: vec![Associations { + node_source: 2, + node_targets: vec![0, 1], + }], + }); + } + update(); + + let mut workspace = Workspace::new(); + let res = workspace.collect_until_common_ancestor::( + ActionHash::from_raw_36(vec![2; 36]), + ActionHash::from_raw_36(vec![1; 36]), + ); + assert!(res.is_ok()); + assert_eq!(res.unwrap(), ActionHash::from_raw_36(vec![0xdb; 36])); +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/topo_sort.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/topo_sort.rs new file mode 100644 index 000000000..d33b5f015 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/topo_sort.rs @@ -0,0 +1,143 @@ +use crate::errors::{SocialContextError, SocialContextResult}; +use hdk::prelude::*; +use perspective_diff_sync_integrity::PerspectiveDiffEntryReference; +use std::collections::BTreeSet; + +// Applies Kahn's algorithm for topologically sorting a graph +pub fn topo_sort_diff_references( + arr: &Vec<( + HoloHash, + PerspectiveDiffEntryReference, + )>, +) -> SocialContextResult< + Vec<( + HoloHash, + PerspectiveDiffEntryReference, + )>, +> { + type Hash = HoloHash; + let mut result = Vec::<(Hash, PerspectiveDiffEntryReference)>::new(); + + // first collect orphaned nodes (=without parent) as starting points: + let mut orphaned_nodes: Vec<(Hash, PerspectiveDiffEntryReference)> = arr + .iter() + .filter(|&e| e.1.parents == None) + .cloned() + .collect(); + + if orphaned_nodes.len() == 0 { + debug!("No orphans found! Length: {}, list: {:?}", arr.len(), arr); + return Err(SocialContextError::InternalError( + "Can't topologically sort list without orphan!", + )); + } + + let mut edges = BTreeSet::new(); + for i in 0..arr.len() { + if let Some(parents) = &arr[i].1.parents { + for p in 0..parents.len() { + let child = arr[i].0.clone(); + let parent = parents[p].clone(); + edges.insert((child, parent)); + } + } + } + + // Starting from the nodes without parents... + while let Some(n) = orphaned_nodes.pop() { + //.. we put them into the result list. + result.push(n.clone()); + + println!("Added orphan {:?}", n); + + // and then we look for any nodes that have it as parent + // (using the edges set) + let edges_with_n_as_parent = edges + .iter() + .filter(|&e| e.1 == n.0) + .cloned() + .collect::>(); + + println!("Edges with orphan as parent {:?}", edges_with_n_as_parent); + + // So for every parent relationship with n as parent... + for edge in &edges_with_n_as_parent { + println!("Removing edge {:?}", edge); + // we remove that edge + edges.remove(edge); + + // and then check if that child of n has any other parents... + let child = edge.0.clone(); + + println!("Found child {:?}", child); + let edges_with_child_as_child = edges + .iter() + .filter(|&e| e.0 == child) + .cloned() + .collect::>(); + + println!("Edges with child as child {:?}", edges_with_child_as_child); + + // if the child does not have any other parents (left unprocessed) + if edges_with_child_as_child.len() == 0 { + // we're good to add the child to the results as well. + let child_item = arr.iter().find(|&e| e.0 == child).ok_or(SocialContextError::InternalError("Topological sort couldn't find child in input vector, which was mentioned in an edge. This can only be an error in the topological sorting code.."))?; + println!("Adding newly orphaned child {:?}", child_item); + orphaned_nodes.push((child.clone(), child_item.1.clone())); + } + } + } + + if edges.len() > 0 { + debug!( + "Unresolved parent links after topologically sorting: {:?}", + edges + ); + + debug!("Number of unresolved parent links {:?}", edges.len()); + debug!("Number of items to sort: {:?}", arr.len()); + Err(SocialContextError::InternalError( + "Cycle or missing nodes detected. Unresolved parent links after topologically sorting.", + )) + //Ok(result) + } else { + Ok(result) + } +} + +#[cfg(test)] +mod tests { + use super::topo_sort_diff_references; + use hdk::prelude::*; + use perspective_diff_sync_integrity::PerspectiveDiffEntryReference; + + #[test] + fn test_topo_sort_diff_references() { + let h1 = HoloHash::::from_raw_36(vec![1; 36]); + let h2 = HoloHash::::from_raw_36(vec![2; 36]); + let h3 = HoloHash::::from_raw_36(vec![3; 36]); + let h4 = HoloHash::::from_raw_36(vec![4; 36]); + + let r1 = PerspectiveDiffEntryReference::new(h1.clone(), Some(vec![h2.clone(), h3.clone()])); + let r2 = PerspectiveDiffEntryReference::new(h2.clone(), Some(vec![h4.clone()])); + let r3 = PerspectiveDiffEntryReference::new(h3.clone(), Some(vec![h4.clone()])); + let r4 = PerspectiveDiffEntryReference::new(h4.clone(), None); + + let e1 = (h1, r1); + let e2 = (h2, r2); + let e3 = (h3, r3); + let e4 = (h4, r4); + + assert_eq!(e1.0, e1.1.diff); + assert_eq!(e2.0, e2.1.diff); + assert_eq!(e3.0, e3.1.diff); + assert_eq!(e4.0, e4.1.diff); + + let test_vec = vec![e1.clone(), e2.clone(), e3.clone(), e4.clone()]; + let expected = vec![e4, e3, e2, e1]; + + let result = topo_sort_diff_references(&test_vec).expect("topo sort to not error"); + + assert_eq!(result, expected); + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs new file mode 100644 index 000000000..296e1f004 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/link_adapter/workspace.rs @@ -0,0 +1,1427 @@ +use hdk::prelude::*; +use itertools::Itertools; +use perspective_diff_sync_integrity::{ + LinkTypes, PerspectiveDiff, PerspectiveDiffEntryReference, Snapshot, +}; +use petgraph::{ + algo::dominators::simple_fast, + dot::{Config, Dot}, + graph::{DiGraph, Graph, NodeIndex, UnGraph}, +}; +use std::cell::RefCell; +use std::collections::{BTreeMap, VecDeque}; + +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::link_adapter::topo_sort::topo_sort_diff_references; +use crate::retriever::{hash_to_node_id, PerspectiveDiffRetreiver}; +use crate::utils::get_now; +use crate::Hash; + +pub struct Workspace { + pub graph: DiGraph, + pub undirected_graph: UnGraph, + pub node_index_map: BTreeMap>, + pub entry_map: BTreeMap, + pub sorted_diffs: Option>, + pub common_ancestors: Vec, + pub diffs: BTreeMap, + pub back_links: BTreeMap>, + unexplored_side_branches: BTreeSet, +} + +#[derive(Clone)] +struct BfsSearch { + pub found_ancestors: RefCell>, + pub bfs_branches: RefCell>, + pub reached_end: bool, +} + +#[allow(non_snake_case)] +pub fn NULL_NODE() -> ActionHash { + ActionHash::from_raw_36(vec![0xdb; 36]) +} + +impl BfsSearch { + pub fn new(start: Hash) -> BfsSearch { + let branches = RefCell::new(Vec::from([start])); + BfsSearch { + found_ancestors: RefCell::new(Vec::new()), + bfs_branches: branches, + reached_end: false, + } + } +} + +impl std::fmt::Debug for BfsSearch { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if cfg!(test) { + let ancestors: Vec<_> = self + .found_ancestors + .borrow() + .clone() + .into_iter() + .map(|val| hash_to_node_id(val)) + .collect(); + let branches: Vec<_> = self + .bfs_branches + .borrow() + .clone() + .into_iter() + .map(|val| hash_to_node_id(val)) + .collect(); + write!( + f, + "BfsSearch {{ found_ancestors: {:?},\n bfs_branches: {:?},\n reached_end: {:?} }}", + ancestors, branches, self.reached_end + ) + } else { + write!( + f, + "BfsSearch {{ found_ancestors: {:?},\n bfs_branches: {:?},\n reached_end: {:?} }}", + self.found_ancestors, self.bfs_branches, self.reached_end + ) + } + } +} + +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug)] +enum SearchSide { + Theirs, + Ours, +} + +fn other_side(side: &SearchSide) -> SearchSide { + match side { + SearchSide::Theirs => SearchSide::Ours, + SearchSide::Ours => SearchSide::Theirs, + } +} + +impl Workspace { + pub fn new() -> Workspace { + Workspace { + graph: Graph::new(), + undirected_graph: Graph::new_undirected(), + node_index_map: BTreeMap::new(), + entry_map: BTreeMap::new(), + sorted_diffs: None, + common_ancestors: vec![], + diffs: BTreeMap::new(), + back_links: BTreeMap::new(), + unexplored_side_branches: BTreeSet::new(), + } + } + + // This is the easy case when we only build from one hash. + // (either latest or our current hash, like in render). + // We don't have to check for forks, we just deep search from the given + // diff and terminate at leafs and snapshots. + // Since we don't have to detect and handle forks, we don't need + // to unroll snapshots and just treat them as leafs. + pub fn collect_only_from_latest( + &mut self, + latest: Hash, + ) -> SocialContextResult<()> { + debug!("===Workspace.collect_only_from_latest(): Function start"); + let fn_start = get_now()?.time(); + + // Initializing with only one branch starting from the given hash. + let mut unprocessed_branches = VecDeque::new(); + unprocessed_branches.push_back(latest); + + let mut snapshot_seen = vec![]; + + while !unprocessed_branches.is_empty() { + let current_hash = unprocessed_branches[0].clone(); + + if self.entry_map.contains_key(¤t_hash) && !snapshot_seen.contains(¤t_hash) + { + debug!("===Workspace.collect_only_from_latest(): CIRCLE DETECTED! Closing current branch..."); + unprocessed_branches.pop_front(); + continue; + } + + let current_diff = Self::get_p_diff_reference::(current_hash.clone())?; + + if current_diff.diffs_since_snapshot == 0 { + debug!("===Workspace.collect_only_from_latest(): Found a perspective diff reference containing a snapshot!"); + let snapshot = Self::get_snapshot(current_diff.clone())?; + + if snapshot.is_none() { + debug!("===Workspace.collect_only_from_latest(): ERROR: Expected to find snapshot link on current_diff where diffs_since_snapshot was 0"); + self.handle_parents(current_diff, current_hash, &mut unprocessed_branches); + } else { + let mut snapshot = snapshot.unwrap(); + + let mut last_diff = None; + for i in 0..snapshot.diff_chunks.len() { + let diff_chunk = &snapshot.diff_chunks[i]; + self.entry_map.insert( + diff_chunk.clone(), + PerspectiveDiffEntryReference::new( + diff_chunk.clone(), + last_diff.clone(), + ), + ); + last_diff = Some(vec![diff_chunk.clone()]); + } + + self.entry_map.insert( + current_hash.clone(), + PerspectiveDiffEntryReference::new(current_diff.diff, last_diff.clone()), + ); + + snapshot_seen.append(&mut snapshot.included_diffs); + + // Snapshot terminates like an orphan. + // So we can close this branch and potentially continue + // with other unprocessed branches, if they exist. + unprocessed_branches.pop_front(); + }; + } else { + self.handle_parents(current_diff, current_hash, &mut unprocessed_branches); + } + } + + let fn_end = get_now()?.time(); + debug!("===Workspace.collect_only_from_latest() - Profiling: Took: {} to complete collect_only_from_latest() function", (fn_end - fn_start).num_milliseconds()); + + Ok(()) + } + + fn handle_parents( + &mut self, + current_diff: PerspectiveDiffEntryReference, + current_hash: Hash, + unprocessed_branches: &mut VecDeque, + ) { + if let Some(parents) = ¤t_diff.parents { + for i in 0..parents.len() { + // Depth-first search: + // We are replacing our search position (==current_hash==unprocessed_branches[0]) + // with the first parent. + // Other parents are pushed on the vec as new branches to search later.. + if i == 0 { + unprocessed_branches[0] = parents[i].clone(); + } else { + unprocessed_branches.push_back(parents[i].clone()) + } + } + } else { + // We arrived at a leaf/orphan (no parents). + // So we can close this branch and potentially continue + // with other unprocessed branches, if they exist. + unprocessed_branches.pop_front(); + } + + self.entry_map.insert(current_hash, current_diff); + } + + pub fn sort_graph(&mut self) -> SocialContextResult<()> { + //debug!("===Workspace.sort_graph(): Function start"); + //let fn_start = get_now()?.time(); + + let common_ancestor = self.common_ancestors.last().unwrap(); + + //TODO; this should probably be a Map but tests break when it is a map + let mut sorted: Vec<(Hash, PerspectiveDiffEntryReference)> = Vec::new(); + let mut visited: HashSet = HashSet::new(); + let mut next: VecDeque = VecDeque::new(); + self.unexplored_side_branches = BTreeSet::new(); + //let mut inner_iter = 0; + + next.push_back(common_ancestor.clone()); + + while !next.is_empty() { + let current = next.pop_front().expect("must be Ok since next !is_empty()"); + if !visited.contains(¤t) { + //inner_iter += 1; + //println!("current: {:?}", hash_to_node_id(current.clone())); + match self.back_links.get(¤t) { + Some(children) => { + //println!("--> has {} children, checking the children to see if there is a missing parent link", children.len()); + //println!("Children are: {:#?}", children.clone().into_iter().map(|child| hash_to_node_id(child)).collect::>()); + for child in children.iter() { + let diff = self.diffs.get(&child).expect("Should child must exist"); + if diff.parents.is_some() { + for parent in diff.parents.as_ref().unwrap() { + if parent != ¤t { + //println!("Found missing parent: {:?}", hash_to_node_id(parent.clone())); + self.unexplored_side_branches.insert(parent.clone()); + } + } + } + } + let mut unseen_children = children + .to_owned() + .into_iter() + .filter(|child| !next.contains(child)) + .collect::>(); + next.append(&mut unseen_children); + } + None => {} + }; + let current_diff = self.diffs.get(¤t).expect("diffs should be populated"); + sorted.push((current.clone(), current_diff.clone())); + if self.entry_map.get(¤t).is_none() { + self.entry_map.insert(current.clone(), current_diff.clone()); + }; + visited.insert(current); + } + } + //debug!( + // "===Workspace.sort_graph(): Made {:?} total iterations", + // inner_iter + //); + + self.unexplored_side_branches = self + .unexplored_side_branches + .iter() + .filter(|b| !sorted.iter().find(|s| s.0 == **b).is_some()) + .cloned() + .collect(); + + // println!("SortGraph iter: Unexplored side branches: {:?}", self.unexplored_side_branches.clone().into_iter().map(|child| hash_to_node_id(child)).collect::>()); + + //println!("Sorted is: {:?}", sorted.clone().into_iter().map(|val| hash_to_node_id(val.0)).collect::>()); + self.sorted_diffs = Some(sorted.into_iter().unique().collect()); + + //let fn_end = get_now()?.time(); + //debug!( + // "===Workspace.sort_graph() - Profiling: Took: {} to complete sort_graph() function", + // (fn_end - fn_start).num_milliseconds() + //); + + Ok(()) + } + + pub fn build_diffs( + &mut self, + theirs: Hash, + ours: Hash, + ) -> SocialContextResult<()> { + debug!("===Workspace.build_diffs(): Function start"); + let fn_start = get_now()?.time(); + + let common_ancestor = self.collect_until_common_ancestor::(theirs, ours)?; + self.common_ancestors.push(common_ancestor); + + //println!("===PerspectiveDiffSunc.build_diffs(): Got diffs: {:?}", self.diffs.iter().map(|x| hash_to_node_id(x.0.to_owned())).collect::>()); + //println!("===PerspectiveDiffSunc.build_diffs(): Got back_links: {:?}", self.back_links.iter().map(|x| hash_to_node_id(x.0.to_owned())).collect::>()); + + self.sort_graph()?; + //println!("===PerspectiveDiffSunc.build_diffs(): Got unexplored side branches parent: {:#?}", self.unexplored_side_branches.iter().map(|x| hash_to_node_id(x.to_owned())).collect::>()); + + while self.unexplored_side_branches.len() > 0 { + let unexplored_side_branch = self + .unexplored_side_branches + .iter() + .next_back() + .unwrap() + .to_owned(); + let ours = self + .common_ancestors + .last() + .expect("There should have been a common ancestor above") + .to_owned(); + //println!("===Workspace.build_diffs(): making an explored side branch iteration: {:?} and ours: {:?}", hash_to_node_id(unexplored_side_branch.clone()), hash_to_node_id(ours.clone())); + let common_ancestor = + self.collect_until_common_ancestor::(unexplored_side_branch, ours)?; + self.common_ancestors.push(common_ancestor.clone()); + self.sort_graph()?; + //println!("===PerspectiveDiffSync.build_diffs(): Got common ancestor: {:?}", hash_to_node_id(common_ancestor)); + } + + let sorted_diffs = self.sorted_diffs.as_mut().unwrap(); + sorted_diffs.get_mut(0).unwrap().1.parents = None; + self.sorted_diffs = Some(topo_sort_diff_references(sorted_diffs)?); + // println!("===PerspectiveDiffSunc.build_diffs(): Got sorted diffs: {:#?}", self.sorted_diffs); + + self.build_graph()?; + self.print_graph_debug(); + + let fn_end = get_now()?.time(); + debug!( + "===Workspace.build_diffs() - Profiling: Took: {} to complete build_diffs() function", + (fn_end - fn_start).num_milliseconds() + ); + + Ok(()) + } + + fn terminate_with_null_node( + &mut self, + current_hash: Hash, + side: SearchSide, + searches: &mut BTreeMap, + ) -> SocialContextResult<()> { + let search_clone = searches.clone(); + let other = search_clone + .get(&other_side(&side)) + .ok_or(SocialContextError::InternalError("search side not found"))?; + let search = searches + .get_mut(&side) + .ok_or(SocialContextError::InternalError("search side not found"))?; + + if !search.found_ancestors.borrow().contains(&NULL_NODE()) { + search.found_ancestors.get_mut().push(NULL_NODE()); + }; + if !other.found_ancestors.borrow().contains(&NULL_NODE()) { + let other_mut = searches + .get_mut(&other_side(&side)) + .ok_or(SocialContextError::InternalError("search side not found"))?; + other_mut.found_ancestors.get_mut().push(NULL_NODE()); + }; + if self.diffs.get(&NULL_NODE()).is_none() { + let current_diff = PerspectiveDiffEntryReference::new(NULL_NODE(), None); + self.diffs.insert(NULL_NODE(), current_diff.clone()); + }; + + let mut set = if let Some(nodes_back_links) = self.back_links.get(&NULL_NODE()) { + let mut nodes_back_links = nodes_back_links.clone(); + if let Some(other_last) = other.found_ancestors.borrow().last().clone() { + if other_last != &NULL_NODE() { + nodes_back_links.insert(other_last.clone()); + } + } + nodes_back_links.clone() + } else { + let mut set = BTreeSet::new(); + if let Some(other_last) = other.found_ancestors.borrow().last().clone() { + if other_last != &NULL_NODE() { + set.insert(other_last.clone()); + } + } + set + }; + if current_hash != NULL_NODE() { + set.insert(current_hash); + }; + self.back_links.insert(NULL_NODE(), set); + Ok(()) + } + + pub fn collect_until_common_ancestor( + &mut self, + theirs: Hash, + ours: Hash, + ) -> SocialContextResult { + //debug!("===Workspace.collect_until_common_ancestor(): Function start"); + let fn_start = get_now()?.time(); + + let mut common_ancestor: Option = None; + + let mut searches = btreemap! { + SearchSide::Theirs => BfsSearch::new(theirs), + SearchSide::Ours => BfsSearch::new(ours), + }; + + while common_ancestor.is_none() { + // println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2: {:#?}", searches.get(&SearchSide::Theirs).unwrap().bfs_branches.borrow()); + // println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2: {:#?}", searches.get(&SearchSide::Ours).unwrap().bfs_branches.borrow()); + // do the same BFS for theirs_branches and ours_branches.. + for side in vec![SearchSide::Theirs, SearchSide::Ours] { + println!("Checking side: {:#?}", side); + let search_clone = searches.clone(); + let other = search_clone.get(&other_side(&side)).ok_or( + SocialContextError::InternalError("other search side not found"), + )?; + let search = searches + .get_mut(&side) + .ok_or(SocialContextError::InternalError("search side not found"))?; + let branches = search.bfs_branches.get_mut(); + branches.dedup(); + + for branch_index in 0..branches.len() { + println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.1"); + let current_hash = branches[branch_index].clone(); + println!( + "Checking current hash: {:#?}", + hash_to_node_id(current_hash.clone()) + ); + + let already_visited = search.found_ancestors.borrow().contains(¤t_hash); + let seen_on_other_side = other.found_ancestors.borrow().contains(¤t_hash) + || other.bfs_branches.borrow().contains(¤t_hash); + + if already_visited { + println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.2 ALREADY VISITED"); + // We've seen this diff on this side, so we are at the end of a branch. + // Just ignore this hash and close the branch. + branches.remove(branch_index); + break; + } + + if seen_on_other_side { + println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.2 SEEN ON OTHER SIDE"); + + //Add the diff to both searches if it is not there + if !search.found_ancestors.borrow().contains(¤t_hash) { + search.found_ancestors.get_mut().push(current_hash.clone()); + }; + if !other.found_ancestors.borrow().contains(¤t_hash) { + searches + .get_mut(&other_side(&side)) + .ok_or(SocialContextError::InternalError( + "other search side not found", + ))? + .found_ancestors + .get_mut() + .push(current_hash.clone()); + }; + if self.diffs.get(¤t_hash).is_none() && current_hash != NULL_NODE() { + let current_diff = + Self::get_p_diff_reference::(current_hash.clone())?; + self.diffs + .insert(current_hash.clone(), current_diff.clone()); + }; + // current hash is already in, so it must be our common ancestor! + common_ancestor = Some(current_hash); + break; + } + + //println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.3"); + search.found_ancestors.get_mut().push(current_hash.clone()); + + if current_hash == NULL_NODE() { + branches.remove(branch_index); + search.reached_end = true; + if common_ancestor.is_none() && other.reached_end == true { + common_ancestor = Some(NULL_NODE()); + self.terminate_with_null_node(current_hash, side, &mut searches)?; + }; + + break; + } + + //TODO; this should have caching builtin, since on some iterations we will get the same P reference multiple times + let current_diff = + Self::get_p_diff_reference::(current_hash.clone())?; + self.diffs + .insert(current_hash.clone(), current_diff.clone()); + + match ¤t_diff.parents { + None => { + // We arrived at a leaf/orphan (no parents). + // So we can close this branch and potentially continue + // with other unprocessed branches, if they exist. + println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.4, no more parents"); + branches.remove(branch_index); + //If there are no more branches and we have truly reached the end + search.reached_end = true; + //NOTE: this if block is the code that breaks the test_latest_join tests, with it removed the tests pass, but test three null parents fails + if common_ancestor.is_none() && other.reached_end == true { + common_ancestor = Some(NULL_NODE()); + self.terminate_with_null_node(current_hash, side, &mut searches)?; + }; + // We have to break out of loop to avoid having branch_index run out of bounds + break; + } + Some(parents) => { + // println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.4, more parents: {:#?}", parents); + for parent_index in 0..parents.len() { + println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.5, more parents after filter"); + let parent = parents[parent_index].clone(); + if let Some(links) = self.back_links.get_mut(&parent) { + links.insert(current_hash.clone()); + } else { + let mut set = BTreeSet::new(); + set.insert(current_hash.clone()); + self.back_links.insert(parent.clone(), set); + } + // The first parent is taken as the successor for the current branch. + // If there are multiple parents (i.e. merge commit), we create a new branch.. + if parent_index == 0 { + println!("Adding new parent to existing branch index"); + let _ = std::mem::replace( + &mut branches[branch_index], + parent.clone(), + ); + } else { + let already_visited = + search.found_ancestors.borrow().contains(&parent) + || other.bfs_branches.borrow().contains(&parent); + let seen_on_other_side = + other.found_ancestors.borrow().contains(&parent); + if !already_visited && !seen_on_other_side { + println!("===Workspace.collect_until_common_ancestor(): Adding a new branch"); + branches.push(parent.clone()) + } + } + } + } + }; + + //println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 2.7"); + } + } + } + + let fn_end = get_now()?.time(); + let ms_spent = (fn_end - fn_start).num_milliseconds(); + if ms_spent > 1000 { + debug!("===Workspace.collect_until_common_ancestor() - Profiling: Took: {} to complete collect_until_common_ancestor() function", ms_spent); + } + + if common_ancestor.is_none() { + return Err(SocialContextError::NoCommonAncestorFound); + }; + + // println!("===Workspace.collect_until_common_ancestor(): collect_until_common_ancestor 3: {:#?} and common ancestor is: {:#?}", searches, hash_to_node_id(common_ancestor.clone().unwrap())); + + Ok(common_ancestor.unwrap()) + } + + // pub fn topo_sort_graph(&mut self) -> SocialContextResult<()> { + // debug!("===Workspace.topo_sort_graph(): Function start"); + // let fn_start = get_now()?.time(); + + // let entry_vec = self.entry_map + // .clone() + // .into_iter() + // .collect::>(); + + // let mut dot = Vec::::new(); + + // dot.push("digraph {".to_string()); + // for entry in entry_vec.iter() { + // dot.push(format!("{}", entry.0.clone())); + // if let Some(parents) = &entry.1.parents { + // for p in parents.iter() { + // dot.push(format!("{} -> {}", entry.0, p)); + // } + // } + // } + // dot.push("}".to_string()); + + // println!("{}", dot.join("\n")); + + // self.sorted_diffs = Some(topo_sort_diff_references(&entry_vec)?); + + // let fn_end = get_now()?.time(); + // debug!("===Workspace.topo_sort_graph() - Profiling: Took: {} to complete topo_sort_graph() function", (fn_end - fn_start).num_milliseconds()); + // Ok(()) + // } + + pub fn build_graph(&mut self) -> SocialContextResult<()> { + debug!("===Workspace.build_graph(): Function start"); + let fn_start = get_now()?.time(); + + match self.sorted_diffs.clone() { + None => Err(SocialContextError::InternalError( + "Need to 1. collect diffs and then 2. sort them before building the graph", + )), + Some(sorted_diffs) => { + //Add root node + if self.get_node_index(&NULL_NODE()).is_none() { + self.add_node(None, NULL_NODE()); + }; + + for diff in sorted_diffs { + if diff.0 != NULL_NODE() { + if diff.1.parents.is_some() { + let mut parents = vec![]; + for parent in diff.1.parents.as_ref().unwrap() { + let parent = self.get_node_index(&parent).ok_or( + SocialContextError::InternalError("Did not find parent"), + )?; + parents.push(parent.clone()); + } + self.add_node(Some(parents), diff.0.clone()); + } else { + self.add_node(Some(vec![NodeIndex::from(0)]), diff.0.clone()); + } + } + } + + let fn_end = get_now()?.time(); + debug!("===Workspace.build_graph() - Profiling: Took: {} to complete build_graph() function", (fn_end - fn_start).num_milliseconds()); + + Ok(()) + } + } + } + + pub fn get_p_diff_reference( + address: Hash, + ) -> SocialContextResult { + Retriever::get(address) + } + + fn get_snapshot( + address: PerspectiveDiffEntryReference, + ) -> SocialContextResult> { + debug!("===Workspace.get_snapshot(): Function start"); + let fn_start = get_now()?.time(); + + // let input = GetLinksInputBuilder::try_new( + // hash_entry(address)?, + // LinkTypes::Snapshot + // ) + // .unwrap() + // .tag_prefix(LinkTag::new("snapshot")) + // .build(); + let mut snapshot_links = get_links(hash_entry(address)?, LinkTypes::Snapshot, Some(LinkTag::new("snapshot")))?; + + if snapshot_links.len() > 0 { + let snapshot = get( + snapshot_links + .remove(0) + .target + .into_entry_hash() + .expect("Could not get entry hash"), + GetOptions::latest(), + )? + .ok_or(SocialContextError::InternalError( + "Workspace::get_snapshot: Could not find entry while populating search", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + + let fn_end = get_now()?.time(); + debug!("===Workspace.get_snapshot() - Profiling: Took: {} to complete get_snapshot() function", (fn_end - fn_start).num_milliseconds()); + + Ok(Some(snapshot)) + } else { + let fn_end = get_now()?.time(); + debug!("===Workspace.get_snapshot() - Profiling: Took: {} to complete get_snapshot() function", (fn_end - fn_start).num_milliseconds()); + + Ok(None) + } + } + + fn add_node(&mut self, parents: Option>>, diff: Hash) -> NodeIndex { + let index = self.graph.add_node(diff.clone()); + self.undirected_graph.add_node(diff.clone()); + self.node_index_map.insert(diff, index); + if parents.is_some() { + for parent in parents.unwrap() { + self.graph.add_edge(index, parent, ()); + self.undirected_graph.add_edge(index, parent, ()); + } + } + index + } + + pub fn get_node_index(&self, node: &Hash) -> Option<&NodeIndex> { + self.node_index_map.get(node) + } + + // pub fn get_paths( + // &self, + // child: &Hash, + // ancestor: &Hash, + // ) -> SocialContextResult>> { + // debug!("===Workspace.get_paths(): Function start"); + // let fn_start = get_now()?.time(); + + // let child_node = self.get_node_index(child).expect("Could not get child node index"); + // let ancestor_node = self.get_node_index(ancestor).expect("Could not get ancestor node index"); + // let paths = all_simple_paths::, _>(&self.graph, *child_node, *ancestor_node, 0, None) + // .collect::>(); + + // let fn_end = get_now()?.time(); + // debug!("===Workspace.get_paths() - Profiling: Took: {} to complete get_paths() function", (fn_end - fn_start).num_milliseconds()); + + // Ok(paths) + // } + + pub fn _find_common_ancestor( + &self, + root: NodeIndex, + second: NodeIndex, + ) -> Option { + let imm = simple_fast(&self.undirected_graph, root); + let imm = imm.dominators(second); + let mut index: Option = None; + match imm { + Some(imm_iter) => { + for dom in imm_iter { + match index { + Some(current_index) => { + if current_index.index() > dom.index() { + index = Some(dom) + } + } + None => index = Some(dom), + }; + } + } + None => {} + }; + index + } + + pub fn squashed_diff( + &self, + ) -> SocialContextResult { + debug!("===Workspace.squashed_diff(): Function start"); + let fn_start = get_now()?.time(); + + let mut out = PerspectiveDiff { + additions: vec![], + removals: vec![], + }; + for (_key, value) in self.entry_map.iter() { + if value.diff == NULL_NODE() { + continue; + } + let diff_entry = Retriever::get::(value.diff.clone())?; + out.additions.append(&mut diff_entry.additions.clone()); + out.removals.append(&mut diff_entry.removals.clone()); + } + + let fn_end = get_now()?.time(); + debug!("===Workspace.squashed_diff() - Profiling: Took: {} to complete squashed_diff() function", (fn_end - fn_start).num_milliseconds()); + + Ok(out) + } + + // pub fn squashed_fast_forward_from(&self, base: Hash) -> SocialContextResult { + // match &self.sorted_diffs { + // None => Err(SocialContextError::InternalError("Need to sort first for this fast-forward optimzed squash")), + // Some(sorted_diffs) => { + // let mut base_found = false; + // let mut out = PerspectiveDiff { + // additions: vec![], + // removals: vec![], + // }; + // for i in 0..sorted_diffs.len() { + // let current = &sorted_diffs[i]; + // if !base_found { + // if current.0 == base { + // base_found = true; + // } + // } else { + // let diff_entry = get(current.1.diff.clone(), GetOptions::latest())? + // .ok_or(SocialContextError::InternalError( + // "Could not find diff entry for given diff entry reference", + // ))? + // .entry() + // .to_app_option::()? + // .ok_or(SocialContextError::InternalError( + // "Expected element to contain app entry data", + // ))?; + // out.additions.append(&mut diff_entry.additions.clone()); + // out.removals.append(&mut diff_entry.removals.clone()); + // } + // } + // Ok(out) + // } + // } + // } + + pub fn print_graph_debug(&self) { + if cfg!(test) { + println!( + "Directed: {:?}\n", + Dot::with_config( + &self.graph.map( + |_node_index, node| { crate::retriever::hash_to_node_id(node.to_owned()) }, + |_edge_index, _edge| {} + ), + &[] + ) + ); + println!( + "Undirected: {:?}\n", + Dot::with_config( + &self.undirected_graph.map( + |_node_index, node| { crate::retriever::hash_to_node_id(node.to_owned()) }, + |_edge_index, _edge| {} + ), + &[] + ) + ); + } else { + debug!( + "Directed: {:?}\n", + Dot::with_config(&self.graph, &[Config::NodeIndexLabel]) + ); + debug!( + "Undirected: {:?}\n", + Dot::with_config(&self.undirected_graph, &[]) + ); + } + } + + pub fn all_ancestors(&self, child: &Hash) -> SocialContextResult> { + debug!("===Workspace.all_ancestors(): Function start"); + let fn_start = get_now()?.time(); + + let child_node = self + .get_node_index(child) + .expect("Could not get child node index"); + let mut ancestors = vec![]; + let mut visited = HashSet::new(); + let mut stack = vec![*child_node]; + while !stack.is_empty() { + let current = stack.pop().unwrap(); + if visited.contains(¤t) { + continue; + } + visited.insert(current); + let mut parents = self + .graph + .neighbors_directed(current, petgraph::Direction::Outgoing); + while let Some(parent) = parents.next() { + stack.push(parent); + } + ancestors.push(self.graph.node_weight(current).unwrap().to_owned()); + } + + let fn_end = get_now()?.time(); + debug!("===Workspace.all_ancestors() - Profiling: Took: {} to complete all_ancestors() function", (fn_end - fn_start).num_milliseconds()); + + Ok(ancestors) + } +} + +#[cfg(test)] +mod tests { + use super::NULL_NODE; + use crate::link_adapter::workspace::Workspace; + use crate::retriever::{node_id_hash, MockPerspectiveGraph, GLOBAL_MOCKED_GRAPH}; + use dot_structures; + + #[test] + fn test_collect_until_common_ancestor_forked() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + "digraph { + 0 [ label = \"0\" ] + 1 [ label = \"1\" ] + 2 [ label = \"2\" ] + 3 [ label = \"3\" ] + 4 [ label = \"4\" ] + 5 [ label = \"5\" ] + 6 [ label = \"6\" ] + 7 [ label = \"7\" ] + 8 [ label = \"8\" ] + 9 [ label = \"9\" ] + 10 [ label = \"10\" ] + 11 [ label = \"11\" ] + 12 [ label = \"12\" ] + 1 -> 0 [ label = \"()\" ] + 2 -> 1 [ label = \"()\" ] + 3 -> 2 [ label = \"()\" ] + 4 -> 3 [ label = \"()\" ] + 5 -> 4 [ label = \"()\" ] + 6 -> 5 [ label = \"()\" ] + 7 -> 1 [ label = \"()\" ] + 8 -> 7 [ label = \"()\" ] + 9 -> 8 [ label = \"()\" ] + 10 -> 9 [ label = \"()\" ] + 11 -> 10 [ label = \"()\" ] + 12 -> 11 [ label = \"()\" ] + }", + ) + .unwrap(); + } + update(); + + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + let node_12 = node_id_hash(&dot_structures::Id::Plain(String::from("12"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_12.clone(), node_6.clone()); + assert!(res.is_ok()); + + assert!(workspace.common_ancestors.len() == 1); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_1); + + assert_eq!(workspace.entry_map.len(), 12); + + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + let node_7 = node_id_hash(&dot_structures::Id::Plain(String::from("7"))); + let node_8 = node_id_hash(&dot_structures::Id::Plain(String::from("8"))); + let node_9 = node_id_hash(&dot_structures::Id::Plain(String::from("9"))); + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + let node_11 = node_id_hash(&dot_structures::Id::Plain(String::from("11"))); + + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + assert!(workspace.entry_map.get(&node_4).is_some()); + assert!(workspace.entry_map.get(&node_5).is_some()); + assert!(workspace.entry_map.get(&node_6).is_some()); + assert!(workspace.entry_map.get(&node_7).is_some()); + assert!(workspace.entry_map.get(&node_8).is_some()); + assert!(workspace.entry_map.get(&node_9).is_some()); + assert!(workspace.entry_map.get(&node_10).is_some()); + assert!(workspace.entry_map.get(&node_11).is_some()); + assert!(workspace.entry_map.get(&node_12).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_forward_to_merge_commit() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + "digraph { + 0 [ label = \"0\" ] + 1 [ label = \"1\" ] + 2 [ label = \"2\" ] + 3 [ label = \"3\" ] + 4 [ label = \"4\" ] + 5 [ label = \"5\" ] + 6 [ label = \"6\" ] + 7 [ label = \"7\" ] + 8 [ label = \"8\" ] + 9 [ label = \"9\" ] + 10 [ label = \"10\" ] + 11 [ label = \"11\" ] + 12 [ label = \"12\" ] + 13 [ label = \"12\" ] + + 1 -> 0 [ label = \"()\" ] + 2 -> 1 [ label = \"()\" ] + 3 -> 2 [ label = \"()\" ] + 4 -> 3 [ label = \"()\" ] + 5 -> 4 [ label = \"()\" ] + 6 -> 5 [ label = \"()\" ] + + 7 -> 1 [ label = \"()\" ] + 8 -> 7 [ label = \"()\" ] + 9 -> 8 [ label = \"()\" ] + 10 -> 9 [ label = \"()\" ] + 11 -> 10 [ label = \"()\" ] + + 12 -> 11 [ label = \"()\" ] + 12 -> 6 [ label = \"()\" ] + + 13 -> 12 [ label = \"()\" ] + + }", + ) + .unwrap(); + } + update(); + + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + let node_12 = node_id_hash(&dot_structures::Id::Plain(String::from("12"))); + let node_13 = node_id_hash(&dot_structures::Id::Plain(String::from("13"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_13.clone(), node_6.clone()); + assert!(res.is_ok()); + + assert!(workspace.common_ancestors.len() == 1); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_1); + assert_eq!(workspace.entry_map.len(), 13); + + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + let node_7 = node_id_hash(&dot_structures::Id::Plain(String::from("7"))); + let node_8 = node_id_hash(&dot_structures::Id::Plain(String::from("8"))); + let node_9 = node_id_hash(&dot_structures::Id::Plain(String::from("9"))); + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + let node_11 = node_id_hash(&dot_structures::Id::Plain(String::from("11"))); + + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + assert!(workspace.entry_map.get(&node_4).is_some()); + assert!(workspace.entry_map.get(&node_5).is_some()); + assert!(workspace.entry_map.get(&node_6).is_some()); + assert!(workspace.entry_map.get(&node_7).is_some()); + assert!(workspace.entry_map.get(&node_8).is_some()); + assert!(workspace.entry_map.get(&node_9).is_some()); + assert!(workspace.entry_map.get(&node_10).is_some()); + assert!(workspace.entry_map.get(&node_11).is_some()); + assert!(workspace.entry_map.get(&node_12).is_some()); + assert!(workspace.entry_map.get(&node_13).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_multi_fork() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + + 1 -> 0 [ label = "()" ] + 2 -> 1 [ label = "()" ] + + 3 -> 0 [ label = "()" ] + + 4 -> 0 [ label = "()" ] + 5 -> 4 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_0 = node_id_hash(&dot_structures::Id::Plain(String::from("0"))); + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + //let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + //let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_3.clone(), node_2.clone()); + assert!(res.is_ok()); + + assert!(workspace.common_ancestors.len() == 1); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_0); + assert_eq!(workspace.entry_map.len(), 4); + + assert!(workspace.entry_map.get(&node_0).is_some()); + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_fork_on_top_of_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 + 5 -> 4 + + 6 + 7 + 8 + 9 + 10 + + 7 -> 6 + 8 -> 7 + 9 -> 8 + 10 -> 9 + + 8 -> 0 + + }"#, + ) + .unwrap(); + } + update(); + + let node_0 = node_id_hash(&dot_structures::Id::Plain(String::from("0"))); + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + //let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + //let node_7 = node_id_hash(&dot_structures::Id::Plain(String::from("7"))); + let node_8 = node_id_hash(&dot_structures::Id::Plain(String::from("8"))); + let node_9 = node_id_hash(&dot_structures::Id::Plain(String::from("9"))); + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_5.clone(), node_10.clone()); + println!("Got result: {:#?}", res); + assert!(res.is_ok()); + + assert!(workspace.common_ancestors.len() == 2); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_0); + assert_eq!(workspace.common_ancestors.last().unwrap(), &NULL_NODE()); + assert_eq!(workspace.entry_map.len(), 12); + + assert!(workspace.entry_map.get(&node_0).is_some()); + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + assert!(workspace.entry_map.get(&node_4).is_some()); + assert!(workspace.entry_map.get(&node_5).is_some()); + //assert!(workspace.entry_map.get(&node_7).is_some()); + assert!(workspace.entry_map.get(&node_8).is_some()); + assert!(workspace.entry_map.get(&node_9).is_some()); + assert!(workspace.entry_map.get(&node_10).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_unconnected_fork() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + + 1 -> 0 + 2 -> 1 + 3 -> 2 + 4 -> 3 + 5 -> 4 + + 6 + 7 + 8 + 9 + 10 + + 7 -> 6 + 8 -> 7 + 9 -> 8 + 10 -> 9 + }"#, + ) + .unwrap(); + } + update(); + + let node_0 = node_id_hash(&dot_structures::Id::Plain(String::from("0"))); + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + let node_7 = node_id_hash(&dot_structures::Id::Plain(String::from("7"))); + let node_8 = node_id_hash(&dot_structures::Id::Plain(String::from("8"))); + let node_9 = node_id_hash(&dot_structures::Id::Plain(String::from("9"))); + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_5.clone(), node_10.clone()); + println!("Got result: {:#?}", res); + assert!(res.is_ok()); + + assert!(workspace.common_ancestors.len() == 1); + assert_eq!(workspace.common_ancestors.first().unwrap(), &NULL_NODE()); + assert_eq!(workspace.entry_map.len(), 12); + + assert!(workspace.entry_map.get(&NULL_NODE()).is_some()); + assert!(workspace.entry_map.get(&node_0).is_some()); + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + assert!(workspace.entry_map.get(&node_4).is_some()); + assert!(workspace.entry_map.get(&node_5).is_some()); + assert!(workspace.entry_map.get(&node_6).is_some()); + assert!(workspace.entry_map.get(&node_7).is_some()); + assert!(workspace.entry_map.get(&node_8).is_some()); + assert!(workspace.entry_map.get(&node_9).is_some()); + assert!(workspace.entry_map.get(&node_10).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_ff_to_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + + 1 -> 0 + 2 -> 0 + 3 -> 1 + 3 -> 2 + + }"#, + ) + .unwrap(); + } + update(); + + let node_0 = node_id_hash(&dot_structures::Id::Plain(String::from("0"))); + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_1.clone(), node_3.clone()); + println!("Got result: {:#?}", res); + assert!(res.is_ok()); + + println!("common ancestors: {:?}", workspace.common_ancestors); + assert_eq!(workspace.common_ancestors.len(), 2); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_1); + assert_eq!(workspace.common_ancestors.last().unwrap(), &node_0); + assert_eq!(workspace.entry_map.len(), 4); + + assert!(workspace.entry_map.get(&node_0).is_some()); + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_complex_merge() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 1 -> 0 [ label = "()" ] + 2 -> 0 [ label = "()" ] + 3 -> 0 [ label = "()" ] + 4 -> 2 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 6 -> 5 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_0 = node_id_hash(&dot_structures::Id::Plain(String::from("0"))); + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_2 = node_id_hash(&dot_structures::Id::Plain(String::from("2"))); + let node_3 = node_id_hash(&dot_structures::Id::Plain(String::from("3"))); + let node_4 = node_id_hash(&dot_structures::Id::Plain(String::from("4"))); + let node_5 = node_id_hash(&dot_structures::Id::Plain(String::from("5"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_1.clone(), node_6.clone()); + println!("Got result: {:#?}", res); + assert!(res.is_ok()); + + println!("common ancestors: {:?}", workspace.common_ancestors); + assert_eq!(workspace.common_ancestors.len(), 1); + assert_eq!(workspace.common_ancestors.last().unwrap(), &node_0); + assert_eq!(workspace.entry_map.len(), 7); + + assert!(workspace.entry_map.get(&node_0).is_some()); + assert!(workspace.entry_map.get(&node_1).is_some()); + assert!(workspace.entry_map.get(&node_2).is_some()); + assert!(workspace.entry_map.get(&node_3).is_some()); + assert!(workspace.entry_map.get(&node_4).is_some()); + assert!(workspace.entry_map.get(&node_5).is_some()); + assert!(workspace.entry_map.get(&node_6).is_some()); + } + + #[test] + fn test_collect_until_common_ancestor_complex_merge_implicit_zero() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 4 -> 2 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 6 -> 5 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_1 = node_id_hash(&dot_structures::Id::Plain(String::from("1"))); + let node_6 = node_id_hash(&dot_structures::Id::Plain(String::from("6"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_1.clone(), node_6.clone()); + println!("Got result: {:#?}", res); + assert!(res.is_ok()); + assert_eq!(workspace.common_ancestors.len(), 2); + assert_eq!(workspace.common_ancestors.last().unwrap(), &NULL_NODE()); + } + + #[test] + fn real_world_graph() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::from_dot( + r#"digraph { + 0 [ label = "0" ] + 1 [ label = "1" ] + 2 [ label = "2" ] + 3 [ label = "3" ] + 4 [ label = "4" ] + 5 [ label = "5" ] + 6 [ label = "6" ] + 7 [ label = "7" ] + 8 [ label = "8" ] + 9 [ label = "9" ] + 10 [ label = "10" ] + 11 [ label = "11" ] + 12 [ label = "12" ] + 13 [ label = "13" ] + 14 [ label = "14" ] + 15 [ label = "15" ] + 16 [ label = "16" ] + 1 -> 0 [ label = "()" ] + 2 -> 1 [ label = "()" ] + 3 -> 2 [ label = "()" ] + 4 -> 3 [ label = "()" ] + 5 -> 4 [ label = "()" ] + 6 -> 5 [ label = "()" ] + 7 -> 6 [ label = "()" ] + 8 -> 7 [ label = "()" ] + 9 -> 8 [ label = "()" ] + 10 -> 9 [ label = "()" ] + 11 -> 1 [ label = "()" ] + 12 -> 2 [ label = "()" ] + 12 -> 11 [ label = "()" ] + 13 -> 3 [ label = "()" ] + 13 -> 12 [ label = "()" ] + 14 -> 6 [ label = "()" ] + 14 -> 13 [ label = "()" ] + 15 -> 7 [ label = "()" ] + 15 -> 14 [ label = "()" ] + 16 -> 8 [ label = "()" ] + 16 -> 15 [ label = "()" ] + }"#, + ) + .unwrap(); + } + update(); + + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + let node_16 = node_id_hash(&dot_structures::Id::Plain(String::from("16"))); + let node_8 = node_id_hash(&dot_structures::Id::Plain(String::from("8"))); + + let mut workspace = Workspace::new(); + let res = workspace.build_diffs::(node_16.clone(), node_10.clone()); + assert!(res.is_ok()); + assert_eq!(workspace.common_ancestors.len(), 6); + assert_eq!(workspace.common_ancestors.first().unwrap(), &node_8); + println!("Got result: {:#?}", res); + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever.rs new file mode 100644 index 000000000..e1b404571 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever.rs @@ -0,0 +1,35 @@ +use crate::Hash; +use crate::errors::SocialContextResult; +use hdk::prelude::*; +use chrono::{DateTime, Utc}; + +pub mod holochain; +pub mod mock; + +pub use holochain::HolochainRetreiver; +pub use mock::*; +use perspective_diff_sync_integrity::{LocalHashReference, HashReference}; + +pub trait PerspectiveDiffRetreiver { + fn get(hash: Hash) -> SocialContextResult + where + T: TryFrom; + + fn get_with_timestamp(hash: Hash) -> SocialContextResult<(T, DateTime)> + where + T: TryFrom; + + fn create_entry(entry: I) -> SocialContextResult + where + ScopedEntryDefIndex: for<'a> TryFrom<&'a I, Error = E2>, + EntryVisibility: for<'a> From<&'a I>, + Entry: TryFrom, + WasmError: From, + WasmError: From; + fn current_revision() -> SocialContextResult>; + fn latest_revision() -> SocialContextResult>; + fn update_current_revision(hash: Hash, timestamp: DateTime) -> SocialContextResult<()>; + fn update_latest_revision(hash: Hash, timestamp: DateTime) -> SocialContextResult<()>; +} + + diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs new file mode 100644 index 000000000..c97a7f3bd --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/holochain.rs @@ -0,0 +1,199 @@ +use std::str::FromStr; + +use chrono::{DateTime, NaiveDateTime, Utc}; +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + Anchor, EntryTypes, HashReference, LinkTypes, LocalHashReference, +}; + +use super::PerspectiveDiffRetreiver; +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::utils::dedup; +use crate::Hash; + +pub struct HolochainRetreiver; + +impl PerspectiveDiffRetreiver for HolochainRetreiver { + fn get(hash: Hash) -> SocialContextResult + where + T: TryFrom, + { + get(hash, GetOptions::latest())? + .ok_or(SocialContextError::InternalError( + "HolochainRetreiver: Could not find entry", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + )) + } + + fn get_with_timestamp(hash: Hash) -> SocialContextResult<(T, DateTime)> + where + T: TryFrom, + { + let element = get(hash, GetOptions::latest())?; + let element = element.ok_or(SocialContextError::InternalError( + "HolochainRetreiver: Could not find entry", + ))?; + let entry = element.entry(); + let timestamp = element.action().timestamp().0 as u64; + let duration = std::time::Duration::from_micros(timestamp); + let timestamp = DateTime::::from_utc( + NaiveDateTime::from_timestamp(duration.as_secs() as i64, duration.subsec_nanos()), + Utc, + ); + let entry = entry + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + Ok((entry, timestamp)) + } + + fn create_entry(entry: I) -> SocialContextResult + where + ScopedEntryDefIndex: for<'a> TryFrom<&'a I, Error = E2>, + EntryVisibility: for<'a> From<&'a I>, + Entry: TryFrom, + WasmError: From, + WasmError: From, + { + create_entry::(entry).map_err(|e| SocialContextError::Wasm(e)) + } + + fn current_revision() -> SocialContextResult> { + let query = query( + QueryFilter::new() + .entry_type(EntryType::App(AppEntryDef { + entry_index: 4.into(), + zome_index: 0.into(), + visibility: EntryVisibility::Private, + })) + .include_entries(true) + .descending(), + ); + + let revision = match query { + Ok(records) => { + if records.len() == 0 { + None + } else { + let record = records[0].clone(); + let entry = record + .entry + .to_app_option::() + .unwrap() + .unwrap(); + Some(entry) + } + } + Err(e) => { + debug!("PerspectiveDiffSync.current_revision(): Error when getting current revision: {:?}", e); + None + } + }; + Ok(revision) + } + + fn latest_revision() -> SocialContextResult> { + let latest_root_entry = get_latest_revision_anchor(); + let latest_root_entry_hash = hash_entry(latest_root_entry.clone())?; + // let input = GetLinksInputBuilder::try_new( + // latest_root_entry_hash, + // LinkTypes::Index + // ) + // .unwrap() + // .build(); + let mut latest_revision_links = get_links(latest_root_entry_hash, LinkTypes::Index, None)?; + + latest_revision_links.sort_by(|link_a, link_b| { + let link_a_str = std::str::from_utf8(&link_a.tag.0).unwrap(); + let link_b_str = std::str::from_utf8(&link_b.tag.0).unwrap(); + let link_a = DateTime::::from_str(link_a_str).unwrap(); + let link_b = DateTime::::from_str(link_b_str).unwrap(); + link_a.cmp(&link_b) + }); + + let mut latest_hash_revisions = latest_revision_links + .into_iter() + .map(|link| { + let hash = + link.target + .into_action_hash() + .ok_or(SocialContextError::InternalError( + "Could not convert link target to hash", + ))?; + let timestamp = std::str::from_utf8(&link.tag.0) + .map_err(|_| SocialContextError::InternalError("Could not tag to string"))?; + + let timestamp = DateTime::::from_str(timestamp).map_err(|_| { + SocialContextError::InternalError("Could not convert string to timestamp") + })?; + Ok(HashReference { hash, timestamp }) + }) + .collect::>>()?; + + Ok(latest_hash_revisions.pop()) + } + + fn update_current_revision(hash: Hash, timestamp: DateTime) -> SocialContextResult<()> { + let hash_ref = LocalHashReference { hash, timestamp }; + create_entry(EntryTypes::LocalHashReference(hash_ref.clone()))?; + Ok(()) + } + + fn update_latest_revision(hash: Hash, timestamp: DateTime) -> SocialContextResult<()> { + let latest_root_entry = get_latest_revision_anchor(); + let _latest_root_entry_action = + self::create_entry(EntryTypes::Anchor(latest_root_entry.clone()))?; + + create_link( + hash_entry(latest_root_entry)?, + hash, + LinkTypes::Index, + LinkTag::new(timestamp.to_string()), + )?; + + Ok(()) + } +} + +fn get_latest_revision_anchor() -> Anchor { + Anchor("latest_revision".to_string()) +} + +pub fn get_active_agent_anchor() -> Anchor { + Anchor("active_agent".to_string()) +} + +pub fn get_active_agents() -> SocialContextResult> { + // let input = GetLinksInputBuilder::try_new( + // hash_entry(get_active_agent_anchor())?, + // LinkTypes::Index + // ) + // .unwrap() + // .tag_prefix(LinkTag::new("active_agent")) + // .build(); + let recent_agents = get_links(hash_entry(get_active_agent_anchor())?, LinkTypes::Index, Some(LinkTag::new("active_agent")))?; + + let recent_agents = recent_agents + .into_iter() + .map(|val| { + let entry: EntryHash = val.target.try_into().unwrap(); + AgentPubKey::from(entry) + }) + .collect(); + + //Dedup the agents + let mut recent_agents = dedup(&recent_agents); + //Remove ourself from the agents + let me = agent_info()?.agent_latest_pubkey; + let index = recent_agents.iter().position(|x| *x == me); + if let Some(index) = index { + recent_agents.remove(index); + }; + + Ok(recent_agents) +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/mock.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/mock.rs new file mode 100644 index 000000000..ca83bcc29 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/retriever/mock.rs @@ -0,0 +1,530 @@ +use chrono::{DateTime, Utc}; +use dot_structures; +use graphviz_rust; +use hdk::prelude::*; +use perspective_diff_sync_integrity::{ + HashReference, LinkExpression, LocalHashReference, PerspectiveDiff, + PerspectiveDiffEntryReference, +}; +use sha2::{Digest, Sha256}; +use std::collections::BTreeMap; +use std::sync::Mutex; + +use super::PerspectiveDiffRetreiver; +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::link_adapter::workspace::NULL_NODE; +use crate::utils::create_link_expression; +use crate::Hash; + +#[derive(Debug)] +pub struct MockPerspectiveGraph { + pub graph_map: BTreeMap, +} + +impl PerspectiveDiffRetreiver for MockPerspectiveGraph { + fn get(hash: Hash) -> SocialContextResult + where + T: TryFrom, + { + let value = &GLOBAL_MOCKED_GRAPH + .lock() + .expect("Could not get lock on graph map") + .graph_map + .get(&hash) + .expect("Could not find entry in map") + .to_owned(); + Ok(T::try_from(value.to_owned())?) + } + + fn get_with_timestamp(hash: Hash) -> SocialContextResult<(T, DateTime)> + where + T: TryFrom, + { + let value = &GLOBAL_MOCKED_GRAPH + .lock() + .expect("Could not get lock on graph map") + .graph_map + .get(&hash) + .expect("Could not find entry in map") + .to_owned(); + Ok((T::try_from(value.to_owned())?, Utc::now())) + } + + fn create_entry(entry: I) -> SocialContextResult + where + ScopedEntryDefIndex: for<'a> TryFrom<&'a I, Error = E2>, + EntryVisibility: for<'a> From<&'a I>, + Entry: TryFrom, + WasmError: From, + WasmError: From, + { + let mut object_store = GLOBAL_MOCKED_GRAPH + .lock() + .expect("Could not get lock on OBJECT_STORE"); + + let entry: Entry = entry.try_into().expect("Could not get Entry"); + let sb = match entry { + Entry::App(bytes) => bytes, + _ => panic!("Should not get any entry except app"), + }; + let bytes = sb.bytes(); + + let mut hasher = Sha256::new(); + hasher.update(bytes); + let mut result = hasher.finalize().as_slice().to_owned(); + result.append(&mut vec![0xdb, 0xdb, 0xdb, 0xdb]); + + let hash = ActionHash::from_raw_36(result); + object_store.graph_map.insert(hash.clone(), sb.0); + Ok(hash) + } + + fn current_revision() -> SocialContextResult> { + let revision = CURRENT_REVISION + .lock() + .expect("Could not get lock on CURRENT_REVISION"); + Ok(revision.clone().map(|val| LocalHashReference { + hash: val, + timestamp: Utc::now(), + })) + } + + fn latest_revision() -> SocialContextResult> { + let revision = LATEST_REVISION + .lock() + .expect("Could not get lock on LATEST_REVISION"); + Ok(revision.clone().map(|val| HashReference { + hash: val, + timestamp: Utc::now(), + })) + } + + fn update_current_revision(hash: Hash, _timestamp: DateTime) -> SocialContextResult<()> { + let mut revision = CURRENT_REVISION + .lock() + .expect("Could not get lock on CURRENT_REVISION"); + *revision = Some(hash); + Ok(()) + } + + fn update_latest_revision(hash: Hash, _timestamp: DateTime) -> SocialContextResult<()> { + let mut revision = LATEST_REVISION + .lock() + .expect("Could not get lock on LATEST_REVISION"); + *revision = Some(hash); + Ok(()) + } +} + +pub struct GraphInput { + pub nodes: u8, + pub associations: Vec, +} + +pub struct Associations { + pub node_source: u8, + pub node_targets: Vec, +} + +#[allow(dead_code)] +pub fn node_id_hash(id: &dot_structures::Id) -> Hash { + let mut string = match id { + dot_structures::Id::Html(s) => s, + dot_structures::Id::Escaped(s) => s, + dot_structures::Id::Plain(s) => s, + dot_structures::Id::Anonymous(s) => s, + } + .clone(); + if string.len() > 36 { + let _ = string.split_off(36); + } else { + while string.len() < 36 { + string.push_str("x"); + } + } + ActionHash::from_raw_36(string.into_bytes()) +} + +#[allow(dead_code)] +pub fn hash_to_node_id(hash: ActionHash) -> String { + if hash == NULL_NODE() { + return String::from("NULL_NODE"); + }; + let hash_bytes = hash.get_raw_36(); + + match std::str::from_utf8(hash_bytes) { + Ok(node_id_string) => { + let string_split = node_id_string + .split("x") + .collect::>() + .first() + .unwrap() + .to_owned(); + string_split.to_string() + } + Err(_err) => hash.to_string(), + } +} + +// #[allow(dead_code)] +// pub fn string_to_node_id(mut hash: String) -> String { +// if hash == NULL_NODE().to_string() { +// return String::from("NULL_NODE") +// }; +// if hash.len() > 36 { +// let _ = hash.split_off(36); +// }; +// let hash = ActionHash::from_raw_36(hash.into_bytes()); +// let hash = hash.get_raw_36(); +// let node_id_string = std::str::from_utf8(hash).expect("could not get string from hash array"); +// let string_split = node_id_string.split("x").collect::>().first().unwrap().to_owned(); +// string_split.to_string() +// } + +#[allow(dead_code)] +pub fn create_node_id_link_expression(node_id: u32) -> LinkExpression { + let node_id = node_id.to_string(); + let node_id = dot_structures::Id::Plain(node_id); + let node = &node_id_hash(&node_id).to_string(); + create_link_expression(node, node) +} + +#[allow(dead_code)] +pub fn create_node_id_vec(range_start: u32, range_end: u32) -> Vec { + let mut out = vec![]; + for n in range_start..=range_end { + out.push(create_node_id_link_expression(n)); + } + out +} + +// #[allow(dead_code)] +// pub fn link_expression_to_node_id(links: &mut Vec) { +// links.iter_mut().for_each(|link| { +// if link.data.source.is_some() { +// link.data.source = Some(string_to_node_id(link.data.source.clone().unwrap())); +// } +// if link.data.target.is_some() { +// link.data.target = Some(string_to_node_id(link.data.target.clone().unwrap())); +// } +// }) +// } + +#[allow(dead_code)] +fn unwrap_vertex(v: dot_structures::Vertex) -> Option { + match v { + dot_structures::Vertex::N(id) => Some(id), + _ => None, + } +} + +#[allow(dead_code)] +fn unwrap_edge( + edge: dot_structures::Edge, +) -> Option<(dot_structures::NodeId, dot_structures::NodeId)> { + match edge.ty { + dot_structures::EdgeTy::Pair(a, b) => { + let au = unwrap_vertex(a); + let ab = unwrap_vertex(b); + if au.is_some() && ab.is_some() { + Some((au.unwrap(), ab.unwrap())) + } else { + None + } + } + _ => None, + } +} + +impl MockPerspectiveGraph { + pub fn new(graph_input: GraphInput) -> MockPerspectiveGraph { + let mut graph = MockPerspectiveGraph { + graph_map: BTreeMap::new(), + }; + + for n in 0..graph_input.nodes { + let mocked_hash = ActionHash::from_raw_36(vec![n; 36]); + let associations: Vec<&Associations> = graph_input + .associations + .iter() + .filter(|association| association.node_source == n) + .collect(); + let parents = if associations.len() > 0 { + let mut temp = vec![]; + for association in associations.clone() { + for targets in association.node_targets.clone() { + temp.push(ActionHash::from_raw_36(vec![targets; 36])) + } + } + Some(temp) + } else { + None + }; + let mocked_diff = PerspectiveDiffEntryReference::new(mocked_hash.clone(), parents); + let sb = mocked_diff + .try_into() + .expect("Could not create serialized bytes for mocked_diff"); + graph.graph_map.insert(mocked_hash, sb); + } + + graph + } + + #[allow(dead_code)] + pub fn from_dot(source: &str) -> SocialContextResult { + match graphviz_rust::parse(source) + .map_err(|_| SocialContextError::InternalError("Can't parse as DOT string"))? + { + dot_structures::Graph::Graph { .. } => Err(SocialContextError::InternalError( + "Can't work with undirected DOT graphs", + )), + dot_structures::Graph::DiGraph { stmts, .. } => { + let mut graph = MockPerspectiveGraph { + graph_map: BTreeMap::new(), + }; + + let mut hashes = Vec::::new(); + let mut parents: BTreeMap> = BTreeMap::new(); + + for s in stmts.iter() { + match s { + dot_structures::Stmt::Node(node) => hashes.push(node_id_hash(&node.id.0)), + dot_structures::Stmt::Edge(edge) => { + if let Some(e) = unwrap_edge(edge.clone()) { + let id_0 = e.0 .0; + let id_1 = e.1 .0; + let child = node_id_hash(&id_0); + let parent = node_id_hash(&id_1); + //println!("Edge: {} -> {}", id_0, id_1); + //println!("Edge: {} -> {}", child, parent); + match parents.remove(&child) { + None => parents.insert(child, vec![parent]), + Some(mut prev) => { + prev.push(parent); + parents.insert(child, prev) + } + }; + } + } + _ => {} + } + } + + for ref_hash in hashes.iter() { + //Create a mock diff + let diff = PerspectiveDiff { + additions: vec![create_link_expression( + &ref_hash.to_string(), + &ref_hash.to_string(), + )], + removals: vec![], + }; + + //Create a mock hash for the fake diff + let ref_sb = SerializedBytes::try_from(diff.clone())?; + let mut hasher = Sha256::new(); + hasher.update(ref_sb.bytes()); + let mut result = hasher.finalize().as_slice().to_owned(); + result.append(&mut vec![0xdb, 0xdb, 0xdb, 0xdb]); + let diff_hash = ActionHash::from_raw_36(result); + + //Create the diff reference + let diff_ref = PerspectiveDiffEntryReference::new( + diff_hash.clone(), + parents.get(ref_hash).as_ref().cloned().cloned(), + ); + //Insert the diff reference into the map + let diff_ref_sb = diff_ref + .try_into() + .expect("Could not create serialized bytes for mocked_diff"); + graph.graph_map.insert(ref_hash.clone(), diff_ref_sb); + + //Insert the diff into the map + graph.graph_map.insert(diff_hash, ref_sb); + } + + Ok(graph) + } + } + } +} + +lazy_static! { + pub static ref GLOBAL_MOCKED_GRAPH: Mutex = + Mutex::new(MockPerspectiveGraph::new(GraphInput { + nodes: 1, + associations: vec![] + })); + pub static ref CURRENT_REVISION: Mutex> = Mutex::new(None); + pub static ref LATEST_REVISION: Mutex> = Mutex::new(None); +} + +#[test] +fn can_create_graph() { + let test = MockPerspectiveGraph::new(GraphInput { + nodes: 6, + associations: vec![ + Associations { + node_source: 1, + node_targets: vec![0], + }, + Associations { + node_source: 2, + node_targets: vec![0], + }, + Associations { + node_source: 3, + node_targets: vec![1], + }, + Associations { + node_source: 4, + node_targets: vec![2], + }, + Associations { + node_source: 5, + node_targets: vec![3, 4], + }, + ], + }); + assert_eq!(test.graph_map.keys().len(), 6); + println!("Got graph: {:#?}", test.graph_map); +} + +#[test] +fn can_create_graph_from_dot() { + let dot = "digraph { + 0 [ label = \"0\" ] + 1 [ label = \"1\" ] + 2 [ label = \"2\" ] + 3 [ label = \"3\" ] + 4 [ label = \"4\" ] + 5 [ label = \"5\" ] + 6 [ label = \"6\" ] + 7 [ label = \"7\" ] + 8 [ label = \"8\" ] + 9 [ label = \"9\" ] + 10 [ label = \"10\" ] + 11 [ label = \"11\" ] + 12 [ label = \"12\" ] + 1 -> 0 [ label = \"()\" ] + 2 -> 1 [ label = \"()\" ] + 3 -> 2 [ label = \"()\" ] + 4 -> 3 [ label = \"()\" ] + 5 -> 4 [ label = \"()\" ] + 6 -> 5 [ label = \"()\" ] + 7 -> 1 [ label = \"()\" ] + 8 -> 7 [ label = \"()\" ] + 9 -> 8 [ label = \"()\" ] + 10 -> 9 [ label = \"()\" ] + 11 -> 10 [ label = \"()\" ] + 12 -> 11 [ label = \"()\" ] + 12 -> 10 [ label = \"()\" ] + }"; + + let graph = MockPerspectiveGraph::from_dot(dot).expect("from_dot not to return error"); + //26 since there is a diffref & diff for each node + assert_eq!(graph.graph_map.keys().len(), 26); + + let node_12 = node_id_hash(&dot_structures::Id::Plain(String::from("12"))); + let node_11 = node_id_hash(&dot_structures::Id::Plain(String::from("11"))); + let node_10 = node_id_hash(&dot_structures::Id::Plain(String::from("10"))); + + let diff_12 = graph.graph_map.get(&node_12).unwrap(); + let diff_12 = PerspectiveDiffEntryReference::try_from(diff_12.to_owned()).unwrap(); + assert_eq!(diff_12.parents, Some(vec![node_11, node_10])); +} + +#[test] +fn example_test() { + use crate::link_adapter::workspace::Workspace; + + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + *graph = MockPerspectiveGraph::new(GraphInput { + nodes: 6, + associations: vec![ + Associations { + node_source: 1, + node_targets: vec![0], + }, + Associations { + node_source: 2, + node_targets: vec![0], + }, + Associations { + node_source: 3, + node_targets: vec![1], + }, + Associations { + node_source: 4, + node_targets: vec![2], + }, + Associations { + node_source: 5, + node_targets: vec![3, 4], + }, + ], + }); + } + update(); + + let mut workspace = Workspace::new(); + let res = workspace.collect_until_common_ancestor::( + ActionHash::from_raw_36(vec![5; 36]), + ActionHash::from_raw_36(vec![4; 36]), + ); + println!("Got result: {:#?}", res); +} + +#[test] +fn can_get_and_create_mocked_holochain_objects() { + fn update() { + let mut graph = GLOBAL_MOCKED_GRAPH.lock().unwrap(); + let dot = "digraph { + 0 [ label = \"0\" ] + 1 [ label = \"1\" ] + 2 [ label = \"2\" ] + 3 [ label = \"3\" ] + 4 [ label = \"4\" ] + 5 [ label = \"5\" ] + 6 [ label = \"6\" ] + 7 [ label = \"7\" ] + 8 [ label = \"8\" ] + 9 [ label = \"9\" ] + 10 [ label = \"10\" ] + 11 [ label = \"11\" ] + 12 [ label = \"12\" ] + 1 -> 0 [ label = \"()\" ] + 2 -> 1 [ label = \"()\" ] + 3 -> 2 [ label = \"()\" ] + 4 -> 3 [ label = \"()\" ] + 5 -> 4 [ label = \"()\" ] + 6 -> 5 [ label = \"()\" ] + 7 -> 1 [ label = \"()\" ] + 8 -> 7 [ label = \"()\" ] + 9 -> 8 [ label = \"()\" ] + 10 -> 9 [ label = \"()\" ] + 11 -> 10 [ label = \"()\" ] + 12 -> 11 [ label = \"()\" ] + 12 -> 10 [ label = \"()\" ] + }"; + *graph = MockPerspectiveGraph::from_dot(dot).expect("Could not create graph"); + } + update(); + let diff_ref = MockPerspectiveGraph::get::(node_id_hash( + &dot_structures::Id::Plain(String::from("1")), + )); + assert!(diff_ref.is_ok()); + + use perspective_diff_sync_integrity::{ + EntryTypes, PerspectiveDiff, PerspectiveDiffEntryReference, + }; + let commit = MockPerspectiveGraph::create_entry(EntryTypes::PerspectiveDiff(PerspectiveDiff { + additions: vec![], + removals: vec![], + })); + assert!(commit.is_ok()); + + let get_commit = MockPerspectiveGraph::get::(commit.unwrap()); + assert!(get_commit.is_ok()); +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/mod.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/mod.rs new file mode 100644 index 000000000..9da170613 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod signal; +pub(crate) mod status; diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs new file mode 100644 index 000000000..3fa833b36 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/signal.rs @@ -0,0 +1,30 @@ +use hdk::prelude::*; +use perspective_diff_sync_integrity::PerspectiveExpression; + +use super::status::get_dids_agent_key; +use crate::retriever::holochain::get_active_agents; +use crate::{errors::SocialContextResult, inputs::SignalData}; + +pub fn send_signal(signal_data: SignalData) -> SocialContextResult { + let agent = get_dids_agent_key(signal_data.remote_agent_did.clone())?; + // debug!( + // "PerspectiveDiffSync.send_signal() to DID: {:?} / HC: {:?}", + // signal_data.remote_agent_did, agent + // ); + match agent { + Some(agent) => remote_signal(signal_data.payload.clone().get_sb()?, vec![agent])?, + None => { + debug!("PerspectiveDiffSync.send_signal(): Could not send signal since we could not get the agents pub key from did"); + } + } + Ok(signal_data.payload) +} + +pub fn send_broadcast(data: PerspectiveExpression) -> SocialContextResult { + let active_agents = get_active_agents()?; + + //debug!("PerspectiveDiffSync.send_broadcast() to: {:?}", active_agents); + remote_signal(data.clone().get_sb()?, active_agents)?; + + Ok(data) +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/status.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/status.rs new file mode 100644 index 000000000..eba6ab08b --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/telepresence/status.rs @@ -0,0 +1,232 @@ +use hdk::prelude::*; + +use perspective_diff_sync_integrity::{ + Anchor, EntryTypes, LinkTypes, OnlineAgent, OnlineAgentAndAction, PerspectiveExpression, +}; + +use crate::errors::{SocialContextError, SocialContextResult}; +use crate::retriever::holochain::get_active_agents; + +pub fn set_online_status(status: PerspectiveExpression) -> SocialContextResult<()> { + let entry = EntryTypes::PrivateOnlineStatus(status); + create_entry(&entry)?; + Ok(()) +} + +pub fn get_online_status() -> SocialContextResult { + //Try and get my did + let my_did = get_my_did()?.ok_or(SocialContextError::NoDidFound)?; + + //Try and get my online status + let query = query( + QueryFilter::new() + .entry_type(EntryType::App(AppEntryDef { + entry_index: 7.into(), + zome_index: 0.into(), + visibility: EntryVisibility::Private, + })) + .include_entries(true) + .descending(), + ); + + let status = match query { + Ok(records) => { + if records.len() == 0 { + None + } else { + let record = records[0].clone(); + let entry = record + .entry + .to_app_option::() + .unwrap() + .unwrap(); + Some((entry, record.action_address().to_owned())) + } + } + Err(e) => { + debug!( + "PerspectiveDiffSync.current_revision(): Error when getting current revision: {:?}", + e + ); + None + } + }; + + let online_status = OnlineAgentAndAction { + did: my_did, + status: status.clone().map(|status| status.0), + status_action: status.map(|status| status.1), + }; + Ok(online_status) +} + +pub fn create_did_pub_key_link(did: String) -> SocialContextResult<()> { + debug!("PerspectiveDiffSync.create_did_pub_key_link({:?})", did); + let agent_key = agent_info()?.agent_latest_pubkey; + debug!("PerspectiveDiffSync.create_did_pub_key_link() agent_key: {:?}", agent_key); + //let input = GetLinksInputBuilder::try_new(agent_key.clone(), LinkTypes::DidLink).unwrap().build(); + let did_links = get_links(agent_key.clone(), LinkTypes::DidLink, None)?; + debug!("PerspectiveDiffSync.create_did_pub_key_link() did_links: {:?}", did_links); + if did_links.len() == 0 { + + let entry = EntryTypes::Anchor(Anchor(did)); + let _did_entry = create_entry(&entry)?; + let did_entry_hash = hash_entry(entry)?; + create_link( + agent_key.clone(), + did_entry_hash.clone(), + LinkTypes::DidLink, + LinkTag::new("did_link"), + )?; + create_link( + did_entry_hash, + agent_key, + LinkTypes::DidLink, + LinkTag::new("did_link"), + )?; + } + Ok(()) +} + +pub fn get_my_did() -> SocialContextResult> { + // let input = GetLinksInputBuilder::try_new( + // agent_info()?.agent_latest_pubkey, + // LinkTypes::DidLink + // ) + // .unwrap() + // .build(); + let mut did_links = get_links(agent_info()?.agent_latest_pubkey, LinkTypes::DidLink, None)?; + if did_links.len() > 0 { + let did = get( + did_links + .remove(0) + .target + .into_entry_hash() + .expect("Could not get entry_hash"), + GetOptions::latest(), + )? + .ok_or(SocialContextError::InternalError( + "Could not find did entry for given did entry reference", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + Ok(Some(did.0)) + } else { + Ok(None) + } +} + +pub fn get_dids_agent_key(did: String) -> SocialContextResult> { + let did_entry = Anchor(did); + let did_entry_hash = hash_entry(EntryTypes::Anchor(did_entry.clone()))?; + // let input = GetLinksInputBuilder::try_new( + // did_entry_hash, + // LinkTypes::DidLink + // ) + // .unwrap() + // .build(); + let did_links = get_links(did_entry_hash, LinkTypes::DidLink, None)?; + debug!("PerspectiveDiffSync.get_dids_agent_key() did_links: {:?}", did_links); + if did_links.len() > 0 { + let entry: EntryHash = did_links[0].target.clone().try_into().unwrap(); + Ok(Some(AgentPubKey::from(entry))) + } else { + Ok(None) + } +} + +pub fn get_agents_did_key(agent: AgentPubKey) -> SocialContextResult> { + // let input = GetLinksInputBuilder::try_new( + // agent, + // LinkTypes::DidLink + // ) + // .unwrap() + // .build(); + let mut did_links = get_links(agent, LinkTypes::DidLink, None)?; + if did_links.len() > 0 { + let did = get( + did_links + .remove(0) + .target + .into_entry_hash() + .expect("Could not get entry_hash"), + GetOptions::latest(), + )? + .ok_or(SocialContextError::InternalError( + "Could not find did entry for given did entry reference", + ))? + .entry() + .to_app_option::()? + .ok_or(SocialContextError::InternalError( + "Expected element to contain app entry data", + ))?; + Ok(Some(did.0)) + } else { + Ok(None) + } +} + +pub fn get_others() -> SocialContextResult> { + let active_agents = get_active_agents()?; + let mut others = Vec::new(); + for active_agent in active_agents { + let did_key = get_agents_did_key(active_agent)?; + if did_key.is_some() { + others.push(did_key.unwrap()); + } + } + Ok(others) +} + +pub fn get_online_agents() -> SocialContextResult> { + let active_agents = get_active_agents()?; + let mut online_agents = Vec::new(); + for active_agent in active_agents { + let online_agent_status = get_agents_status(active_agent); + if online_agent_status.is_some() { + online_agents.push(online_agent_status.unwrap()); + } + } + Ok(online_agents) +} + +pub fn get_agents_status(agent: AgentPubKey) -> Option { + let online_agent_status = call_remote( + agent.clone(), + "perspective_diff_sync", + "get_online_status".into(), + None, + {}, + ); + if online_agent_status.is_ok() { + let online_agent_response = online_agent_status.unwrap(); + match online_agent_response { + ZomeCallResponse::Ok(online_agent) => { + let online_agent = online_agent + .decode::() + .expect("Could not decode online agent"); + Some(OnlineAgent { + did: online_agent.did, + status: online_agent.status, + }) + } + ZomeCallResponse::Unauthorized(..) => { + debug!("Unauthorized to call agent {}", agent.clone()); + None + } + ZomeCallResponse::NetworkError(..) => { + debug!("Agent {} is offline", agent.clone()); + None + } + ZomeCallResponse::CountersigningSession(_) => { + debug!("Agent {} had countersigning session error", agent); + None + } + } + } else { + None + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/utils.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/utils.rs new file mode 100644 index 000000000..6f5ccf2c5 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync/src/utils.rs @@ -0,0 +1,46 @@ +use chrono::{DateTime, NaiveDateTime, Utc}; +use hdk::prelude::*; +use std::hash::Hash; + +use crate::errors::SocialContextResult; +use perspective_diff_sync_integrity::{ExpressionProof, LinkExpression, Triple}; + +pub fn get_now() -> SocialContextResult> { + match sys_time() { + Ok(time) => { + let now = time.as_seconds_and_nanos(); + Ok(DateTime::::from_utc( + NaiveDateTime::from_timestamp(now.0, now.1), + Utc, + )) + } + Err(_err) => Ok(Utc::now()), + } +} + +pub fn dedup(vs: &Vec) -> Vec { + let hs = vs.iter().cloned().collect::>(); + + hs.into_iter().collect() +} + +pub(crate) fn err(reason: &str) -> WasmError { + wasm_error!(WasmErrorInner::Host(String::from(reason))) +} + +#[allow(dead_code)] +pub fn create_link_expression(source: &str, target: &str) -> LinkExpression { + LinkExpression { + author: String::from("Test author"), + data: Triple { + source: Some(String::from(source)), + predicate: None, + target: Some(String::from(target)), + }, + timestamp: DateTime::::from_utc(NaiveDateTime::from_timestamp(0, 0), Utc), + proof: ExpressionProof { + signature: String::from("sig"), + key: String::from("key"), + }, + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/Cargo.toml b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/Cargo.toml new file mode 100644 index 000000000..c40215be7 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/Cargo.toml @@ -0,0 +1,18 @@ +[package] +authors = ["josh@junto.foundation"] +edition = "2018" +name = "perspective_diff_sync_integrity" +version = "0.0.1" + +[lib] +crate-type = ["cdylib", "rlib"] +name = "perspective_diff_sync_integrity" + +[dependencies] +derive_more = "0" +serde = "1" +chrono = { version = "0.4.22", default-features = false, features = ["clock", "std", "oldtime", "serde"] } + +holo_hash = "0.2.2" +hdi = "0.3.2" +hdk = "0.2.2" \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/impls.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/impls.rs new file mode 100644 index 000000000..f6b11084e --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/impls.rs @@ -0,0 +1,68 @@ +use std::cmp::Ordering; + +use hdk::prelude::*; + +use crate::{ + Anchor, HashBroadcast, OnlineAgent, PerspectiveDiff, PerspectiveDiffEntryReference, + PerspectiveExpression, +}; + +impl PerspectiveDiff { + pub fn get_sb(self) -> ExternResult { + self.try_into() + .map_err(|error| wasm_error!(WasmErrorInner::Host(String::from(error)))) + } +} + +impl Anchor { + pub fn get_sb(self) -> ExternResult { + self.try_into() + .map_err(|error| wasm_error!(WasmErrorInner::Host(String::from(error)))) + } +} + +impl PerspectiveExpression { + pub fn get_sb(self) -> ExternResult { + self.try_into() + .map_err(|error| wasm_error!(WasmErrorInner::Host(String::from(error)))) + } +} + +impl OnlineAgent { + pub fn get_sb(self) -> ExternResult { + self.try_into() + .map_err(|error| wasm_error!(WasmErrorInner::Host(String::from(error)))) + } +} + +impl HashBroadcast { + pub fn get_sb(self) -> ExternResult { + self.try_into() + .map_err(|error| wasm_error!(WasmErrorInner::Host(String::from(error)))) + } +} + +impl PerspectiveDiffEntryReference { + pub fn new( + diff: HoloHash, + parents: Option>>, + ) -> Self { + Self { + diff: diff, + parents: parents, + diffs_since_snapshot: 0, + } + } +} + +impl PartialOrd for PerspectiveDiffEntryReference { + fn partial_cmp(&self, other: &Self) -> Option { + self.diff.partial_cmp(&other.diff) + } +} + +impl Ord for PerspectiveDiffEntryReference { + fn cmp(&self, other: &Self) -> Ordering { + self.diff.cmp(&other.diff) + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/lib.rs b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/lib.rs new file mode 100644 index 000000000..f565e84cd --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/perspective_diff_sync_integrity/src/lib.rs @@ -0,0 +1,169 @@ +use chrono::{DateTime, Utc}; +use hdi::prelude::*; + +pub mod impls; + +#[derive( + Serialize, Deserialize, Clone, SerializedBytes, Debug, PartialEq, Eq, Hash, Ord, PartialOrd, +)] +pub struct ExpressionProof { + pub signature: String, + pub key: String, +} + +#[derive( + Serialize, Deserialize, Clone, SerializedBytes, Debug, PartialEq, Eq, Hash, Ord, PartialOrd, +)] +pub struct Triple { + pub source: Option, + pub target: Option, + pub predicate: Option, +} + +#[derive(Clone, Deserialize, Serialize, Debug, PartialEq, Eq, Hash, Ord, PartialOrd)] +pub struct LinkExpression { + pub author: String, + pub data: Triple, + pub timestamp: DateTime, + pub proof: ExpressionProof, +} + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes, Default)] +pub struct PerspectiveDiff { + pub additions: Vec, + pub removals: Vec, +} + +///The reference that is sent to other agents, denotes the position in the DAG as well as the data at that position +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct HashBroadcast { + pub reference_hash: HoloHash, + pub reference: PerspectiveDiffEntryReference, + pub diff: PerspectiveDiff, + pub broadcast_author: String, +} + +impl PerspectiveDiff { + pub fn new() -> Self { + Self { + additions: Vec::new(), + removals: Vec::new(), + } + } + pub fn total_diff_number(&self) -> usize { + self.additions.len() + self.removals.len() + } +} + +app_entry!(PerspectiveDiff); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct Snapshot { + pub diff_chunks: Vec>, + pub included_diffs: Vec>, +} + +app_entry!(Snapshot); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes, PartialEq, Eq, Hash)] +pub struct PerspectiveDiffEntryReference { + pub diff: HoloHash, + pub parents: Option>>, + pub diffs_since_snapshot: usize, +} + +app_entry!(PerspectiveDiffEntryReference); + +#[derive(Clone, Serialize, Deserialize, Debug)] +pub struct Perspective { + pub links: Vec, +} + +//TODO: this can likely be removed and instead just reference the PerspectiveDiffEntry/MergeEntry directly? +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct HashReference { + pub hash: HoloHash, + pub timestamp: DateTime, +} + +app_entry!(HashReference); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct LocalHashReference { + pub hash: HoloHash, + pub timestamp: DateTime, +} + +app_entry!(LocalHashReference); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct LocalTimestampReference { + pub timestamp_reference: DateTime, +} + +app_entry!(LocalTimestampReference); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct Anchor(pub String); + +app_entry!(Anchor); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct PerspectiveExpression { + pub author: String, + pub data: Perspective, + pub timestamp: DateTime, + pub proof: ExpressionProof, +} + +app_entry!(PerspectiveExpression); + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct OnlineAgent { + pub did: String, + pub status: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, SerializedBytes)] +pub struct OnlineAgentAndAction { + pub did: String, + pub status: Option, + pub status_action: Option, +} + +#[derive(Debug, Serialize, Deserialize, SerializedBytes)] +pub struct PullResult { + pub diff: PerspectiveDiff, + pub current_revision: Option>, +} + +#[hdk_entry_defs] +#[unit_enum(UnitEntryTypes)] +pub enum EntryTypes { + #[entry_def(visibility = "public")] + PerspectiveDiff(PerspectiveDiff), + #[entry_def(visibility = "public")] + Snapshot(Snapshot), + #[entry_def(visibility = "public")] + HashReference(HashReference), + #[entry_def(visibility = "public")] + PerspectiveDiffEntryReference(PerspectiveDiffEntryReference), + #[entry_def(visibility = "private")] + LocalHashReference(LocalHashReference), + #[entry_def(visibility = "private")] + LocalTimestampReference(LocalTimestampReference), + #[entry_def(visibility = "public")] + Anchor(Anchor), + #[entry_def(visibility = "private")] + PrivateOnlineStatus(PerspectiveExpression), +} + +#[hdk_link_types] +pub enum LinkTypes { + Snapshot, + ActiveAgent, + HashRef, + TimePath, + Index, + DidLink, +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/common.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/common.ts new file mode 100644 index 000000000..d93421ff6 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/common.ts @@ -0,0 +1,6 @@ +import path from "path"; +import {Dna} from "@holochain/tryorama"; + +const dnas: Dna[] = [{ source: {path: path.join("../../workdir/perspective-diff-sync.dna")} }]; + +export { dnas }; \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/download-hc-binaries.sh b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/download-hc-binaries.sh new file mode 100755 index 000000000..e78e813ec --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/download-hc-binaries.sh @@ -0,0 +1,14 @@ +#!/bin/bash +[ ! -d "./temp/binary" ] && mkdir -p "./temp/binary" + +if [ ! -f "./hc" ]; then + wget https://github.com/perspect3vism/ad4m/releases/download/binary-deps-0.1.0/hc-linux-0.1.0 + mv hc-linux-0.1.0 ./hc + chmod +x ./hc +fi + +if [ ! -f "./holochain" ]; then + wget https://github.com/perspect3vism/ad4m/releases/download/binary-deps-0.1.0/holochain-linux-0.1.0 + mv holochain-linux-0.1.0 ./holochain + chmod +x ./holochain +fi \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/index.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/index.ts new file mode 100644 index 000000000..1544f6e95 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/index.ts @@ -0,0 +1,49 @@ +import { render, renderMerges } from "./render"; +import { unSyncFetch, mergeFetch, mergeFetchDeep } from "./pull"; +import { testRevisionUpdates } from "./revisions"; +import { stressTest } from "./stress" +import { signals } from "./signals"; +import { testTelepresence } from "./telepresence"; + +import test from "tape-promise/tape.js"; + +test("unsynced fetch", async (t) => { + await unSyncFetch(t); +}) + +test("merge fetch", async (t) => { + await mergeFetch(t); +}) + +test("merge fetch deep", async (t) => { + await mergeFetchDeep(t); +}) + +//test("stress", async (t) => { +// await stressTest(t); +//}) + + +//test("complex merge", async (t) => { +// await complexMerge(t); +//}) + +test("test revision updates", async (t) => { + await testRevisionUpdates(t); +}) + +test("render", async (t) => { + await render(t) +}) + +test("render merges", async (t) => { + await renderMerges(t) +}) + +test("signals", async (t) => { + await signals(t) +}) + +test("telepresence", async (t) => { + await testTelepresence(t) +}) diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/package.json b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/package.json new file mode 100644 index 000000000..8c0170b0d --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/package.json @@ -0,0 +1,40 @@ +{ + "name": "perspective-diff-sync-tests", + "version": "0.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node index.ts", + "build-test": "cd ../../ && CARGO_TARGET_DIR=target cargo build --release --target wasm32-unknown-unknown --features test && hc dna pack workdir && cd zomes/tests && npm test", + "build": "cd ../../ && CARGO_TARGET_DIR=target cargo build --release --target wasm32-unknown-unknown --features test && hc dna pack workdir && cd zomes/tests", + "build-ci": "cd ../../ && CARGO_TARGET_DIR=target cargo build --release --target wasm32-unknown-unknown --features test && ./zomes/tests/hc dna pack workdir && cd zomes/tests", + "test-pull": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node pull.ts", + "test-render": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node render.ts", + "test-revisions": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node revisions.ts", + "test-signals": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node signals.ts", + "test-stress": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node stress.ts", + "test-telepresence": "PATH=$PATH:$(pwd) TRYORAMA_LOG_LEVEL=debug WASM_LOG=debug,wasmer_compiler_cranelift=error,holochain::conductor::manager=warn,holochain::core::workflow::publish_dht_ops_workflow::publish_query=warn,publish_dht_ops_workflow=error,kitsune_p2p_types::metrics=error,kitsune_p2p::gossip::sharded_gossip=error,wasm_trace=debug,app_validation_workflow=error RUST_BACKTRACE=1 node --loader ts-node/esm --experimental-specifier-resolution=node telepresence.ts" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@holochain/client": "0.16.1", + "@holochain/tryorama": "0.15.0", + "@perspect3vism/ad4m": "^0.2.12", + "@types/lodash": "^4.14.158", + "@types/node": "^18.0.0", + "blake2b": "^2.1.3", + "divide-bigint": "^1.0.4", + "faker": "5.5.3", + "lodash": "^4.17.19", + "tape-promise": "^4.0.0", + "ts-node": "^10.8.0", + "typescript": "^4.2.4" + }, + "devDependencies": { + "@types/faker": "^5.5.3", + "@types/tape-promise": "^4.0.1", + "tape": "^5.5.3" + }, + "type": "module" +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/pull.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/pull.ts new file mode 100644 index 000000000..8db065701 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/pull.ts @@ -0,0 +1,273 @@ +import { addAllAgentsToAllConductors, cleanAllConductors } from "@holochain/tryorama"; +import { call, sleep, generate_link_expression, createConductors, create_link_expression} from "./utils"; +import test from "tape-promise/tape.js"; + +// //@ts-ignore +// export async function unSyncFetch(t) { +// let installs = await createConductors(2); +// let aliceHapps = installs[0].agent_happ; +// let conductor1 = installs[0].conductor; +// let bobHapps = installs[1].agent_happ; +// let conductor2 = installs[1].conductor; +// await addAllAgentsToAllConductors([conductor1, conductor2]); + +// //Create did/pub key link for alice and bob +// await aliceHapps.cells[0].callZome({ +// zome_name: "perspective_diff_sync", +// fn_name: "create_did_pub_key_link", +// payload: "did:test:alice" +// }); +// await bobHapps.cells[0].callZome({ +// zome_name: "perspective_diff_sync", +// fn_name: "create_did_pub_key_link", +// payload: "did:test:bob" +// }); + +// let commit = await aliceHapps.cells[0].callZome({ +// zome_name: "perspective_diff_sync", +// fn_name: "commit", +// payload: {additions: [generate_link_expression("alice")], removals: []} +// }); +// console.warn("\ncommit", commit); + +// // need to for gossip to have commit be seen by bob +// await sleep(5000) + +// const pull_bob = await bobHapps.cells[0].callZome({ +// zome_name: "perspective_diff_sync", +// fn_name: "pull", +// payload: { hash: commit, is_scribe: false } +// }); +// //@ts-ignore +// t.equal(pull_bob.diff.additions.length, 1); + +// await conductor1.shutDown(); +// await conductor2.shutDown(); +// await cleanAllConductors(); +// }; + +//@ts-ignore +export async function mergeFetchDeep(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let aliceConductor = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let bobConductor = installs[1].conductor; + + //Create new commit whilst bob is not connected + let create = await create_link_expression(aliceHapps.cells[0], "alice"); + let create2 = await create_link_expression(aliceHapps.cells[0], "alice"); + let create3 = await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + + //Pull from bob and make sure he does not have the latest state + let pull_bob = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull" + }); + //@ts-ignore + t.isEqual(pull_bob.diff.additions.length, 0); + + //Bob to commit his data, and update the latest revision, causing a fork + let bob_create = await create_link_expression(bobHapps.cells[0], "bob"); + let bob_create2 = await create_link_expression(bobHapps.cells[0], "bob"); + let bob_create3 = await create_link_expression(bobHapps.cells[0], "bob"); + let bob_create4 = await create_link_expression(bobHapps.cells[0], "bob"); + await create_link_expression(bobHapps.cells[0], "bob"); + await create_link_expression(bobHapps.cells[0], "bob"); + await create_link_expression(bobHapps.cells[0], "bob"); + + let pull_bob2 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull" + }); + //@ts-ignore + t.isEqual(pull_bob2.diff.additions.length, 0); + + //Connect nodes togther + await addAllAgentsToAllConductors([aliceConductor, bobConductor]); + //note; running this test on some machines may require more than 200ms wait + await sleep(500) + + //Alice tries to merge + let merge_alice = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull" + }); + //@ts-ignore + t.isEqual(merge_alice.diff.additions.length, 7); + //@ts-ignore + t.isEqual(JSON.stringify(merge_alice.additions[0]), JSON.stringify(bob_create.data)); + + //note; running this test on some machines may require more than 200ms wait + await sleep(2000) + + let pull_bob3 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull" + }); + console.warn("bob pull3", pull_bob3); + //@ts-ignore + t.isEqual(pull_bob3.diff.additions.length, 7); + //@ts-ignore + console.log(pull_bob3.diff.additions[0].data); + //@ts-ignore + t.isEqual(JSON.stringify(pull_bob3.diff.additions[0]), JSON.stringify(create.data)); + //@ts-ignore + t.isEqual(JSON.stringify(pull_bob3.diff.additions[1]), JSON.stringify(create2.data)); + + //Shutdown alice conductor + await aliceConductor.shutDown(); + + //Have bob write three links + await create_link_expression(bobHapps.cells[0], "bob"); + await create_link_expression(bobHapps.cells[0], "bob"); + await create_link_expression(bobHapps.cells[0], "bob"); + + //shutdown bobs conductor + await bobConductor.shutDown(); + + //Have alice write three links + await aliceConductor.startUp(); + await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + await create_link_expression(aliceHapps.cells[0], "alice"); + + //start bobs conductor and pull to see if merge happens correctly + await bobConductor.startUp(); + let pull_bob4 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull" + }); + console.warn("bob pull4", pull_bob4); + //@ts-ignore + t.isEqual(pull_bob4.diff.additions.length, 3); + //@ts-ignore + console.log(pull_bob4.diff.additions[0].data); + //@ts-ignore + t.isEqual(JSON.stringify(pull_bob4.additions[0]), JSON.stringify(create.data)); + //@ts-ignore + t.isEqual(JSON.stringify(pull_bob4.additions[1]), JSON.stringify(create2.data)); + + await cleanAllConductors(); +} + +//@ts-ignore +export async function mergeFetch(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let aliceConductor = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let bobConductor = installs[1].conductor; + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + + //Create new commit whilst bob is not connected + let link_data = generate_link_expression("alice"); + console.log("Alice posting link data", link_data); + let commit = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [link_data], removals: []} + }); + //@ts-ignore + console.warn("\ncommit", commit.toString("base64")); + + await sleep(1000) + + let bob_pull_failed = false + try{ + // Pull from bob who is not connected to alice yet + // to show that this will fail (because `commit` could not be found) + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull", + payload: { hash: commit, is_scribe: false } + }); + } catch(e) { + bob_pull_failed = true + } + + t.assert(bob_pull_failed) + + + //Bob to commit his data, and update the latest revision, causing a fork + let bob_link_data = generate_link_expression("bob"); + console.log("Bob posting link data", bob_link_data); + let commit_bob = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [bob_link_data], removals: []} + }); + //@ts-ignore + console.warn("\ncommit_bob", commit_bob.toString("base64")); + + //Connect nodes togther + await addAllAgentsToAllConductors([aliceConductor, bobConductor]); + //note; running this test on some machines may require more than 200ms wait + await sleep(1000) + + //Alice tries to merge + let merge_alice = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull", + payload: { hash: commit_bob, is_scribe: true } + }); + //@ts-ignore + t.isEqual(merge_alice.diff.additions.length, 1); + //@ts-ignore + t.isEqual(JSON.stringify(merge_alice.diff.additions[0].data), JSON.stringify(bob_link_data.data)); + + const alice_merge_commit = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision", + }); + + //note; running this test on some machines may require more than 200ms wait + await sleep(2000) + + let pull_bob3 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "pull", + payload: { hash: alice_merge_commit, is_scribe: false } + }); + console.warn("bob pull3", pull_bob3); + //@ts-ignore + t.isEqual(pull_bob3.diff.additions.length, 1); + //@ts-ignore + console.log(pull_bob3.diff.additions[0].data); + //@ts-ignore + t.isEqual(JSON.stringify(pull_bob3.diff.additions[0].data), JSON.stringify(link_data.data)); + + await aliceConductor.shutDown(); + await bobConductor.shutDown(); +} + + +test("pull", async (t) => { + //t.plan(20) + try { + //await unSyncFetch(t); + await mergeFetch(t); + } catch(e) { + console.error("Pull test failed with error", e); + //@ts-ignore + t.fail(e) + } finally { + t.end() + process.exit(0) + } +}) diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/queue.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/queue.ts new file mode 100644 index 000000000..005dd13fe --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/queue.ts @@ -0,0 +1,82 @@ +class Queue { + #queue: T[]; + + constructor() { + this.#queue = []; + } + + enqueue(func: T) { + this.#queue.push(func); + } + + dequeue() { + return this.#queue.shift(); + } + + get size(): number { + return this.#queue.length; + } +} + +export class AsyncQueue { + #queue = new Queue<() => any>(); + #pendingCount = 0; + + private next() { + this.#pendingCount--; + this.startAnotherFunc(); + } + + private startAnotherFunc(): boolean { + if (this.#queue.size === 0) { + return false; + } + + if (this.#pendingCount === 0) { + const func = this.#queue.dequeue(); + + if (!func) { + return false; + } + + func(); + + return true; + } + + return false; + } + + async add(func: () => void) { + return new Promise((resolve, reject) => { + const job = async () => { + this.#pendingCount++; + + try { + const result = await func(); + resolve(result); + } catch(error) { + reject(error); + } + + this.next(); + } + + this.#queue.enqueue(job); + this.startAnotherFunc(); + }); + } + + async addAll(funcs: Array<() => void>) { + return Promise.all(funcs.map(async func => this.add(func))) + } + + get pendingCount(): number { + return this.#pendingCount; + } + + clear() { + this.#queue = new Queue<() => any>(); + this.#pendingCount = 0; + } +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/render.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/render.ts new file mode 100644 index 000000000..987309c93 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/render.ts @@ -0,0 +1,270 @@ +import { addAllAgentsToAllConductors, cleanAllConductors } from "@holochain/tryorama"; +import { call, sleep, generate_link_expression, createConductors} from "./utils"; +import test from "tape-promise/tape.js"; + +//NOTE; these tests are dependant on the SNAPSHOT_INTERVAL in lib.rs being set to 2 +//@ts-ignore +export async function render(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let conductor1 = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let conductor2 = installs[1].conductor; + await addAllAgentsToAllConductors([conductor1, conductor2]); + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + + console.log("RENDER 1") + let commit = await call(aliceHapps, "commit", { + additions: [generate_link_expression("alice1")], + removals: [] + }); + console.warn("\ncommit", commit); + + await call(aliceHapps, "update_current_revision", commit); + + let commit2 = await call(aliceHapps, "commit", { + additions: [generate_link_expression("alice2")], + removals: [] + }); + console.warn("\ncommit", commit2); + + console.log("RENDER 2") + + await call(aliceHapps, "update_current_revision", commit2); + + let alice_rendered = await call(aliceHapps, "render"); + //@ts-ignore + t.equal(alice_rendered.links.length, 2) + + await sleep(5000); + + console.log("RENDER 3") + + // Bob hasn't pulled yet, so render on Bob should fail + let firstRenderFailed = false + try { + let bob_render = await call(bobHapps, "render"); + } catch(e) { + firstRenderFailed = true + } + + t.assert(firstRenderFailed) + + await call(bobHapps, "pull", { hash: commit2, is_scribe: false }) + + console.log("Bob has pulled") + + let bob_render = await call(bobHapps, "render"); + + + console.log("RENDER 4") + console.warn("bob rendered with", bob_render); + //@ts-ignore + t.deepEqual(bob_render.links.length, 2); + + await call(bobHapps, "update_current_revision", commit2); + + let commit4 = await call(bobHapps, "commit", { + additions: [generate_link_expression("bob3")], + removals: [] + }); + console.warn("\ncommit", commit4); + + await call(bobHapps, "update_current_revision", commit4); + + + let commit5 = await call(bobHapps, "commit", { + additions: [generate_link_expression("bob4")], + removals: [] + }); + console.warn("\ncommit", commit5); + + await call(bobHapps, "update_current_revision", commit5); + + await sleep(1000); + + console.log("RENDER 5") + await call(aliceHapps, "pull", { hash: commit5, is_scribe: true }); + let alice_render = await call(aliceHapps, "render"); + console.warn("Alice rendered with", alice_render); + //@ts-ignore + t.deepEqual(alice_render.links.length, 4); + + await conductor1.shutDown(); + await conductor2.shutDown(); + await cleanAllConductors(); +}; + +//@ts-ignore +export async function renderMerges(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let conductor1 = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let conductor2 = installs[1].conductor; + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + + console.log("commit1"); + let commit = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("alice1")], removals: []} + }); + console.warn("\ncommit", commit); + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit + }); + + console.log("commit2"); + let commit2 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("alice2")], removals: []} + }); + console.warn("\ncommit", commit2); + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit2 + }); + + console.log("commit3"); + let commit3 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("bob1")], removals: []} + }); + console.warn("\ncommit", commit3); + + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit3 + }); + + console.log("commit4"); + let commit4 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("bob2")], removals: []} + }); + console.warn("\ncommit", commit4); + + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit4 + }); + + console.log("bob render"); + let bob_render = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "render" + }); + console.warn("bob rendered with", bob_render); + //@ts-ignore + t.isEqual(bob_render.links.length, 2); + + console.log("alice render"); + let alice_render = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "render" + }); + console.warn("Alice rendered with", alice_render); + //@ts-ignore + t.isEqual(alice_render.links.length, 2); + + await addAllAgentsToAllConductors([conductor1, conductor2]); + await sleep(500); + + //Test getting revision, should return bob's revision since that is the latest entry + + //Alice commit which will create a merge and another entry + console.log("commit5"); + let commit5 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("alice3")], removals: []} + }); + console.warn("\ncommit5", commit5); + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit5 + }); + + //Alice commit which should not create another snapshot + console.log("commit6"); + let commit6 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [generate_link_expression("alice4")], removals: []} + }); + console.warn("\ncommit6", commit6); + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "update_current_revision", + payload: commit6 + }); + await sleep(2000) + + console.log("bob pull"); + await call(bobHapps, "pull", { hash: commit6, is_scribe: true }) + + console.log("bob render"); + let bob_render2 = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "render" + }); + console.warn("bob rendered with", bob_render2); + //@ts-ignore + t.isEqual(bob_render2.links.length, 6); + + console.log("alice render"); + let alice_render2 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "render" + }); + console.warn("Alice rendered with", alice_render2); + //@ts-ignore + t.isEqual(alice_render2.links.length, 4); + + await conductor1.shutDown(); + await conductor2.shutDown(); + await cleanAllConductors(); +} + +test("render", async (t) => { + await render(t) + await renderMerges(t) + t.end() + process.exit(0); +}) \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/revisions.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/revisions.ts new file mode 100644 index 000000000..75b274839 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/revisions.ts @@ -0,0 +1,92 @@ +import { addAllAgentsToAllConductors, cleanAllConductors } from "@holochain/tryorama"; +import { sleep, createConductors, create_link_expression } from "./utils"; +import test from "tape-promise/tape.js"; + +//@ts-ignore +export async function testRevisionUpdates(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let aliceConductor = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let bobConductor = installs[1].conductor; + + await addAllAgentsToAllConductors([aliceConductor, bobConductor]); + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + + let current_revision = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision" + }); + console.warn("current_revision", current_revision); + + let commit = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [], removals: []} + }); + console.warn("\ncommit", commit); + + let current_revision2 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision" + }); + console.warn("current_revision2", current_revision2); + //@ts-ignore + t.isEqual(commit.toString(), current_revision2.toString()) + + await sleep(1000) + + //test bobs current revision is not updated + let bob_current_revision = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision" + }); + console.warn("bob_current_revision", bob_current_revision); + //@ts-ignore + t.isEqual(null, bob_current_revision); + + let commit2 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [], removals: []} + }); + //@ts-ignore + console.warn("\ncommit2", commit2); + + let current_revision3 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision" + }); + console.warn("current_revision3", current_revision3); + //@ts-ignore + t.isEqual(current_revision3.toString(), commit2.toString()); + + let current_revision4 = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "current_revision" + }); + console.warn("current_revision4", current_revision4); + //@ts-ignore + t.isEqual(commit2.toString(), current_revision4.toString()) + + await aliceConductor.shutDown(); + await bobConductor.shutDown(); + await cleanAllConductors(); +} + +test("test revision updates", async (t) => { + await testRevisionUpdates(t); + t.end() + process.exit(0) +}) \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/signals.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/signals.ts new file mode 100644 index 000000000..7bb262780 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/signals.ts @@ -0,0 +1,106 @@ +import { Scenario } from "@holochain/tryorama"; +import { sleep, generate_link_expression } from "./utils"; +import { dnas } from "./common"; +import test from "tape-promise/tape.js"; +import { resolve } from "path"; + +//@ts-ignore +export async function signals(t) { + const scenario = new Scenario(); + let aliceSignalCount = 0; + let bobSignalCount = 0; + + const aliceHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + }, + } + ); + const portAlice = await aliceHapps.conductor.attachAppInterface(); + const appWs = await aliceHapps.conductor.connectAppWs(portAlice); + appWs.on("signal", (signal) => { + console.log("Alice Received Signal:",signal) + aliceSignalCount += 1; + }); + const bobHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + } + } + ); + const portBob = await bobHapps.conductor.attachAppInterface(); + const appWsBob = await bobHapps.conductor.connectAppWs(portBob); + appWsBob.on("signal", (signal) => { + console.log("Bob Received Signal:",signal) + bobSignalCount += 1; + }) + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + + + await scenario.shareAllAgents(); + + //Sleep to give time for bob active agent link to arrive at alice + await sleep(2000) + + //Test case where subject object and predicate are given + let bob_link_data = generate_link_expression("bob"); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [bob_link_data], removals: []} + }); + + //Test case where subject object and predicate are given + let link_data = generate_link_expression("alice"); + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [link_data], removals: []} + }); + //Sleep to give time for signals to arrive + await sleep(1000) + + t.deepEqual(bobSignalCount, 1); + + await scenario.cleanUp(); +} + +test("signals", async (t) => { + await signals(t) + t.end() + process.exit(0) +}) \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/stress.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/stress.ts new file mode 100644 index 000000000..31765bcc0 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/stress.ts @@ -0,0 +1,355 @@ +import { AgentApp, addAllAgentsToAllConductors, cleanAllConductors, Conductor, Scenario } from "@holochain/tryorama"; +import { call, sleep, createConductors, create_link_expression, generate_link_expression} from "./utils"; +import ad4m, { DID, HolochainLanguageDelegate, LinkExpression, Perspective } from "@perspect3vism/ad4m" +import test from "tape-promise/tape.js"; +import { hrtime } from 'node:process'; +//@ts-ignore +import divide from 'divide-bigint' +import { AsyncQueue } from "./queue"; +import { resolve } from "path"; +import { dnas } from "./common"; +let createdLinks = new Map>() + +class PeerInfo { + currentRevision: Buffer | null = null; + lastSeen: Date = new Date(); +}; + +let aliceRevision: Buffer | null = null; +let bobRevision: Buffer | null = null; +let aliceDid = ""; +let bobDid = ""; + +async function createLinks(happ: AgentApp, agentName: string, count: number, queue?: AsyncQueue) { + if(!createdLinks.get(agentName)) createdLinks.set(agentName, []) + for(let i=0; i < count; i++) { + if (queue) { + await queue.add(async () => { + let { commitRaw, data } = await create_link_expression(happ.cells[0], agentName); + if (agentName === "alice") { + aliceRevision = commitRaw; + } else if (agentName === "bob") { + bobRevision = commitRaw; + } + createdLinks.get(agentName)!.push(data) + }).catch((e) => { + console.log("Error in create links queue", e); + }) + } else { + let { data } = await create_link_expression(happ.cells[0], agentName); + createdLinks.get(agentName)!.push(data) + } + } +} + +//@ts-ignore +export async function latestRevisionStress(t) { + let installs = await createConductors(2); + let aliceHapps = installs[0].agent_happ; + let aliceConductor = installs[0].conductor; + let bobHapps = installs[1].agent_happ; + let bobConductor = installs[1].conductor; + + await addAllAgentsToAllConductors([aliceConductor, bobConductor]); + + let link_data = generate_link_expression("alice"); + let commit = await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [link_data], removals: []} + }); + + for (let i = 0; i < 1000; i++) { + console.log("Latest update revision", i); + let now = performance.now(); + let create = await aliceHapps.cells[0].callZome({zome_name: "perspective_diff_sync", fn_name: "update_latest_revision", payload: commit}); + let after = performance.now(); + console.log(" Create execution took: ", after - now); + let fetch = await aliceHapps.cells[0].callZome({zome_name: "perspective_diff_sync", fn_name: "latest_revision"}); + let after2 = performance.now(); + console.log("Fetch execution took: ", after2 - after); + } +} + +async function gossip(peers: Map, me: DID, hcDna: HolochainLanguageDelegate) { + console.log("GOSSIP for ", me) + //@ts-ignore + await hcDna.call("DNA_NICK", "ZOME_NAME", "sync", null); + let lostPeers: DID[] = []; + + peers.forEach( (peerInfo, peer) => { + if (peerInfo.lastSeen.getTime() + 10000 < new Date().getTime()) { + lostPeers.push(peer); + } + }); + + for (const peer of lostPeers) { + peers.delete(peer); + } + + // flatten the map into an array of peers + let allPeers = Array.from(peers.keys()) + allPeers.push(me); + // Lexically sort the peers + allPeers.sort(); + + // If we are the first peer, we are the scribe + let is_scribe = (allPeers[0] == me); + + console.log("IS SCRIBE", is_scribe, me) + + // Get a deduped set of all peer's current revisions + let revisions = new Set(); + for(const peerInfo of peers.values()) { + if (peerInfo.currentRevision) revisions.add(peerInfo.currentRevision); + } + + console.log(` + ====== + GOSSIP + -- + me: ${me} + is scribe: ${is_scribe} + -- + ${Array.from(peers.entries()).map( ([peer, peerInfo]) => { + //@ts-ignore + return `${peer}: ${peerInfo.currentRevision.toString('base64')} ${peerInfo.lastSeen.toISOString()}\n` + })} + -- + revisions: ${Array.from(revisions).map( (hash) => { + //@ts-ignore + return hash.toString('base64') + })} + `); + + revisions.forEach( async (hash) => { + console.log("PULLING", hash, is_scribe, aliceRevision, bobRevision) + if(!hash) return + if (me === aliceDid) { + if (hash === aliceRevision) { + console.log("Alice skipping pull since we already sync'd on this gossip loop"); + return + } + } + if (me === bobDid) { + if (hash === bobRevision) { + console.log("Bob skipping pull since we already sync'd on this gossip loop"); + return + } + } + let pullResult = await hcDna.call("DNA_NICK", "ZOME_NAME", "pull", { + hash, + is_scribe + }); + if (pullResult) { + let myRevision = pullResult.current_revision; + if (me === aliceDid) aliceRevision = myRevision; + if (me === bobDid) bobRevision = myRevision; + } + }) + } + +//@ts-ignore +export async function stressTest(t) { + const aliceQueue = new AsyncQueue(); + const bobQueue = new AsyncQueue(); + + const scenario = new Scenario(); + const aliceHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + }, + } + ); + const alicePeersList: Map = new Map(); + const portAlice = await aliceHapps.conductor.attachAppInterface(); + const appWs = await aliceHapps.conductor.connectAppWs(portAlice); + appWs.on("signal", (signal) => { + //console.log("Alice Received Signal:",signal); + const { diff, reference_hash, reference, broadcast_author } = signal.payload; + if (diff && reference_hash && reference && broadcast_author) { + console.log(`PerspectiveDiffSync.handleHolochainSignal: + diff: ${JSON.stringify(diff)} + reference_hash: ${reference_hash.toString('base64')} + reference: { + diff: ${reference.diff?.toString('base64')} + parents: ${reference.parents ? reference.parents.map( (parent: Buffer) => parent ? parent.toString('base64') : 'null').join(', '):'none'} + diffs_since_snapshot: ${reference?.diffs_since_snapshot} + } + broadcast_author: ${broadcast_author} + `) + alicePeersList.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); + } else { + console.log("PerspectiveDiffSync.handleHolochainSignal: got other signal:", signal.payload) + } + }); + const bobHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + } + } + ); + const bobPeersList: Map = new Map(); + const portBob = await bobHapps.conductor.attachAppInterface(); + const appWsBob = await bobHapps.conductor.connectAppWs(portBob); + appWsBob.on("signal", (signal) => { + console.log("Bob Received Signal:",signal) + const { diff, reference_hash, reference, broadcast_author } = signal.payload; + if (diff && reference_hash && reference && broadcast_author) { + bobPeersList.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); + } + }) + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:alice" + }); + aliceDid = "did:test:alice"; + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: "did:test:bob" + }); + bobDid = "did:test:bob"; + + let done = false; + async function processGossip() { + await Promise.all([gossip(alicePeersList, "did:test:alice", { + call: async (nick, zome, fn_name, payload) => { + await aliceQueue.add( async () => { + try{ + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name, + payload + }) + } catch(e) { + console.log("ERROR during alice zome call", e) + } + + }) + } + } as HolochainLanguageDelegate), + gossip(bobPeersList, "did:test:bob", { + call: async (nick, zome, fn_name, payload) => { + await bobQueue.add( async () => { + try { + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name, + payload + }) + } catch(e) { + console.log("ERROR during bob zome call", e) + } + + }) + } + } as HolochainLanguageDelegate)]) + await sleep(1000) + if(!done) { + processGossip() + } + + } + + processGossip() + + let aliceConductor = aliceHapps.conductor + let bobConductor = bobHapps.conductor; + let hash = Buffer.from((await aliceConductor.adminWs().listDnas())[0]); + + await addAllAgentsToAllConductors([aliceConductor, bobConductor]); + + console.log("==============================================") + console.log("=================START========================") + console.log("==============================================") + for(let i=0; i < 10; i++) { + console.log("-------------------------"); + console.log("Iteration: ", i) + console.log("-------------------------"); + const start = hrtime.bigint(); + await Promise.all([ + createLinks(aliceHapps, "alice", 20, aliceQueue), + createLinks(bobHapps, "bob", 20, bobQueue) + ]) + const end = hrtime.bigint(); + console.log(`Creating links took ${divide(end - start, 1000000)} ms`); + + console.log("-------------------------"); + console.log("Created 20 links each (Alice and Bob)"); + console.log("waiting a second"); + console.log("-------------------------"); + + await sleep(1000) + + console.log("-------------------------"); + console.log("All good :)))))))))))))))"); + console.log("-------------------------"); + + } + + // Wait for gossip of latest_revision, needed for render + await sleep(15000) + + done = true; + aliceQueue.clear(); + bobQueue.clear() + + const startRenderA = hrtime.bigint(); + let alice_rendered = await call(aliceHapps, "render") as Perspective + const endRenderA = hrtime.bigint(); + console.log(`Alice render took ${divide(endRenderA - startRenderA, 1000000)} ms`); + + const startRenderB = hrtime.bigint(); + let bob_rendered = await call(bobHapps, "render") as Perspective + const endRenderB = hrtime.bigint(); + console.log(`Bob render took ${divide(endRenderB - startRenderB, 1000000)} ms`); + + t.isEqual(alice_rendered.links.length, bob_rendered.links.length) + + function includes(perspective: Perspective, link: LinkExpression) { + return perspective.links.find(l => ad4m.linkEqual(l,link)) + } + + for(let link of createdLinks.get("alice")!) { + t.assert(includes(alice_rendered, link)) + t.assert(includes(bob_rendered, link)) + } + + await aliceConductor.shutDown(); + await bobConductor.shutDown(); + await cleanAllConductors(); +} + +test("stress", async (t) => { + await stressTest(t); + t.end() + process.exit(0) +}) diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/telepresence.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/telepresence.ts new file mode 100644 index 000000000..72391d3a0 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/telepresence.ts @@ -0,0 +1,172 @@ +import { addAllAgentsToAllConductors, Scenario } from "@holochain/tryorama"; +import { sleep, generate_link_expression, sortedObject } from "./utils"; +import test from "tape-promise/tape.js"; +import { resolve } from "path"; +import { dnas } from "./common"; +import { PerspectiveExpression } from "@perspect3vism/ad4m"; + +function generate_perspective_expression(author: string, linkContent: string): PerspectiveExpression { + return { + author: author, + timestamp: new Date().toISOString(), + data: { + links: [generate_link_expression(linkContent)] + }, + proof: {signature: "sig", key: "key"}, + }; +} +//@ts-ignore +export async function testTelepresence(t) { + const scenario = new Scenario(); + let aliceSignalCount = 0; + let bobSignalCount = 0; + + const aliceHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + }, + } + ); + const portAlice = await aliceHapps.conductor.attachAppInterface(); + const appWs = await aliceHapps.conductor.connectAppWs(portAlice); + appWs.on("signal", (signal) => { + console.log("Alice Received Signal:",signal) + aliceSignalCount += 1; + }); + const bobHapps = await scenario.addPlayerWithApp( + { + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + } + } + ); + const portBob = await bobHapps.conductor.attachAppInterface(); + const appWsBob = await bobHapps.conductor.connectAppWs(portBob); + appWsBob.on("signal", (signal) => { + console.log("Bob Received Signal:",signal) + bobSignalCount += 1; + }) + + await scenario.shareAllAgents(); + await addAllAgentsToAllConductors([aliceHapps.conductor, bobHapps.conductor]); + + const bobDid = "did:key:bob"; + const aliceDid = "did:key:alice"; + + //Create did/pub key link for alice and bob + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: aliceDid + }); + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "create_did_pub_key_link", + payload: bobDid + }); + console.log("Set did pub key links"); + + //Sleep to give time for gossip + await sleep(2000) + + //Test setting and getting agent status + let perspectiveExpression = generate_perspective_expression(aliceDid, "alice"); + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "set_online_status", + payload: perspectiveExpression + }); + console.log("Set online status"); + + let bobSeenStatus = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "get_online_agents", + }); + //@ts-ignore + t.isEqual(bobSeenStatus.length, 1); + //@ts-ignore + t.equal(JSON.stringify(sortedObject(bobSeenStatus[0].status)), JSON.stringify(sortedObject(perspectiveExpression))); + //@ts-ignore + t.equal(JSON.stringify(sortedObject(bobSeenStatus[0].status.data.links[0])), JSON.stringify(sortedObject(perspectiveExpression.data.links[0]))); + + //Test that if alice updates her online status that bob sees the update, and does not get duplicates + perspectiveExpression = generate_perspective_expression(aliceDid, "alice2"); + + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "set_online_status", + payload: perspectiveExpression + }); + bobSeenStatus = await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "get_online_agents", + }); + //@ts-ignore + t.isEqual(bobSeenStatus.length, 1); + //@ts-ignore + t.equal(JSON.stringify(sortedObject(bobSeenStatus[0].status)), JSON.stringify(sortedObject(perspectiveExpression))); + //@ts-ignore + t.equal(JSON.stringify(sortedObject(bobSeenStatus[0].status.data.links[0])), JSON.stringify(sortedObject(perspectiveExpression.data.links[0]))); + + //Test sending signal to single agent + await aliceHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "send_signal", + payload: {remote_agent_did: "did:key:bob", payload: perspectiveExpression} + }); + //Sleep to give time for signals to arrive + await sleep(1000) + //@ts-ignore + t.isEqual(bobSignalCount, 1); + + + //Test sending broadcast + await bobHapps.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name: "send_broadcast", + payload: perspectiveExpression + }); + //Sleep to give time for signals to arrive + await sleep(1000) + //@ts-ignore + t.isEqual(aliceSignalCount, 1); + + await scenario.cleanUp(); +}; + +test("telepresence", async (t) => { + //t.plan(20) + try { + await testTelepresence(t); + } catch(e) { + console.error("telepresence test failed with error", e); + //@ts-ignore + t.fail(e) + } finally { + t.end() + process.exit(0) + } +}) diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/tsconfig.json b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/tsconfig.json new file mode 100644 index 000000000..0a629b1e4 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "ESNext", + "moduleResolution": "Node", + "sourceMap": true, + "declaration": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "strict": true + }, + "include": [ + "ts/**/*" + ] +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/utils.ts b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/utils.ts new file mode 100644 index 000000000..54744eb99 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/utils.ts @@ -0,0 +1,86 @@ +import { AgentApp, CallableCell, Conductor, NetworkType, enableAndGetAgentApp, runLocalServices } from "@holochain/tryorama"; +import faker from "faker"; +import { dnas } from './common'; +import { createConductor } from "@holochain/tryorama"; +import { resolve } from "path"; + +export async function call(happ: AgentApp, fn_name: string, payload?: any) { + return await happ.cells[0].callZome({ + zome_name: "perspective_diff_sync", + fn_name, + payload + }, 60000); +} + +export function generate_link_expression(agent: string) { + return { + data: {source: faker.name.findName(), target: faker.name.findName(), predicate: faker.name.findName()}, + author: agent, + timestamp: new Date().toISOString(), + proof: {signature: "sig", key: "key"}, + } +} + +export async function create_link_expression(cell: CallableCell, agent: string): Promise<{commit: string, data: any, commitRaw: Buffer}> { + let link_data = generate_link_expression(agent); + let commit = await cell.callZome({ + zome_name: "perspective_diff_sync", + fn_name: "commit", + payload: {additions: [link_data], removals: []} + }, 60000); + //@ts-ignore + return {commit: commit.toString("base64"), data: link_data, commitRaw: commit} +} + +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export async function createConductors(num: number): Promise<{agent_happ: AgentApp, conductor: Conductor}[]> { + let out = [] as {agent_happ: AgentApp, conductor: Conductor}[]; + + const localServices = await runLocalServices(); + + for (let n of Array(num).keys()) { + let conductor = await createConductor(localServices.signalingServerUrl, {networkType: NetworkType.WebRtc, bootstrapServerUrl: localServices.bootstrapServerUrl}); + let port = await conductor.attachAppInterface(); + let appWs = await conductor.connectAppWs(port); + try { + let app = await conductor.installApp({ + bundle: { + manifest: { + manifest_version: "1", + name: "perspective-diff-sync", + roles: [{ + name: "main", + dna: { + //@ts-ignore + path: resolve(dnas[0].source.path) + } + }] + }, + resources: {} + } + }); + const agentApp = await enableAndGetAgentApp(conductor.adminWs(), appWs, app); + out.push({ + agent_happ: agentApp, + conductor + }) + } catch (e) { + console.error(e); + } + } + return out +} + +//@ts-ignore +export function sortedObject(unordered) { + if(typeof unordered !== "object") return unordered; + return Object.keys(unordered).sort().reduce( + (obj, key) => { + //@ts-ignore + obj[key] = sortedObject(unordered[key]); + return obj; + }, {}); +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/yarn.lock b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/yarn.lock new file mode 100644 index 000000000..00d1b3687 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/hc-dna/zomes/tests/yarn.lock @@ -0,0 +1,1833 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@apollo/client@3.6.9": + version "3.6.9" + resolved "https://registry.npmjs.org/@apollo/client/-/client-3.6.9.tgz" + integrity sha512-Y1yu8qa2YeaCUBVuw08x8NHenFi0sw2I3KCu7Kw9mDSu86HmmtHJkCAifKVrN2iPgDTW/BbP3EpSV8/EQCcxZA== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@graphql-typed-document-node/core@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.1.tgz" + integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== + +"@holochain/client@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@holochain/client/-/client-0.12.0.tgz" + integrity sha512-pvrB6Gdc6488iR3VZXoq5QKzoAPTGi0y69Ktrtgr/IZEvtSSHBqHeMhyEjXCa7iS8b1gXsL/HAvq47rs8mu50A== + dependencies: + "@holochain/serialization" "^0.1.0-beta-rc.3" + "@msgpack/msgpack" "^2.7.2" + "@tauri-apps/api" "^1.2.0" + emittery "^1.0.1" + isomorphic-ws "^5.0.0" + js-base64 "^3.7.3" + lodash-es "^4.17.21" + tweetnacl "^1.0.3" + +"@holochain/client@0.16.1", "@holochain/client@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@holochain/client/-/client-0.16.1.tgz#3cdb110a5d4ab9bf51f31def289f0d082baa77ba" + integrity sha512-jfbrSZz3Yqr/hb3NwzfLSWpR6Cnt82hiHUZP5R1MrGpFQV8JVI2uq94CMVasBspNsWX3lMpT9LNz5Duvq7zF8Q== + dependencies: + "@holochain/serialization" "^0.1.0-beta-rc.3" + "@msgpack/msgpack" "^2.7.2" + "@noble/ed25519" "^2.0.0" + "@tauri-apps/api" "^1.2.0" + emittery "^1.0.1" + isomorphic-ws "^5.0.0" + js-base64 "^3.7.3" + libsodium-wrappers "^0.7.11" + lodash-es "^4.17.21" + ws "^8.13.0" + +"@holochain/serialization@^0.1.0-beta-rc.3": + version "0.1.0-beta-rc.3" + resolved "https://registry.npmjs.org/@holochain/serialization/-/serialization-0.1.0-beta-rc.3.tgz" + integrity sha512-DJx4V2KXHVLciyOGjOYKTM/JLBpBEZ3RsPIRCgf7qmwhQdxXvhi2p+oFFRD51yUT5uC1/MzIVeJCl/R60PwFbw== + +"@holochain/tryorama@0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@holochain/tryorama/-/tryorama-0.15.0.tgz#726dbd33159edf8866de7aa5cf6afdb2230aec74" + integrity sha512-GWsiheb6AFkPkT1ho+dJeFRB2jVboIm/Gp+7v1LshKbDZrgY7oDEopyQPWmy4SkQQYItuscGaIdaOUJIQJuGKQ== + dependencies: + "@holochain/client" "^0.16.0" + get-port "^6.1.2" + lodash "^4.17.21" + uuid "^8.3.2" + winston "^3.8.2" + ws "^8.11.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@msgpack/msgpack@^2.7.2": + version "2.7.2" + resolved "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz" + integrity sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw== + +"@noble/ed25519@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-2.0.0.tgz#5964c8190a4b4b804985717ca566113b93379e43" + integrity sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng== + +"@perspect3vism/ad4m@^0.2.12": + version "0.2.15" + resolved "https://registry.npmjs.org/@perspect3vism/ad4m/-/ad4m-0.2.15.tgz" + integrity sha512-hIJV5j064SQyxJXiMoHzZGQ5QowA+bxDuXsWGcfAXBN6EpxpFSoqvRuYqGR7VjENg5CV9hL9gjOVUYdhFdRt4Q== + dependencies: + "@apollo/client" "3.6.9" + "@holochain/client" "0.12.0" + "@types/jest" "^26.0.14" + class-validator "^0.13.1" + express "^4.18.1" + graphql "^15.7.2" + reflect-metadata "^0.1.13" + type-graphql "^1.1.1" + +"@tauri-apps/api@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@tauri-apps/api/-/api-1.2.0.tgz" + integrity sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/faker@^5.5.3": + version "5.5.9" + resolved "https://registry.npmjs.org/@types/faker/-/faker-5.5.9.tgz" + integrity sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA== + +"@types/glob@^7.1.3": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^26.0.14": + version "26.0.24" + resolved "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz" + integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/lodash@^4.14.158": + version "4.14.182" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*": + version "14.18.22" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz" + integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== + +"@types/node@^14.11.2": + version "14.18.61" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.61.tgz#752097010d85f6279b3069811bf0e99eba996096" + integrity sha512-1mFT4DqS4/s9tlZbdkwEB/EnSykA9MDeDLIk3FHApGvIMGY//qgstB2gu9GKGESWyW/qiRUO+jhlLJ9bBJ8j+Q== + +"@types/node@^18.0.0": + version "18.17.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.17.tgz#53cc07ce582c9d7c5850702a3c2cb0af0d7b0ca1" + integrity sha512-cOxcXsQ2sxiwkykdJqvyFS+MLQPLvIdwh5l6gNg8qF6s+C7XSkEWOZjK+XhUZd+mYvHV/180g2cnCcIl4l06Pw== + +"@types/semver@^7.3.3": + version "7.3.12" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz" + integrity sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A== + +"@types/tape-promise@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@types/tape-promise/-/tape-promise-4.0.1.tgz" + integrity sha512-1yBeq9y0EmJ2RpxfXMPrFeD3yMetBapY9zArTexp/wCRdBToJac/y//rtcZZjmiArgodTqz0RrK0VxxySoKyVg== + dependencies: + "@types/tape" "*" + +"@types/tape@*": + version "4.13.2" + resolved "https://registry.npmjs.org/@types/tape/-/tape-4.13.2.tgz" + integrity sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA== + dependencies: + "@types/node" "*" + +"@types/triple-beam@^1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz" + integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@wry/context@^0.6.0": + version "0.6.1" + resolved "https://registry.npmjs.org/@wry/context/-/context-0.6.1.tgz" + integrity sha512-LOmVnY1iTU2D8tv4Xf6MVMZZ+juIJ87Kt/plMijjN20NMAXGmH4u8bS1t0uT74cZ5gwpocYueV58YwyI8y+GKw== + dependencies: + tslib "^2.3.0" + +"@wry/equality@^0.5.0": + version "0.5.3" + resolved "https://registry.npmjs.org/@wry/equality/-/equality-0.5.3.tgz" + integrity sha512-avR+UXdSrsF2v8vIqIgmeTY0UR91UT+IyablCyKe/uk22uOJ8fusKZnH9JH9e1/EtLeNJBtagNmL3eJdnOV53g== + dependencies: + tslib "^2.3.0" + +"@wry/trie@^0.3.0": + version "0.3.2" + resolved "https://registry.npmjs.org/@wry/trie/-/trie-0.3.2.tgz" + integrity sha512-yRTyhWSls2OY/pYLfwff867r8ekooZ4UI+/gxot5Wj8EFwSf2rG+n+Mo/6LoLQm1TKA4GRj2+LCpbfS937dClQ== + dependencies: + tslib "^2.3.0" + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + +ansi-regex@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array.prototype.every@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz" + integrity sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + is-string "^1.0.7" + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +b4a@^1.0.1: + version "1.6.0" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.0.tgz" + integrity sha512-fsTxXxj1081Yq5MOQ06gZ5+e2QcSyP2U6NofdOWyq+lrNI4IjkZ+fLVmoQ6uUCiNg1NWePMMVq93vOTdbJmErw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +class-validator@^0.13.1: + version "0.13.2" + resolved "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz" + integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== + dependencies: + libphonenumber-js "^1.9.43" + validator "^13.7.0" + +color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +deep-equal@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz" + integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw== + dependencies: + call-bind "^1.0.0" + es-get-iterator "^1.1.1" + get-intrinsic "^1.0.1" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.1.1" + isarray "^2.0.5" + object-is "^1.1.4" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +divide-bigint@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/divide-bigint/-/divide-bigint-1.0.4.tgz" + integrity sha512-4BuHUgA1+iICOm6JZlourP3Zo/EQHh42/cSHP2hhoVGmgp6Pd1eJ8wt9c8v4gGfy8vBUFhQoO+BrZ90vuaugyg== + +dotignore@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +emittery@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-1.0.1.tgz" + integrity sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-get-iterator@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +express@^4.18.1: + version "4.18.1" + resolved "https://registry.npmjs.org/express/-/express-4.18.1.tgz" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +faker@5.5.3: + version "5.5.3" + resolved "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz" + integrity sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g== + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.1, get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-port@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz" + integrity sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob@^7.1.6, glob@^7.2.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graphql-query-complexity@^0.7.0: + version "0.7.2" + resolved "https://registry.npmjs.org/graphql-query-complexity/-/graphql-query-complexity-0.7.2.tgz" + integrity sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ== + dependencies: + lodash.get "^4.4.2" + +graphql-subscriptions@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz" + integrity sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g== + dependencies: + iterall "^1.3.0" + +graphql-tag@^2.12.6: + version "2.12.6" + resolved "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz" + integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== + dependencies: + tslib "^2.1.0" + +graphql@^15.7.2: + version "15.8.0" + resolved "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-dynamic-import@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz" + integrity sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arguments@^1.0.4, is-arguments@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.2: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-promise@^2.1.0: + version "2.2.2" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== + +is-regex@^1.1.1, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isomorphic-ws@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz" + integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== + +iterall@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== + +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +js-base64@^3.7.3: + version "3.7.5" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz" + integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +libphonenumber-js@^1.9.43: + version "1.10.13" + resolved "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.13.tgz" + integrity sha512-b74iyWmwb4GprAUPjPkJ11GTC7KX4Pd3onpJfKxYyY8y9Rbb4ERY47LvCMEDM09WD3thiLDMXtkfDK/AX+zT7Q== + +libsodium-wrappers@^0.7.11: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== + dependencies: + libsodium "^0.7.13" + +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + +lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +logform@^2.3.2, logform@^2.4.0: + version "2.5.1" + resolved "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz" + integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + dependencies: + "@colors/colors" "1.5.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== + +object-is@^1.1.4, object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +optimism@^0.16.1: + version "0.16.1" + resolved "https://registry.npmjs.org/optimism/-/optimism-0.16.1.tgz" + integrity sha512-64i+Uw3otrndfq5kaoGNoY7pvOhSsjFEN4bdEFh80MWVk/dbgJfMv7VFDeCT8LxNAlEVhQmdVEbfE7X2nWNIIg== + dependencies: + "@wry/context" "^0.6.0" + "@wry/trie" "^0.3.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.1" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regexp.prototype.flags@^1.3.0, regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +resolve@^2.0.0-next.3: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resumer@^0.0.0: + version "0.0.0" + resolved "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz" + integrity sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w== + dependencies: + through "~2.3.4" + +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-stable-stringify@^2.3.1: + version "2.4.2" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz" + integrity sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^7.3.2: + version "7.3.7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +side-channel@^1.0.3, side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string.prototype.trim@^1.2.5: + version "1.2.6" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz" + integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-observable@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +tape-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/tape-promise/-/tape-promise-4.0.0.tgz" + integrity sha512-mNi5yhWAKDuNgZCfFKeZbsXvraVOf+I8UZG+lf+aoRrzX4+jd4mpNBjYh16/VcpEMUtS0iFndBgnfxxZbtyLFw== + dependencies: + is-promise "^2.1.0" + onetime "^2.0.0" + +tape@^5.5.3: + version "5.5.3" + resolved "https://registry.npmjs.org/tape/-/tape-5.5.3.tgz" + integrity sha512-hPBJZBL9S7bH9vECg/KSM24slGYV589jJr4dmtiJrLD71AL66+8o4b9HdZazXZyvnilqA7eE8z5/flKiy0KsBg== + dependencies: + array.prototype.every "^1.1.3" + call-bind "^1.0.2" + deep-equal "^2.0.5" + defined "^1.0.0" + dotignore "^0.1.2" + for-each "^0.3.3" + get-package-type "^0.1.0" + glob "^7.2.0" + has "^1.0.3" + has-dynamic-import "^2.0.1" + inherits "^2.0.4" + is-regex "^1.1.4" + minimist "^1.2.6" + object-inspect "^1.12.0" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.2" + resolve "^2.0.0-next.3" + resumer "^0.0.0" + string.prototype.trim "^1.2.5" + through "^2.3.8" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +through@^2.3.8, through@~2.3.4: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + +ts-node@^10.8.0: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-graphql@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/type-graphql/-/type-graphql-1.1.1.tgz" + integrity sha512-iOOWVn0ehCYMukmnXStbkRwFE9dcjt7/oDcBS1JyQZo9CbhlIll4lHHps54HMEk4A4c8bUPd+DjK8w1/ZrxB4A== + dependencies: + "@types/glob" "^7.1.3" + "@types/node" "^14.11.2" + "@types/semver" "^7.3.3" + glob "^7.1.6" + graphql-query-complexity "^0.7.0" + graphql-subscriptions "^1.1.0" + semver "^7.3.2" + tslib "^2.0.1" + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typescript@^4.2.4: + version "4.7.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +which-boxed-primitive@^1.0.1, which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + +winston-transport@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz" + integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.8.2: + version "3.8.2" + resolved "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz" + integrity sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew== + dependencies: + "@colors/colors" "1.5.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.5.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.11.0: + version "8.12.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz" + integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== + +ws@^8.13.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" + integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/index.ts b/bootstrap-languages/p-diff-sync-socket-signaling/index.ts new file mode 100644 index 000000000..92625a1d5 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/index.ts @@ -0,0 +1,59 @@ +import type { Address, Language, Interaction, HolochainLanguageDelegate, LanguageContext, AgentService } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import { LinkAdapter } from "./linksAdapter.ts"; +import { TelepresenceAdapterImplementation } from "./telepresenceAdapter.ts"; +import { DNA, DNA_NICK, ZOME_NAME } from "./build/dna.js"; + +function interactions(expression: Address): Interaction[] { + return []; +} + +//!@ad4m-template-variable +const name = "perspective-diff-sync"; + +//!@ad4m-template-variable +const uid = "perspective-diff-sync-uuid"; + +export default async function create(context: LanguageContext): Promise { + const Holochain = context.Holochain as HolochainLanguageDelegate; + const agent = context.agent as AgentService; + + const linksAdapter = new LinkAdapter(context, uid); + const telepresenceAdapter = new TelepresenceAdapterImplementation(context); + + await Holochain.registerDNAs( + //@ts-ignore + [{ file: DNA, nick: DNA_NICK, zomeCalls: + [ + [ZOME_NAME, "current_revision"], + [ZOME_NAME, "sync"], + [ZOME_NAME, "render"], + [ZOME_NAME, "commit"], + [ZOME_NAME, "fast_forward_signal"], + [ZOME_NAME, "get_others"], + [ZOME_NAME, "add_active_agent_link"], + [ZOME_NAME, "create_did_pub_key_link"], + ] + }], + async (signal) => { + //@ts-ignore + if (signal.payload.diff || (signal.payload.additions && signal.payload.removals)) { + await linksAdapter.handleHolochainSignal(signal) + } else { + for (const callback of telepresenceAdapter.signalCallbacks) { + await callback(signal.payload); + } + } + } + ); + + //Setup the link between did and agent pub key + await Holochain.call(DNA_NICK, ZOME_NAME, "create_did_pub_key_link", agent.did); + + //@ts-ignore + return { + name, + linksAdapter, + interactions, + telepresenceAdapter + } as Language; +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/integration-test.js b/bootstrap-languages/p-diff-sync-socket-signaling/integration-test.js new file mode 100644 index 000000000..a8b36a0bd --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/integration-test.js @@ -0,0 +1,20 @@ +const { spawnLinkAgent } = require("@perspect3vism/ad4m-test/helpers"); + +describe("Link", () => { + it("Create Link", async () => { + const agent = await spawnLinkAgent(); + + const all = await agent.queryLinks({}); + + expect(all.length).toBe(0) + + const link = await agent.addLink({source:"root", predicate: "soic://test", target:"QmYVsrMpiFmV9S7bTWNAkUzSqjRJskQ8g4TWKKwKrHAPqL://QmSsCCtXMDAZXMpyiNLzwjGEU4hLmhG7fphidhEEodQ4Wy"}) + + const all1 = await agent.queryLinks({}); + + expect(all1.length).toBe(1) + expect(all1[0].data.source).toBe(link.data.source) + expect(all1[0].data.predicate).toBe(link.data.predicate) + expect(all1[0].data.target).toBe(link.data.target) + }); +}) \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/p-diff-sync-socket-signaling/linksAdapter.ts new file mode 100644 index 000000000..3701d6607 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/linksAdapter.ts @@ -0,0 +1,378 @@ +import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, LanguageContext, PerspectiveDiff, + LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; +import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; +import { io } from "https://esm.sh/socket.io-client@4.7.2"; + +class PeerInfo { + //@ts-ignore + currentRevision: Buffer; + //@ts-ignore + lastSeen: Date; +}; + +export class LinkAdapter implements LinkSyncAdapter { + hcDna: HolochainLanguageDelegate; + linkCallback?: PerspectiveDiffObserver + syncStateChangeCallback?: SyncStateChangeObserver + peers: Map = new Map(); + generalMutex: Mutex = withTimeout(new Mutex(), 10000, new Error('PerspectiveDiffSync: generalMutex timeout')); + me: DID + gossipLogCount: number = 0; + myCurrentRevision: Buffer | null = null; + languageName: String | null = null; + socket: any; + + constructor(context: LanguageContext, name: String) { + //@ts-ignore + this.hcDna = context.Holochain as HolochainLanguageDelegate; + this.me = context.agent.did; + this.languageName = name; + this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + console.log("Created socket connection"); + this.socket.on('error', (error: any) => { + console.error('Error:', error); + }); + this.socket.on('connect', () => { + console.log('Connected to the server'); + try { + this.socket.emit("join-room", this.languageName); + console.log("Sent the join-room signal"); + } catch (e) { + console.error("Error in socket connection: ", e); + } + }); + this.socket.on("signal", (signal: any) => { + this.handleHolochainSignal(signal); + }); + this.socket.on('disconnect', () => { + console.log('Disconnected from the server'); + }); + this.socket.on('connect_error', (error) => { + console.error('Connection Error:', error); + }); + this.socket.on('reconnect_attempt', () => { + console.log('Trying to reconnect...'); + }); + } + + writable(): boolean { + return true; + } + + public(): boolean { + return false; + } + + async others(): Promise { + //@ts-ignore + return await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_others", null); + } + + async currentRevision(): Promise { + //@ts-ignore + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "current_revision", null); + return res as string; + } + + async sync(): Promise { + //console.log("PerspectiveDiffSync.sync(); Getting lock"); + const release = await this.generalMutex.acquire(); + //console.log("PerspectiveDiffSync.sync(); Got lock"); + try { + //@ts-ignore + let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); + if (broadcast_payload) { + if (broadcast_payload.reference_hash && Buffer.isBuffer(broadcast_payload.reference_hash)) { + this.myCurrentRevision = broadcast_payload.reference_hash; + } + //Use client to send to socketIO + broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); + broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); + if (broadcast_payload.reference.parents) { + broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); + }; + // console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); + // console.log("sync(); sending broadcast payload"); + // console.log(JSON.stringify(broadcast_payload)); + this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); + } + } catch (e) { + console.error("PerspectiveDiffSync.sync(); got error", e); + } finally { + release(); + } + await this.gossip(); + return new PerspectiveDiff() + } + + async gossip() { + this.gossipLogCount += 1; + let lostPeers: DID[] = []; + + const release = await this.generalMutex.acquire(); + try { + this.peers.forEach( (peerInfo, peer) => { + if (peerInfo.lastSeen.getTime() + 10000 < new Date().getTime()) { + lostPeers.push(peer); + } + }); + + for (const peer of lostPeers) { + this.peers.delete(peer); + } + + // flatten the map into an array of peers + let peers = Array.from(this.peers.keys()); + peers.push(this.me); + + // Lexically sort the peers + peers.sort(); + + // If we are the first peer, we are the scribe + let is_scribe = peers[0] == this.me; + + // Get a deduped set of all peer's current revisions + let revisions = new Set(); + for(const peerInfo of this.peers.values()) { + if (peerInfo.currentRevision) revisions.add(peerInfo.currentRevision); + } + + //Do checking on incoming gossip revisions and see if we have the same hash as the majority of the peers + //Get a copied array of revisions that are the same as mine + let sameRevisions; + //Get a copied array of revisions that are different than mine + let differentRevisions; + + function generateRevisionStates(myCurrentRevision: Buffer) { + sameRevisions = revisions.size == 0 ? [] : Array.from(revisions).filter( (revision) => { + return myCurrentRevision && revision.equals(myCurrentRevision); + }); + if (myCurrentRevision) { + sameRevisions.push(myCurrentRevision); + }; + differentRevisions = revisions.size == 0 ? [] : Array.from(revisions).filter( (revision) => { + return myCurrentRevision && !revision.equals(myCurrentRevision); + }); + } + + async function checkSyncState(callback: SyncStateChangeObserver) { + if (sameRevisions.length > 0 || differentRevisions.length > 0) { + if (sameRevisions.length <= differentRevisions.length) { + await callback(PerspectiveState.LinkLanguageInstalledButNotSynced); + } else { + await callback(PerspectiveState.Synced); + }; + } + } + + //@ts-ignore + generateRevisionStates(this.myCurrentRevision); + + //@ts-ignore + await checkSyncState(this.syncStateChangeCallback); + + for (const hash of Array.from(revisions)) { + if(!hash) continue + if (this.myCurrentRevision && hash.equals(this.myCurrentRevision)) continue + console.log("Pulling with hash", hash); + let pullResult = await this.hcDna.call(DNA_NICK, ZOME_NAME, "pull", { + hash, + is_scribe + }); + if (pullResult) { + if (pullResult.current_revision && Buffer.isBuffer(pullResult.current_revision)) { + let myRevision = pullResult.current_revision; + this.myCurrentRevision = myRevision; + + //@ts-ignore + generateRevisionStates(this.myCurrentRevision); + //@ts-ignore + await checkSyncState(this.syncStateChangeCallback); + } + } + } + + //Only show the gossip log every 10th iteration + if (this.gossipLogCount == 10) { + console.log(` + ====== + GOSSIP + -- + me: ${this.me} + is scribe: ${is_scribe} + -- + ${Array.from(this.peers.entries()).map( ([peer, peerInfo]) => { + //@ts-ignore + return `${peer}: ${peerInfo.currentRevision.toString('base64')} ${peerInfo.lastSeen.toISOString()}\n` + })} + -- + revisions: ${Array.from(revisions).map( (hash) => { + //@ts-ignore + return hash.toString('base64') + })} + `); + this.gossipLogCount = 0; + } + } catch (e) { + console.error("PerspectiveDiffSync.gossip(); got error", e); + } finally { + release(); + } + } + + async render(): Promise { + //@ts-ignore + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "render", null); + return new Perspective(res.links); + } + + async commit(diff: PerspectiveDiff): Promise { + //console.log("PerspectiveDiffSync.commit(); Getting lock"); + const release = await this.generalMutex.acquire(); + try { + //console.log("PerspectiveDiffSync.commit(); Got lock"); + let prep_diff = { + additions: diff.additions.map((diff) => prepareLinkExpression(diff)), + removals: diff.removals.map((diff) => prepareLinkExpression(diff)) + } + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "commit", prep_diff); + if (res && Buffer.isBuffer(res)) { + this.myCurrentRevision = res; + } + let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); + // console.log('commit got broadcast payload', broadcast_payload.referencence_hash); + // console.log("which has type", typeof broadcast_payload.reference_hash); + if (broadcast_payload) { + broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); + broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); + if (broadcast_payload.reference.parents) { + broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); + }; + //console.log("commit sending referenceh hash", broadcast_payload.reference_hash); + this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); + } + return res as string; + } catch (e) { + console.error("PerspectiveDiffSync.commit(); got error", e); + } finally { + release(); + } + } + + addCallback(callback: PerspectiveDiffObserver): number { + this.linkCallback = callback; + return 1; + } + + addSyncStateChangeCallback(callback: SyncStateChangeObserver): number { + this.syncStateChangeCallback = callback; + return 1; + } + + async handleHolochainSignal(signal: any): Promise { + let diff; + let reference_hash; + let reference; + let broadcast_author; + if (signal.payload) { + ({ diff, reference_hash, reference, broadcast_author } = signal.payload); + } else { + ({ diff, reference_hash, reference, broadcast_author } = signal); + } + // console.log("Setting a peer hash to", reference_hash); + // console.log(JSON.stringify(diff)); + // console.log("Reference", JSON.stringify(reference)); + // console.log(broadcast_author); + //Check if this signal came from another agent & contains a diff and reference_hash + if (diff && reference_hash && reference && broadcast_author) { + // console.log(`PerspectiveDiffSync.handleHolochainSignal: + // diff: ${JSON.stringify(diff)} + // reference_hash: ${reference_hash.toString('base64')} + // reference: { + // diff: ${reference.diff?.toString('base64')} + // parents: ${reference.parents ? reference.parents.map( (parent: Buffer) => parent ? parent.toString('base64') : 'null').join(', '):'none'} + // diffs_since_snapshot: ${reference?.diffs_since_snapshot} + // } + // broadcast_author: ${broadcast_author} + // `) + try { + //console.log("PerspectiveDiffSync.handleHolochainSignal: Getting lock"); + + //console.log("PerspectiveDiffSync.handleHolochainSignal: Got lock"); + //const parsed = JSON.parse(reference_hash); + // console.log("Handle holochain signal parsed ref hash"); + // console.log(JSON.stringify({ + // diff, + // reference_hash, + // reference, + // broadcast_author + // })); + if (!Buffer.isBuffer(reference_hash)) { + reference_hash = Buffer.from(reference_hash, 'base64'); + } + if (!Buffer.isBuffer(reference.diff)) { + reference.diff = Buffer.from(reference.diff, 'base64'); + } + if (reference.parents) { + reference.parents = reference.parents.map( (parent: string) => parent == 'null' ? null : Buffer.from(parent, 'base64')); + } + + await this.hcDna.call(DNA_NICK, ZOME_NAME, "handle_broadcast", { + diff, + reference_hash, + reference, + broadcast_author + }); + this.peers.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); + } catch (e) { + console.error("PerspectiveDiffSync.handleHolochainSignal: got error", e); + } + } else { + console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", JSON.stringify(signal.payload)); + //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal + if (this.linkCallback) { + console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback"); + await this.linkCallback(signal.payload); + } + } + } + + async addActiveAgentLink(hcDna: HolochainLanguageDelegate): Promise { + if (hcDna == undefined) { + console.warn("===Perspective-diff-sync: Error tried to add an active agent link but received no hcDna to add the link onto"); + } else { + return await hcDna.call( + DNA_NICK, + ZOME_NAME, + "add_active_agent_link", + //@ts-ignore + null + ); + } + } +} + +function prepareLinkExpression(link: LinkExpression): object { + const data = Object.assign(link); + if (data.data.source == "") { + data.data.source = null; + } + if (data.data.target == "") { + data.data.target = null; + } + if (data.data.predicate == "") { + data.data.predicate = null; + } + if (data.data.source == undefined) { + data.data.source = null; + } + if (data.data.target == undefined) { + data.data.target = null; + } + if (data.data.predicate == undefined) { + data.data.predicate = null; + } + return data; +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/package.json b/bootstrap-languages/p-diff-sync-socket-signaling/package.json new file mode 100644 index 000000000..b615f2717 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/package.json @@ -0,0 +1,43 @@ +{ + "name": "@perspect3vism/perspective-diff-sync-socket-signaling", + "version": "0.6.0", + "description": "An AD4M language for syncing mutations to a share perspective", + "main": "index.js", + "scripts": { + "build-dna": "cd hc-dna && ./build.sh && cd ..", + "build": "run-script-os", + "build:linux": "yarn run build-dna && yarn run build-common", + "build:macos": "yarn run build-dna && yarn run build-common", + "build:windows": "cd hc-dna && powershell -ExecutionPolicy Bypass -File ./build.ps1 && cd .. && yarn run build-common", + "rollup-dna": "rollup -c rollup.config.hc-dna.js", + "build-common": "yarn run rollup-dna && deno run --allow-all esbuild.ts", + "integration-test": "node ../../test-runner/build/cli.js --test ./integration-test.js --bundle \"./build/bundle.js\" --meta '{\"name\":\"p-diff-sync\",\"description\":\"Holochain based language for sharing Perspectives\",\"sourceCodeLink\":\"https://github.com/perspect3vism/perspective-diff-sync\",\"possibleTemplateParams\":[\"uid\",\"name\"]}'" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m-test": "*", + "@perspect3vism/rollup-plugin-dna": "^0.0.2", + "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "@rollup/plugin-typescript": "^4.0.0", + "@tsconfig/svelte": "^1.0.0", + "@types/node": "^18.0.0", + "faker": "^5.5.3", + "rollup": "^2.3.4", + "rollup-plugin-postcss": "^3.1.8", + "rollup-plugin-string": "^3.0.0", + "rollup-plugin-svelte": "^6.0.0", + "rollup-plugin-terser": "^7.0.0", + "svelte": "^3.0.0", + "svelte-check": "^1.0.0", + "svelte-preprocess": "^4.0.0", + "tslib": "^2.0.0", + "typescript": "^4.5.5" + }, + "devDependencies": { + "run-script-os": "^1.1.6" + } +} diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/rollup.config.hc-dna.js b/bootstrap-languages/p-diff-sync-socket-signaling/rollup.config.hc-dna.js new file mode 100644 index 000000000..a1c1e1bbf --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/rollup.config.hc-dna.js @@ -0,0 +1,71 @@ +import svelte from "rollup-plugin-svelte"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; +//import { terser } from 'rollup-plugin-terser'; +import sveltePreprocess from "svelte-preprocess"; +import postcss from "rollup-plugin-postcss"; +import { string } from "rollup-plugin-string"; +import json from "@rollup/plugin-json"; +import dna from "@perspect3vism/rollup-plugin-dna"; + +const production = !process.env.ROLLUP_WATCH; + +export default { + input: "dna.js", + external: [], + output: { + sourcemap: true, + format: "esm", + name: "PDiffSyncLanguage", + file: "build/dna.js", + interop: "esModule", + globals: {}, + }, + external: [], + plugins: [ + string({ + include: "build/*.js", + }), + svelte({ + // enable run-time checks when not in production + dev: !production, + // we'll extract any component CSS out into + // a separate file - better for performance + //css: css => { + // css.write('bundle.css'); + //}, + preprocess: sveltePreprocess(), + }), + // copy({ + // assets: ['package.unbundled.json'] + // }), + + // If you have external dependencies installed from + // npm, you'll most likely need these plugins. In + // some cases you'll need additional configuration - + // consult the documentation for details: + // https://github.com/rollup/plugins/tree/master/packages/commonjs + resolve({ + browser: true, + dedupe: ["svelte"], + }), + commonjs(), + postcss({ + extract: true, + minimize: true, + use: [ + [ + "sass", + { + includePaths: ["./src/ui/theme", "./node_modules"], + }, + ], + ], + }), + json(), + dna(), + ], + watch: { + clearScreen: false, + }, +}; diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/telepresenceAdapter.ts b/bootstrap-languages/p-diff-sync-socket-signaling/telepresenceAdapter.ts new file mode 100644 index 000000000..9ae096da6 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/telepresenceAdapter.ts @@ -0,0 +1,39 @@ +import type { TelepresenceAdapter, OnlineAgent, PerspectiveExpression, TelepresenceSignalCallback, HolochainLanguageDelegate, LanguageContext } from "https://esm.sh/@perspect3vism/ad4m@0.5.0";; +import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; + +export class TelepresenceAdapterImplementation implements TelepresenceAdapter { + hcDna: HolochainLanguageDelegate; + signalCallbacks: TelepresenceSignalCallback[] = []; + + constructor(context: LanguageContext) { + this.hcDna = context.Holochain as HolochainLanguageDelegate; + } + + async setOnlineStatus(status: PerspectiveExpression): Promise { + await this.hcDna.call(DNA_NICK, ZOME_NAME, "set_online_status", status); + } + + async getOnlineAgents(): Promise { + //@ts-ignore + const getActiveAgents = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_active_agents", null); + let calls = []; + for (const activeAgent of getActiveAgents) { + calls.push({dnaNick: DNA_NICK, zomeName: ZOME_NAME, fnName: "get_agents_status", params: activeAgent}); + }; + return await this.hcDna.callAsync(calls, 1000) as OnlineAgent[]; + } + + async sendSignal(remoteAgentDid: string, payload: PerspectiveExpression): Promise { + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_signal", {remote_agent_did: remoteAgentDid, payload}); + return res; + } + + async sendBroadcast(payload: PerspectiveExpression): Promise { + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_broadcast", payload); + return res; + } + + async registerSignalCallback(callback: TelepresenceSignalCallback): Promise { + this.signalCallbacks.push(callback); + } +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/tsconfig.json b/bootstrap-languages/p-diff-sync-socket-signaling/tsconfig.json new file mode 100644 index 000000000..132461b20 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "types": ["node"], + }, + "include": ["*.ts"], + "exclude": ["node_modules/*", "__sapper__/*", "public/*"], +} \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync/esbuild.ts b/bootstrap-languages/p-diff-sync/esbuild.ts index e479a51dd..6f3bce43c 100644 --- a/bootstrap-languages/p-diff-sync/esbuild.ts +++ b/bootstrap-languages/p-diff-sync/esbuild.ts @@ -4,26 +4,9 @@ import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/mod.js"; // import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/wasm.js"; import { denoPlugins } from "https://deno.land/x/esbuild_deno_loader@0.7.0/mod.ts"; -import { loadSource, resolveUrl } from "./customHttpDownloader.js"; const result = await esbuild.build({ - plugins: [ - { - name: `buffer-alias`, - setup(build) { - build.onResolve({ filter: new RegExp(`^buffer$`) }, (args) => { - return { path: `https://deno.land/std@0.177.0/node/buffer.ts`, namespace: 'imports' }; - }); - - build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) - - build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { - return loadSource(args) - }) - }, - }, - ...denoPlugins() - ], + plugins: [...denoPlugins()], entryPoints: ['index.ts'], outfile: 'build/bundle.js', bundle: true, diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs index e837a592b..7e03bab91 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/lib.rs @@ -63,12 +63,6 @@ pub fn sync(_: ()) -> ExternResult> { .map_err(|error| utils::err(&format!("{}", error))) } -#[hdk_extern] -pub fn get_broadcast_payload(_: ()) -> ExternResult> { - link_adapter::commit::get_broadcast_payload::() - .map_err(|error| utils::err(&format!("{}", error))) -} - #[hdk_extern] pub fn pull(args: PullArguments) -> ExternResult { link_adapter::pull::pull::(true, args.hash, args.is_scribe) @@ -101,7 +95,6 @@ fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { //Check if its a normal diff expression signal match HashBroadcast::try_from(signal.clone()) { Ok(broadcast) => { - debug!("Received broadcast: {:?} in HOLOCHAIN", broadcast); link_adapter::pull::handle_broadcast::(broadcast) .map_err(|err| utils::err(&format!("{}", err)))?; } @@ -115,13 +108,6 @@ fn recv_remote_signal(signal: SerializedBytes) -> ExternResult<()> { Ok(()) } -#[hdk_extern] -pub fn handle_broadcast(broadcast: HashBroadcast) -> ExternResult<()> { - link_adapter::pull::handle_broadcast::(broadcast) - .map_err(|err| utils::err(&format!("{}", err)))?; - Ok(()) -} - // Telepresence implementation #[hdk_extern] diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs index 6dd6f9392..e9897391c 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/commit.rs @@ -88,15 +88,15 @@ pub fn commit( ); update_current_revision::(diff_entry_reference.clone(), now)?; - // if *ENABLE_SIGNALS { - // // let signal_data = PerspectiveDiffReference { - // // diff, - // // reference: diff_entry_ref_entry, - // // reference_hash: diff_entry_reference.clone(), - // // }; - // // send_revision_signal(signal_data)?; - // broadcast_current::()?; - // }; + if *ENABLE_SIGNALS { + // let signal_data = PerspectiveDiffReference { + // diff, + // reference: diff_entry_ref_entry, + // reference_hash: diff_entry_reference.clone(), + // }; + // send_revision_signal(signal_data)?; + broadcast_current::()?; + }; let after_fn_end = get_now()?.time(); debug!( @@ -150,22 +150,3 @@ pub fn broadcast_current() -> SocialContext }; Ok(current.map(|rev| rev.hash)) } - -pub fn get_broadcast_payload() -> SocialContextResult> { - match current_revision::()? { - Some(current) => { - let current_revision = current; - let entry_ref = - Retriever::get::(current_revision.hash.clone())?; - let diff = Retriever::get::(entry_ref.diff.clone())?; - - Ok(Some(HashBroadcast { - reference: entry_ref, - reference_hash: current_revision.hash.clone(), - diff, - broadcast_author: get_my_did()?.unwrap(), - })) - }, - None => Ok(None) - } -} diff --git a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs index 9059b9b32..5897c3435 100644 --- a/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs +++ b/bootstrap-languages/p-diff-sync/hc-dna/zomes/perspective_diff_sync/src/link_adapter/pull.rs @@ -232,7 +232,7 @@ pub fn handle_broadcast( emit_signal(broadcast.diff.clone())?; }; }; - //emit_signal(broadcast)?; + emit_signal(broadcast)?; // let fn_end = get_now()?.time(); // debug!("===PerspectiveDiffSync.fast_forward_signal() - Profiling: Took: {} to complete fast_forward_signal() function", (fn_end - fn_start).num_milliseconds()); Ok(()) diff --git a/bootstrap-languages/p-diff-sync/index.ts b/bootstrap-languages/p-diff-sync/index.ts index 92625a1d5..1f57856ad 100644 --- a/bootstrap-languages/p-diff-sync/index.ts +++ b/bootstrap-languages/p-diff-sync/index.ts @@ -10,14 +10,11 @@ function interactions(expression: Address): Interaction[] { //!@ad4m-template-variable const name = "perspective-diff-sync"; -//!@ad4m-template-variable -const uid = "perspective-diff-sync-uuid"; - export default async function create(context: LanguageContext): Promise { const Holochain = context.Holochain as HolochainLanguageDelegate; const agent = context.agent as AgentService; - const linksAdapter = new LinkAdapter(context, uid); + const linksAdapter = new LinkAdapter(context); const telepresenceAdapter = new TelepresenceAdapterImplementation(context); await Holochain.registerDNAs( diff --git a/bootstrap-languages/p-diff-sync/linksAdapter.ts b/bootstrap-languages/p-diff-sync/linksAdapter.ts index 3701d6607..62e09db15 100644 --- a/bootstrap-languages/p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/p-diff-sync/linksAdapter.ts @@ -3,7 +3,6 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; import { DNA_NICK, ZOME_NAME } from "./build/dna.js"; -import { io } from "https://esm.sh/socket.io-client@4.7.2"; class PeerInfo { //@ts-ignore @@ -21,40 +20,11 @@ export class LinkAdapter implements LinkSyncAdapter { me: DID gossipLogCount: number = 0; myCurrentRevision: Buffer | null = null; - languageName: String | null = null; - socket: any; - constructor(context: LanguageContext, name: String) { + constructor(context: LanguageContext) { //@ts-ignore this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; - this.languageName = name; - this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); - console.log("Created socket connection"); - this.socket.on('error', (error: any) => { - console.error('Error:', error); - }); - this.socket.on('connect', () => { - console.log('Connected to the server'); - try { - this.socket.emit("join-room", this.languageName); - console.log("Sent the join-room signal"); - } catch (e) { - console.error("Error in socket connection: ", e); - } - }); - this.socket.on("signal", (signal: any) => { - this.handleHolochainSignal(signal); - }); - this.socket.on('disconnect', () => { - console.log('Disconnected from the server'); - }); - this.socket.on('connect_error', (error) => { - console.error('Connection Error:', error); - }); - this.socket.on('reconnect_attempt', () => { - console.log('Trying to reconnect...'); - }); } writable(): boolean { @@ -82,21 +52,9 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.sync(); Got lock"); try { //@ts-ignore - let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); - if (broadcast_payload) { - if (broadcast_payload.reference_hash && Buffer.isBuffer(broadcast_payload.reference_hash)) { - this.myCurrentRevision = broadcast_payload.reference_hash; - } - //Use client to send to socketIO - broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); - broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); - if (broadcast_payload.reference.parents) { - broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); - }; - // console.log("sync(); sending referenceh hash", broadcast_payload.reference_hash); - // console.log("sync(); sending broadcast payload"); - // console.log(JSON.stringify(broadcast_payload)); - this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); + let current_revision = await this.hcDna.call(DNA_NICK, ZOME_NAME, "sync", null); + if (current_revision && Buffer.isBuffer(current_revision)) { + this.myCurrentRevision = current_revision; } } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); @@ -176,7 +134,6 @@ export class LinkAdapter implements LinkSyncAdapter { for (const hash of Array.from(revisions)) { if(!hash) continue if (this.myCurrentRevision && hash.equals(this.myCurrentRevision)) continue - console.log("Pulling with hash", hash); let pullResult = await this.hcDna.call(DNA_NICK, ZOME_NAME, "pull", { hash, is_scribe @@ -241,18 +198,6 @@ export class LinkAdapter implements LinkSyncAdapter { if (res && Buffer.isBuffer(res)) { this.myCurrentRevision = res; } - let broadcast_payload = await this.hcDna.call(DNA_NICK, ZOME_NAME, "get_broadcast_payload", null); - // console.log('commit got broadcast payload', broadcast_payload.referencence_hash); - // console.log("which has type", typeof broadcast_payload.reference_hash); - if (broadcast_payload) { - broadcast_payload.reference_hash = Buffer.from(broadcast_payload.reference_hash).toString('base64'); - broadcast_payload.reference.diff = Buffer.from(broadcast_payload.reference.diff).toString('base64'); - if (broadcast_payload.reference.parents) { - broadcast_payload.reference.parents = broadcast_payload.reference.parents.map( (parent: Buffer) => parent ? Buffer.from(parent).toString('base64') : 'null'); - }; - //console.log("commit sending referenceh hash", broadcast_payload.reference_hash); - this.socket.emit("broadcast", {roomId: this.languageName, signal: broadcast_payload}); - } return res as string; } catch (e) { console.error("PerspectiveDiffSync.commit(); got error", e); @@ -272,19 +217,7 @@ export class LinkAdapter implements LinkSyncAdapter { } async handleHolochainSignal(signal: any): Promise { - let diff; - let reference_hash; - let reference; - let broadcast_author; - if (signal.payload) { - ({ diff, reference_hash, reference, broadcast_author } = signal.payload); - } else { - ({ diff, reference_hash, reference, broadcast_author } = signal); - } - // console.log("Setting a peer hash to", reference_hash); - // console.log(JSON.stringify(diff)); - // console.log("Reference", JSON.stringify(reference)); - // console.log(broadcast_author); + const { diff, reference_hash, reference, broadcast_author } = signal.payload; //Check if this signal came from another agent & contains a diff and reference_hash if (diff && reference_hash && reference && broadcast_author) { // console.log(`PerspectiveDiffSync.handleHolochainSignal: @@ -301,39 +234,14 @@ export class LinkAdapter implements LinkSyncAdapter { //console.log("PerspectiveDiffSync.handleHolochainSignal: Getting lock"); //console.log("PerspectiveDiffSync.handleHolochainSignal: Got lock"); - //const parsed = JSON.parse(reference_hash); - // console.log("Handle holochain signal parsed ref hash"); - // console.log(JSON.stringify({ - // diff, - // reference_hash, - // reference, - // broadcast_author - // })); - if (!Buffer.isBuffer(reference_hash)) { - reference_hash = Buffer.from(reference_hash, 'base64'); - } - if (!Buffer.isBuffer(reference.diff)) { - reference.diff = Buffer.from(reference.diff, 'base64'); - } - if (reference.parents) { - reference.parents = reference.parents.map( (parent: string) => parent == 'null' ? null : Buffer.from(parent, 'base64')); - } - - await this.hcDna.call(DNA_NICK, ZOME_NAME, "handle_broadcast", { - diff, - reference_hash, - reference, - broadcast_author - }); this.peers.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); } catch (e) { console.error("PerspectiveDiffSync.handleHolochainSignal: got error", e); } } else { - console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", JSON.stringify(signal.payload)); + //console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", signal.payload); //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal if (this.linkCallback) { - console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback"); await this.linkCallback(signal.payload); } } diff --git a/bootstrap-languages/p-diff-sync/package.json b/bootstrap-languages/p-diff-sync/package.json index e10f1e6c7..b5c18527e 100644 --- a/bootstrap-languages/p-diff-sync/package.json +++ b/bootstrap-languages/p-diff-sync/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/perspective-diff-sync", - "version": "0.6.0", + "version": "0.6.1-prerelease", "description": "An AD4M language for syncing mutations to a share perspective", "main": "index.js", "scripts": { diff --git a/cli/seed_proto.json b/cli/seed_proto.json index e261ea2c2..a158a5c9d 100644 --- a/cli/seed_proto.json +++ b/cli/seed_proto.json @@ -4,11 +4,20 @@ { "meta": { "name": "perspectiveDiffSync", - "description": "Holochain based Perspective link sharing language, with revision signals sent with socket.io", + "description": "Holochain based Perspective link sharing language", "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/p-diff-sync/build/bundle.js" + }, + { + "meta": { + "name": "perspectiveDiffSync", + "description": "Holochain based Perspective link sharing language, with revision signals sent with socket.io", + "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", + "possibleTemplateParams": ["uid", "name", "description"] + }, + "resource": "../bootstrap-languages/p-diff-sync-socket-signaling/build/bundle.js" } ], "agentLanguage": { diff --git a/turbo.json b/turbo.json index 7047c342d..31955bc8a 100644 --- a/turbo.json +++ b/turbo.json @@ -13,7 +13,7 @@ "dependsOn": ["@perspect3vism/perspective-diff-sync#build", "@perspect3vism/agent-language#build", "@perspect3vism/direct-message-language#build", "@perspect3vism/perspective-language#build", "@perspect3vism/language-language#build", "@perspect3vism/neighbourhood-language#build", - "@perspect3vism/file-storage#build"], + "@perspect3vism/file-storage#build", "@perspect3vism/perspective-diff-sync-socket-signaling#build"], "outputs": ["dist/**", "lib/**", "build/**"] }, From d5722b8f53ed4ca149026e3f586c26dae76a765a Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 10 Oct 2023 15:13:03 +0100 Subject: [PATCH 29/87] use master juniper branch & bump chrono --- Cargo.lock | 68 +++++++++++++++------------------------- rust-executor/Cargo.toml | 10 +++--- 2 files changed, 31 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 911f10a29..fdff806ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,7 +389,7 @@ dependencies = [ "num-traits", "rusticata-macros", "thiserror", - "time 0.3.23", + "time", ] [[package]] @@ -1049,7 +1049,7 @@ dependencies = [ "serde", "serde_bytes", "serde_json", - "time 0.3.23", + "time", "uuid 1.4.1", ] @@ -1321,16 +1321,15 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.27" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", "windows-targets 0.48.5", ] @@ -6329,7 +6328,7 @@ dependencies = [ [[package]] name = "juniper" version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "async-trait", "bson", @@ -6338,7 +6337,7 @@ dependencies = [ "futures", "futures-enum", "graphql-parser", - "indexmap 1.9.3", + "indexmap 2.0.0", "juniper_codegen", "serde", "smartstring", @@ -6351,7 +6350,7 @@ dependencies = [ [[package]] name = "juniper_codegen" version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "proc-macro-error", "proc-macro2 1.0.66", @@ -6363,9 +6362,10 @@ dependencies = [ [[package]] name = "juniper_graphql_transport_ws" version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "juniper", + "juniper_graphql_ws", "juniper_subscriptions", "serde", "tokio", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "juniper_graphql_ws" version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "juniper", "juniper_subscriptions", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "juniper_subscriptions" version = "0.17.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "futures", "juniper", @@ -6394,7 +6394,7 @@ dependencies = [ [[package]] name = "juniper_warp" version = "0.8.0-dev" -source = "git+https://github.com/graphql-rust/juniper?branch=graphql-transport-ws-protocol#a6ae3864573977a131723c21c28fba3e812fb09f" +source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" dependencies = [ "anyhow", "futures", @@ -6402,6 +6402,7 @@ dependencies = [ "juniper", "juniper_graphql_transport_ws", "juniper_graphql_ws", + "log", "serde", "serde_json", "thiserror", @@ -6759,7 +6760,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.25", - "time 0.3.23", + "time", "tokio", "toml 0.5.11", "toml 0.7.6", @@ -7253,7 +7254,7 @@ dependencies = [ "dirs-next", "objc-foundation", "objc_id", - "time 0.3.23", + "time", ] [[package]] @@ -8965,7 +8966,7 @@ dependencies = [ "line-wrap", "quick-xml 0.29.0", "serde", - "time 0.3.23", + "time", ] [[package]] @@ -9710,7 +9711,7 @@ checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" dependencies = [ "pem", "ring", - "time 0.3.23", + "time", "yasna", ] @@ -9722,7 +9723,7 @@ checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", "ring", - "time 0.3.23", + "time", "yasna", "zeroize", ] @@ -10874,7 +10875,7 @@ dependencies = [ "serde", "serde_json", "serde_with_macros 3.3.0", - "time 0.3.23", + "time", ] [[package]] @@ -11156,7 +11157,7 @@ dependencies = [ "num-bigint", "num-traits", "thiserror", - "time 0.3.23", + "time", ] [[package]] @@ -12258,7 +12259,7 @@ dependencies = [ "tauri-utils", "tempfile", "thiserror", - "time 0.3.23", + "time", "tokio", "url 2.4.1", "uuid 1.4.1", @@ -12306,7 +12307,7 @@ dependencies = [ "sha2 0.10.7", "tauri-utils", "thiserror", - "time 0.3.23", + "time", "uuid 1.4.1", "walkdir", ] @@ -12615,17 +12616,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", -] - [[package]] name = "time" version = "0.3.23" @@ -13026,7 +13016,7 @@ dependencies = [ "sharded-slab", "smallvec 1.11.0", "thread_local", - "time 0.3.23", + "time", "tracing", "tracing-core", "tracing-log", @@ -13803,12 +13793,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -14871,7 +14855,7 @@ dependencies = [ "oid-registry", "rusticata-macros", "thiserror", - "time 0.3.23", + "time", ] [[package]] @@ -14934,7 +14918,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ - "time 0.3.23", + "time", ] [[package]] @@ -14973,7 +14957,7 @@ dependencies = [ "hmac 0.12.1", "pbkdf2 0.11.0", "sha1", - "time 0.3.23", + "time", "zstd", ] diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index 2ff274e01..dc9560fb2 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -30,7 +30,7 @@ futures = "0.3.28" tokio-stream = { version = "0.1.12", features = ["sync"] } lazy_static = "1.4.0" -chrono = { version = "0.4.24", features = ["serde"] } +chrono = { version = "0.4.30", features = ["serde"] } env_logger = "0.10.0" serde_json = "1.0.95" uuid = "1.3.0" @@ -58,10 +58,10 @@ hyper-util = { git = "https://github.com/hyperium/hyper-util.git" } rust-embed="8.0.0" dirs = "5.0.1" -juniper = { git = "https://github.com/graphql-rust/juniper", branch = "graphql-transport-ws-protocol", features = ["chrono"] } -juniper_subscriptions = { git = "https://github.com/graphql-rust/juniper", branch = "graphql-transport-ws-protocol" } -juniper_graphql_transport_ws = { git = "https://github.com/graphql-rust/juniper", branch = "graphql-transport-ws-protocol" } -juniper_warp = { git = "https://github.com/graphql-rust/juniper", branch = "graphql-transport-ws-protocol", features = ["subscriptions"] } +juniper = { git = "https://github.com/graphql-rust/juniper", features = ["chrono"] } +juniper_subscriptions = { git = "https://github.com/graphql-rust/juniper" } +juniper_graphql_transport_ws = { git = "https://github.com/graphql-rust/juniper" } +juniper_warp = { git = "https://github.com/graphql-rust/juniper", features = ["subscriptions"] } warp = "0.3.4" jsonwebtoken = "8.3.0" From e3827dd2d67a58bbbc78734c6f396fbb6f47d8a7 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 11 Oct 2023 12:09:47 +0530 Subject: [PATCH 30/87] Added cetralized link language with partial implementation --- .../.gitignore | 19 ++ .../README.md | 3 + .../esbuild.ts | 39 ++++ .../index.ts | 26 +++ .../integration-test.js | 20 ++ .../linksAdapter.ts | 210 ++++++++++++++++++ .../package.json | 41 ++++ .../telepresenceAdapter.ts | 47 ++++ .../tsconfig.json | 8 + .../util.ts | 41 ++++ 10 files changed, 454 insertions(+) create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore new file mode 100644 index 000000000..d302556a5 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore @@ -0,0 +1,19 @@ +.cargo +target +hc-dna/workdir/perspective-diff-sync.dna +hc-dna/zomes/tests/node_modules +hc-dna/zomes/tests/out.log +node_modules +.hc* +perspect-diff-sync.dna +*.log +.turbo + +*.js +*.js.map +!rollup.config* +!.dna.js +!integration-test.js + +.ad4m-test +ad4m-test-* \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md new file mode 100644 index 000000000..dadc2cd48 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md @@ -0,0 +1,3 @@ +# Perspective Diff Sync + +Git like holochain syncing DNA for sharing of mutation to a shared perspective. \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts new file mode 100644 index 000000000..add19e15b --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts @@ -0,0 +1,39 @@ +import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/mod.js"; +// Import the WASM build on platforms where running subprocesses is not +// permitted, such as Deno Deploy, or when running without `--allow-run`. +// import * as esbuild from "https://deno.land/x/esbuild@v0.17.18/wasm.js"; + +import { denoPlugins } from "https://deno.land/x/esbuild_deno_loader@0.7.0/mod.ts"; +import { loadSource, resolveUrl } from "./customHttpDownloader.js"; + +const result = await esbuild.build({ + plugins: [ + { + name: `buffer-alias`, + setup(build) { + build.onResolve({ filter: new RegExp(`^buffer$`) }, (args) => { + return { path: `https://deno.land/std@0.177.0/node/buffer.ts`, namespace: 'imports' }; + }); + + build.onResolve({filter: /.*/, namespace: 'imports'}, resolveUrl) + + build.onLoad({filter: /.*/, namespace: 'imports'}, (args) => { + return loadSource(args) + }) + }, + }, + ...denoPlugins() + ], + entryPoints: ['index.ts'], + outfile: 'build/bundle.js', + bundle: true, + platform: 'node', + target: 'deno1.32.4', + format: 'esm', + globalName: 'centralized.perspective.diff.sync.language', + charset: 'ascii', + legalComments: 'inline' +}); +console.log(result.outputFiles); + +esbuild.stop(); \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts new file mode 100644 index 000000000..b84ebe4c2 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts @@ -0,0 +1,26 @@ +import type { Address, Language, Interaction, HolochainLanguageDelegate, LanguageContext, AgentService } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import { LinkAdapter } from "./linksAdapter.ts"; +import { TelepresenceAdapterImplementation } from "./telepresenceAdapter.ts"; + +function interactions(expression: Address): Interaction[] { + return []; +} + +//!@ad4m-template-variable +const name = "centralized-perspective-diff-sync"; + +//!@ad4m-template-variable +const uid = "centralized-perspective-diff-sync-uuid"; + +export default async function create(context: LanguageContext): Promise { + const linksAdapter = new LinkAdapter(context, uid); + const telepresenceAdapter = new TelepresenceAdapterImplementation(context); + + //@ts-ignore + return { + name, + linksAdapter, + interactions, + telepresenceAdapter + } as Language; +} diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js new file mode 100644 index 000000000..a8b36a0bd --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js @@ -0,0 +1,20 @@ +const { spawnLinkAgent } = require("@perspect3vism/ad4m-test/helpers"); + +describe("Link", () => { + it("Create Link", async () => { + const agent = await spawnLinkAgent(); + + const all = await agent.queryLinks({}); + + expect(all.length).toBe(0) + + const link = await agent.addLink({source:"root", predicate: "soic://test", target:"QmYVsrMpiFmV9S7bTWNAkUzSqjRJskQ8g4TWKKwKrHAPqL://QmSsCCtXMDAZXMpyiNLzwjGEU4hLmhG7fphidhEEodQ4Wy"}) + + const all1 = await agent.queryLinks({}); + + expect(all1.length).toBe(1) + expect(all1[0].data.source).toBe(link.data.source) + expect(all1[0].data.predicate).toBe(link.data.predicate) + expect(all1[0].data.target).toBe(link.data.target) + }); +}) \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts new file mode 100644 index 000000000..f98d10a2f --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -0,0 +1,210 @@ +import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, LanguageContext, PerspectiveDiff, + LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; +import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; +import { io } from "https://esm.sh/socket.io-client@4.7.2"; +import makeHttpRequest from "./util.ts"; + +class PeerInfo { + //@ts-ignore + currentRevision: Buffer; + //@ts-ignore + lastSeen: Date; +}; + +export class LinkAdapter implements LinkSyncAdapter { + linkCallback?: PerspectiveDiffObserver + syncStateChangeCallback?: SyncStateChangeObserver + peers: Map = new Map(); + generalMutex: Mutex = withTimeout(new Mutex(), 10000, new Error('PerspectiveDiffSync: generalMutex timeout')); + me: DID + gossipLogCount: number = 0; + myCurrentRevision: any | null = null; + languageName: String | null = null; + socket: any; + + constructor(context: LanguageContext, name: String) { + this.me = context.agent.did; + this.languageName = name; + this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + console.log("Created socket connection"); + this.socket.on('error', (error: any) => { + console.error('Error:', error); + }); + this.socket.on('connect', () => { + console.log('Connected to the server'); + try { + this.socket.emit("join-room", this.languageName); + console.log("Sent the join-room signal"); + } catch (e) { + console.error("Error in socket connection: ", e); + } + }); + this.socket.on("signal", (signal: any) => { + this.handleHolochainSignal(signal); + }); + this.socket.on('disconnect', () => { + console.log('Disconnected from the server'); + }); + this.socket.on('connect_error', (error) => { + console.error('Connection Error:', error); + }); + this.socket.on('reconnect_attempt', () => { + console.log('Trying to reconnect...'); + }); + } + + writable(): boolean { + return true; + } + + public(): boolean { + return false; + } + + async others(): Promise { + // @ts-ignore + return await makeHttpRequest("http://127.0.0.1:8787/getActiveAgent", "GET", {}, { + LinkLanguageUUID: this.languageName, + did: this.me + }) + } + + async currentRevision(): Promise { + //@ts-ignore + const result = await makeHttpRequest("http://127.0.0.1:8787/render", "GET", {}, { + LinkLanguageUUID: this.languageName + }) + + if (result) { + //@ts-ignore + return result.hash as string; + } + + return ""; + } + + async sync(): Promise { + //console.log("PerspectiveDiffSync.sync(); Getting lock"); + const release = await this.generalMutex.acquire(); + //console.log("PerspectiveDiffSync.sync(); Got lock"); + try { + //@ts-ignore + const result = await makeHttpRequest("http://127.0.0.1:8787/sync", "GET", {}, { + LinkLanguageUUID: this.languageName, + hash: this.myCurrentRevision.hash, + timestamp: this.myCurrentRevision.timestamp + }) + } catch (e) { + console.error("PerspectiveDiffSync.sync(); got error", e); + } finally { + release(); + } + return new PerspectiveDiff() + } + + async render(): Promise { + //@ts-ignore + const result = await makeHttpRequest("http://127.0.0.1:8787/render", "GET", {}, { + LinkLanguageUUID: this.languageName + }) + return new Perspective(result); + } + + async commit(diff: PerspectiveDiff): Promise { + const release = await this.generalMutex.acquire(); + try { + let prep_diff = { + additions: diff.additions.map((diff) => prepareLinkExpression(diff)), + removals: diff.removals.map((diff) => prepareLinkExpression(diff)) + } + + const result = await makeHttpRequest("http://127.0.0.1:8787/commit", "POST", {}, { + ...prep_diff, + LinkLanguageUUID: this.languageName + }) + + this.myCurrentRevision = result; + + this.socket.emit("broadcast", {roomId: this.languageName, signal: { + reference_hash: "", + diff: prep_diff, + broadcast_author: this.me + }}); + return ; + } catch (e) { + console.error("PerspectiveDiffSync.commit(); got error", e); + } finally { + release(); + } + } + + addCallback(callback: PerspectiveDiffObserver): number { + this.linkCallback = callback; + return 1; + } + + addSyncStateChangeCallback(callback: SyncStateChangeObserver): number { + this.syncStateChangeCallback = callback; + return 1; + } + + async handleHolochainSignal(signal: any): Promise { + let diff; + let reference_hash; + let reference; + let broadcast_author; + if (signal.payload) { + ({ diff, reference_hash, reference, broadcast_author } = signal.payload); + } else { + ({ diff, reference_hash, reference, broadcast_author } = signal); + } + + if (diff && reference_hash && reference && broadcast_author) { + try { + this.peers.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); + } catch (e) { + console.error("PerspectiveDiffSync.handleHolochainSignal: got error", e); + } + } else { + console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", JSON.stringify(signal.payload)); + //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal + if (this.linkCallback) { + console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback"); + await this.linkCallback(signal.payload); + } + } + } + + async addActiveAgentLink(hcDna: HolochainLanguageDelegate): Promise { + const result = await makeHttpRequest("http://127.0.0.1:8787/addActiveAgent", "POST", {}, { + LinkLanguageUUID: this.languageName, + did: this.me + }) + + return result + } +} + +function prepareLinkExpression(link: LinkExpression): object { + const data = Object.assign(link); + if (data.data.source == "") { + data.data.source = null; + } + if (data.data.target == "") { + data.data.target = null; + } + if (data.data.predicate == "") { + data.data.predicate = null; + } + if (data.data.source == undefined) { + data.data.source = null; + } + if (data.data.target == undefined) { + data.data.target = null; + } + if (data.data.predicate == undefined) { + data.data.predicate = null; + } + return data; +} diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json new file mode 100644 index 000000000..3494205c4 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json @@ -0,0 +1,41 @@ +{ + "name": "@perspect3vism/centralized-perspective-diff-sync-socket-signaling", + "version": "0.6.0", + "description": "An AD4M language for syncing mutations to a share perspective", + "main": "index.js", + "scripts": { + "build": "run-script-os", + "build:linux": "yarn run build-common", + "build:macos": "yarn run build-common", + "build:windows": "yarn run build-common", + "build-common": "deno run --allow-all esbuild.ts", + "integration-test": "node ../../test-runner/build/cli.js --test ./integration-test.js --bundle \"./build/bundle.js\" --meta '{\"name\":\"p-diff-sync\",\"description\":\"Holochain based language for sharing Perspectives\",\"sourceCodeLink\":\"https://github.com/perspect3vism/perspective-diff-sync\",\"possibleTemplateParams\":[\"uid\",\"name\"]}'" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m-test": "*", + "@perspect3vism/rollup-plugin-dna": "^0.0.2", + "@rollup/plugin-commonjs": "^14.0.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^8.0.0", + "@rollup/plugin-typescript": "^4.0.0", + "@tsconfig/svelte": "^1.0.0", + "@types/node": "^18.0.0", + "faker": "^5.5.3", + "rollup": "^2.3.4", + "rollup-plugin-postcss": "^3.1.8", + "rollup-plugin-string": "^3.0.0", + "rollup-plugin-svelte": "^6.0.0", + "rollup-plugin-terser": "^7.0.0", + "svelte": "^3.0.0", + "svelte-check": "^1.0.0", + "svelte-preprocess": "^4.0.0", + "tslib": "^2.0.0", + "typescript": "^4.5.5" + }, + "devDependencies": { + "run-script-os": "^1.1.6" + } +} diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts new file mode 100644 index 000000000..00e3d3b54 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts @@ -0,0 +1,47 @@ +import type { TelepresenceAdapter, OnlineAgent, PerspectiveExpression, DID, TelepresenceSignalCallback, HolochainLanguageDelegate, LanguageContext } from "https://esm.sh/@perspect3vism/ad4m@0.5.0";; +import makeHttpRequest from "./util.ts"; + +export class TelepresenceAdapterImplementation implements TelepresenceAdapter { + me: DID + uuid: string; + hcDna: HolochainLanguageDelegate; + signalCallbacks: TelepresenceSignalCallback[] = []; + + constructor(context: LanguageContext, uuid: string) { + this.hcDna = context.Holochain as HolochainLanguageDelegate; + this.me = context.agent.did; + this.uuid = uuid; + } + + async setOnlineStatus(status: PerspectiveExpression): Promise { + await makeHttpRequest("http://127.0.0.1:8787/setStatus", "POST", {}, { + did: this.me, + link: status, + LinkLanguageUUID: this.uuid + }) + } + + async getOnlineAgents(): Promise { + const result = await makeHttpRequest("http://127.0.0.1:8787/getOnlineAgents", "GET", {}, { + did: this.me, + LinkLanguageUUID: this.uuid + }) + + // @ts-ignore + return result + } + + async sendSignal(remoteAgentDid: string, payload: PerspectiveExpression): Promise { + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_signal", {remote_agent_did: remoteAgentDid, payload}); + return res; + } + + async sendBroadcast(payload: PerspectiveExpression): Promise { + let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_broadcast", payload); + return res; + } + + async registerSignalCallback(callback: TelepresenceSignalCallback): Promise { + this.signalCallbacks.push(callback); + } +} \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json new file mode 100644 index 000000000..132461b20 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "types": ["node"], + }, + "include": ["*.ts"], + "exclude": ["node_modules/*", "__sapper__/*", "public/*"], +} \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts new file mode 100644 index 000000000..e59dcbd54 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts @@ -0,0 +1,41 @@ +import http from 'node:http'; + +export default function makeHttpRequest(url, method, queryParams, requestBody) { + return new Promise((resolve, reject) => { + const urlWithParams = new URL(url); + urlWithParams.search = new URLSearchParams(queryParams).toString(); + + const options = { + method: method.toUpperCase(), + headers: { + 'Content-Type': 'application/json', + }, + }; + + if (requestBody) { + options.headers['Content-Length'] = Buffer.from(JSON.stringify(requestBody)).length; + } + + const req = http.request(urlWithParams, options, (res) => { + let data = ''; + res.on('data', (chunk) => { + data += chunk; + }); + + res.on('end', () => { + resolve(data); + }); + }); + + req.on('error', (error) => { + reject(error); + }); + + if (requestBody) { + req.write(JSON.stringify(requestBody)); + } + + req.end(); + }); +} + From f852bd8cae074ea6770eac83b90af65ead4b2aae Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 11 Oct 2023 16:50:08 +0530 Subject: [PATCH 31/87] Added link callback when sync is called --- .../centralized-p-diff-sync-socket-signaling/linksAdapter.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index f98d10a2f..3ba2f194d 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -95,6 +95,8 @@ export class LinkAdapter implements LinkSyncAdapter { hash: this.myCurrentRevision.hash, timestamp: this.myCurrentRevision.timestamp }) + + this.linkCallback(result) } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); } finally { From 2f9547b35dcc0a8818db6e1a8f6f0d7474a94804 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 11 Oct 2023 19:32:37 +0530 Subject: [PATCH 32/87] Pulls from when the agent joins the socket room --- .../centralized-p-diff-sync-socket-signaling/linksAdapter.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 3ba2f194d..9ff06b90a 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -31,9 +31,11 @@ export class LinkAdapter implements LinkSyncAdapter { this.socket.on('error', (error: any) => { console.error('Error:', error); }); - this.socket.on('connect', () => { + this.socket.on('connect', async () => { console.log('Connected to the server'); try { + await this.sync(); + this.socket.emit("join-room", this.languageName); console.log("Sent the join-room signal"); } catch (e) { From c2d620b8339b432be1a2e6ab197e71d49f119805 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 11 Oct 2023 15:29:04 +0100 Subject: [PATCH 33/87] add logic for adding other agents --- .../linksAdapter.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 9ff06b90a..19ec62e5f 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -26,6 +26,9 @@ export class LinkAdapter implements LinkSyncAdapter { constructor(context: LanguageContext, name: String) { this.me = context.agent.did; this.languageName = name; + + this.addAgentRecord(); + this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); console.log("Created socket connection"); this.socket.on('error', (error: any) => { @@ -66,9 +69,8 @@ export class LinkAdapter implements LinkSyncAdapter { async others(): Promise { // @ts-ignore - return await makeHttpRequest("http://127.0.0.1:8787/getActiveAgent", "GET", {}, { - LinkLanguageUUID: this.languageName, - did: this.me + return await makeHttpRequest("http://127.0.0.1:8787/getOthers", "GET", {}, { + LinkLanguageUUID: this.languageName }) } @@ -180,13 +182,15 @@ export class LinkAdapter implements LinkSyncAdapter { } } - async addActiveAgentLink(hcDna: HolochainLanguageDelegate): Promise { - const result = await makeHttpRequest("http://127.0.0.1:8787/addActiveAgent", "POST", {}, { - LinkLanguageUUID: this.languageName, - did: this.me - }) + async addAgentRecord(): Promise { + const others = await this.others(); - return result + if (others.filter((other) => other === this.me).length == 0) { + const result = await makeHttpRequest("http://127.0.0.1:8787/addAgent", "POST", {}, { + LinkLanguageUUID: this.languageName, + did: this.me + }) + } } } From 72b50e5222d410db160be84b455171f462d7a4a5 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 11 Oct 2023 16:10:30 +0100 Subject: [PATCH 34/87] cleanup link language implementation --- .../index.ts | 2 +- .../linksAdapter.ts | 81 ++++++------------- 2 files changed, 26 insertions(+), 57 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts index b84ebe4c2..da6352a41 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts @@ -14,7 +14,7 @@ const uid = "centralized-perspective-diff-sync-uuid"; export default async function create(context: LanguageContext): Promise { const linksAdapter = new LinkAdapter(context, uid); - const telepresenceAdapter = new TelepresenceAdapterImplementation(context); + const telepresenceAdapter = new TelepresenceAdapterImplementation(context, uid); //@ts-ignore return { diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 19ec62e5f..6fb8cd18b 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -5,27 +5,18 @@ import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; import { io } from "https://esm.sh/socket.io-client@4.7.2"; import makeHttpRequest from "./util.ts"; -class PeerInfo { - //@ts-ignore - currentRevision: Buffer; - //@ts-ignore - lastSeen: Date; -}; - export class LinkAdapter implements LinkSyncAdapter { linkCallback?: PerspectiveDiffObserver syncStateChangeCallback?: SyncStateChangeObserver - peers: Map = new Map(); generalMutex: Mutex = withTimeout(new Mutex(), 10000, new Error('PerspectiveDiffSync: generalMutex timeout')); me: DID - gossipLogCount: number = 0; myCurrentRevision: any | null = null; - languageName: String | null = null; + languageUid: String | null = null; socket: any; - constructor(context: LanguageContext, name: String) { + constructor(context: LanguageContext, uid: String) { this.me = context.agent.did; - this.languageName = name; + this.languageUid = uid; this.addAgentRecord(); @@ -39,14 +30,14 @@ export class LinkAdapter implements LinkSyncAdapter { try { await this.sync(); - this.socket.emit("join-room", this.languageName); + this.socket.emit("join-room", this.languageUid); console.log("Sent the join-room signal"); } catch (e) { console.error("Error in socket connection: ", e); } }); this.socket.on("signal", (signal: any) => { - this.handleHolochainSignal(signal); + this.handleSignal(signal); }); this.socket.on('disconnect', () => { console.log('Disconnected from the server'); @@ -70,14 +61,15 @@ export class LinkAdapter implements LinkSyncAdapter { async others(): Promise { // @ts-ignore return await makeHttpRequest("http://127.0.0.1:8787/getOthers", "GET", {}, { - LinkLanguageUUID: this.languageName + LinkLanguageUUID: this.languageUid }) } async currentRevision(): Promise { //@ts-ignore - const result = await makeHttpRequest("http://127.0.0.1:8787/render", "GET", {}, { - LinkLanguageUUID: this.languageName + const result = await makeHttpRequest("http://127.0.0.1:8787/currentRevision", "GET", {}, { + LinkLanguageUUID: this.languageUid, + did: this.me }) if (result) { @@ -93,14 +85,14 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); //console.log("PerspectiveDiffSync.sync(); Got lock"); try { - //@ts-ignore - const result = await makeHttpRequest("http://127.0.0.1:8787/sync", "GET", {}, { - LinkLanguageUUID: this.languageName, - hash: this.myCurrentRevision.hash, - timestamp: this.myCurrentRevision.timestamp - }) + //@ts-ignore + const result = await makeHttpRequest("http://127.0.0.1:8787/sync", "GET", {}, { + LinkLanguageUUID: this.languageUid, + did: this.me, + timestamp: this.myCurrentRevision.timestamp + }) - this.linkCallback(result) + this.linkCallback(result) } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); } finally { @@ -112,7 +104,7 @@ export class LinkAdapter implements LinkSyncAdapter { async render(): Promise { //@ts-ignore const result = await makeHttpRequest("http://127.0.0.1:8787/render", "GET", {}, { - LinkLanguageUUID: this.languageName + LinkLanguageUUID: this.languageUid }) return new Perspective(result); } @@ -127,16 +119,12 @@ export class LinkAdapter implements LinkSyncAdapter { const result = await makeHttpRequest("http://127.0.0.1:8787/commit", "POST", {}, { ...prep_diff, - LinkLanguageUUID: this.languageName + LinkLanguageUUID: this.languageUid }) this.myCurrentRevision = result; - this.socket.emit("broadcast", {roomId: this.languageName, signal: { - reference_hash: "", - diff: prep_diff, - broadcast_author: this.me - }}); + this.socket.emit("broadcast", {roomId: this.languageUid, signal: prep_diff}); return ; } catch (e) { console.error("PerspectiveDiffSync.commit(); got error", e); @@ -155,30 +143,11 @@ export class LinkAdapter implements LinkSyncAdapter { return 1; } - async handleHolochainSignal(signal: any): Promise { - let diff; - let reference_hash; - let reference; - let broadcast_author; - if (signal.payload) { - ({ diff, reference_hash, reference, broadcast_author } = signal.payload); - } else { - ({ diff, reference_hash, reference, broadcast_author } = signal); - } - - if (diff && reference_hash && reference && broadcast_author) { - try { - this.peers.set(broadcast_author, { currentRevision: reference_hash, lastSeen: new Date() }); - } catch (e) { - console.error("PerspectiveDiffSync.handleHolochainSignal: got error", e); - } - } else { - console.log("PerspectiveDiffSync.handleHolochainSignal: received a signals from ourselves in fast_forward_signal or in a pull: ", JSON.stringify(signal.payload)); - //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal - if (this.linkCallback) { - console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback"); - await this.linkCallback(signal.payload); - } + async handleSignal(signal: any): Promise { + //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal + if (this.linkCallback) { + console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback", signal); + await this.linkCallback(signal); } } @@ -187,7 +156,7 @@ export class LinkAdapter implements LinkSyncAdapter { if (others.filter((other) => other === this.me).length == 0) { const result = await makeHttpRequest("http://127.0.0.1:8787/addAgent", "POST", {}, { - LinkLanguageUUID: this.languageName, + LinkLanguageUUID: this.languageUid, did: this.me }) } From bbcc85beed17323a035676a6671f3d9bb1b53ca7 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 12 Oct 2023 00:03:26 +0530 Subject: [PATCH 35/87] Link language updated to use signals --- .../linksAdapter.ts | 81 +++++++++++-------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 6fb8cd18b..14eeb1364 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -28,7 +28,10 @@ export class LinkAdapter implements LinkSyncAdapter { this.socket.on('connect', async () => { console.log('Connected to the server'); try { - await this.sync(); + this.socket.emit("sync", { + linkLanguageUUID: this.languageUid, + did: this.me, + }) this.socket.emit("join-room", this.languageUid); console.log("Sent the join-room signal"); @@ -39,6 +42,9 @@ export class LinkAdapter implements LinkSyncAdapter { this.socket.on("signal", (signal: any) => { this.handleSignal(signal); }); + this.socket.on("sync-emit", (signal: any) => { + this.handleSignal(signal); + }); this.socket.on('disconnect', () => { console.log('Disconnected from the server'); }); @@ -85,14 +91,10 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); //console.log("PerspectiveDiffSync.sync(); Got lock"); try { - //@ts-ignore - const result = await makeHttpRequest("http://127.0.0.1:8787/sync", "GET", {}, { - LinkLanguageUUID: this.languageUid, + this.socket.emit("sync", { + linkLanguageUUID: this.languageUid, did: this.me, - timestamp: this.myCurrentRevision.timestamp }) - - this.linkCallback(result) } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); } finally { @@ -102,35 +104,50 @@ export class LinkAdapter implements LinkSyncAdapter { } async render(): Promise { - //@ts-ignore - const result = await makeHttpRequest("http://127.0.0.1:8787/render", "GET", {}, { - LinkLanguageUUID: this.languageUid - }) - return new Perspective(result); - } - - async commit(diff: PerspectiveDiff): Promise { - const release = await this.generalMutex.acquire(); - try { - let prep_diff = { - additions: diff.additions.map((diff) => prepareLinkExpression(diff)), - removals: diff.removals.map((diff) => prepareLinkExpression(diff)) - } + return new Promise((resolve) => { + this.socket.emit("render", { + linkLanguageUUID: this.languageUid, + }) - const result = await makeHttpRequest("http://127.0.0.1:8787/commit", "POST", {}, { - ...prep_diff, - LinkLanguageUUID: this.languageUid + this.socket.on("render-emit", (signal) => { + resolve(new Perspective(signal.payload)) }) + }); + } - this.myCurrentRevision = result; + async commit(diff: PerspectiveDiff): Promise { + return new Promise(async (resolve, reject) => { + const release = await this.generalMutex.acquire(); + + try { + let prep_diff = { + additions: diff.additions.map((diff) => prepareLinkExpression(diff)), + removals: diff.removals.map((diff) => prepareLinkExpression(diff)) + } + + this.socket.emit("commit", { + additions: diff.additions.map((diff) => prepareLinkExpression(diff)), + removals: diff.removals.map((diff) => prepareLinkExpression(diff)), + linkLanguageUUID: this.languageUid, + did: this.me, + }) - this.socket.emit("broadcast", {roomId: this.languageUid, signal: prep_diff}); - return ; - } catch (e) { - console.error("PerspectiveDiffSync.commit(); got error", e); - } finally { - release(); - } + this.socket.on("commit-status", (signal) => { + if (signal.status === "Ok") { + resolve(null); + } else { + reject() + } + }); + + return ; + } catch (e) { + console.error("PerspectiveDiffSync.commit(); got error", e); + } finally { + release(); + reject(null); + } + }) } addCallback(callback: PerspectiveDiffObserver): number { From b702d3465dc55f844e7a83d4398845443c473d43 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 11 Oct 2023 21:04:48 +0100 Subject: [PATCH 36/87] add the remaining logic for the link lang --- .../linksAdapter.ts | 121 ++++++++++++------ 1 file changed, 83 insertions(+), 38 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 14eeb1364..782753b89 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -13,49 +13,85 @@ export class LinkAdapter implements LinkSyncAdapter { myCurrentRevision: any | null = null; languageUid: String | null = null; socket: any; + hasCalledSync = false; constructor(context: LanguageContext, uid: String) { this.me = context.agent.did; this.languageUid = uid; - this.addAgentRecord(); + //this.addAgentRecord(); this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); console.log("Created socket connection"); + this.socket.on('error', (error: any) => { console.error('Error:', error); }); + this.socket.on('connect', async () => { console.log('Connected to the server'); try { - this.socket.emit("sync", { - linkLanguageUUID: this.languageUid, - did: this.me, - }) - this.socket.emit("join-room", this.languageUid); console.log("Sent the join-room signal"); } catch (e) { console.error("Error in socket connection: ", e); } }); - this.socket.on("signal", (signal: any) => { - this.handleSignal(signal); - }); - this.socket.on("sync-emit", (signal: any) => { - this.handleSignal(signal); + + //Response from a given call to sync; contains all the data we need to update our local state and our recordTimestamp as held by the server + this.socket.on("sync-emit", (signal) => { + console.log("Got some result from sync", signal, this.myCurrentRevision.timestamp); + + this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; + this.updateServerSyncState(); + this.hasCalledSync = true; + + this.handleSignal(signal.payload); + + //Emit and event saying that we are synced + this.syncStateChangeCallback(PerspectiveState.Synced); }); + + //Response from a given call to commit by us or any other agent + //contains all the data we need to update our local state and our recordTimestamp as held by the server + this.socket.on("signal-emit", (signal) => { + console.log("Got some live signal from the server", signal, this.myCurrentRevision.timestamp); + + let serverRecordTimestamp = signal.serverRecordTimestamp; + if (!this.myCurrentRevision.timestamp || this.myCurrentRevision.timestamp < serverRecordTimestamp) { + this.myCurrentRevision.timestamp = serverRecordTimestamp; + this.updateServerSyncState(); + + this.handleSignal(signal.payload); + } + }) + this.socket.on('disconnect', () => { console.log('Disconnected from the server'); }); + this.socket.on('connect_error', (error) => { console.error('Connection Error:', error); }); + + this.socket.on('reconnect', (attemptNumber) => { + console.log('Reconnected to the server on attempt:', attemptNumber); + + //If we have disconnected and reconnected, we need to sync again + this.hasCalledSync = false; + this.sync(); + }); + this.socket.on('reconnect_attempt', () => { console.log('Trying to reconnect...'); }); } + //Tell the server that we have updated our current timestamp so that the server can keep in sync with what we have seen + updateServerSyncState() { + this.socket.emit("update-sync-state", {did: this.me, date: this.myCurrentRevision.timestamp, linkLanguageUUID: this.languageUid}) + } + writable(): boolean { return true; } @@ -66,50 +102,58 @@ export class LinkAdapter implements LinkSyncAdapter { async others(): Promise { // @ts-ignore - return await makeHttpRequest("http://127.0.0.1:8787/getOthers", "GET", {}, { - LinkLanguageUUID: this.languageUid + return await makeHttpRequest("https://socket.ad4m.dev/getOthers", "GET", {}, { + linkLanguageUUID: this.languageUid }) } async currentRevision(): Promise { //@ts-ignore - const result = await makeHttpRequest("http://127.0.0.1:8787/currentRevision", "GET", {}, { - LinkLanguageUUID: this.languageUid, + const result = await makeHttpRequest("https://socket.ad4m.dev/currentRevision", "POST", {}, { + linkLanguageUUID: this.languageUid, did: this.me }) if (result) { //@ts-ignore - return result.hash as string; + return result.currentRevision; } return ""; } + //Call sync on the server, which will should fetch all the links we missed since last start of the link language async sync(): Promise { - //console.log("PerspectiveDiffSync.sync(); Getting lock"); - const release = await this.generalMutex.acquire(); - //console.log("PerspectiveDiffSync.sync(); Got lock"); - try { - this.socket.emit("sync", { - linkLanguageUUID: this.languageUid, - did: this.me, - }) - } catch (e) { - console.error("PerspectiveDiffSync.sync(); got error", e); - } finally { - release(); + //Only allow sync to be called once since once we have sync'd once we will get future links via signal + if (!this.hasCalledSync) { + //console.log("PerspectiveDiffSync.sync(); Getting lock"); + const release = await this.generalMutex.acquire(); + //console.log("PerspectiveDiffSync.sync(); Got lock"); + try { + this.socket.emit("sync", { + linkLanguageUUID: this.languageUid, + did: this.me, + }); + } catch (e) { + console.error("PerspectiveDiffSync.sync(); got error", e); + } finally { + release(); + } } return new PerspectiveDiff() } + //Fetch all the links from the server async render(): Promise { return new Promise((resolve) => { + //Send the request to get the links this.socket.emit("render", { linkLanguageUUID: this.languageUid, }) + //Wait for the response this.socket.on("render-emit", (signal) => { + this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; resolve(new Perspective(signal.payload)) }) }); @@ -119,12 +163,8 @@ export class LinkAdapter implements LinkSyncAdapter { return new Promise(async (resolve, reject) => { const release = await this.generalMutex.acquire(); - try { - let prep_diff = { - additions: diff.additions.map((diff) => prepareLinkExpression(diff)), - removals: diff.removals.map((diff) => prepareLinkExpression(diff)) - } - + try { + //Send the commit to the server this.socket.emit("commit", { additions: diff.additions.map((diff) => prepareLinkExpression(diff)), removals: diff.removals.map((diff) => prepareLinkExpression(diff)), @@ -132,8 +172,13 @@ export class LinkAdapter implements LinkSyncAdapter { did: this.me, }) + //Wait for a response saying that the commit was successful this.socket.on("commit-status", (signal) => { if (signal.status === "Ok") { + //Update our local timestamp to match the server + this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; + this.updateServerSyncState(); + resolve(null); } else { reject() @@ -172,10 +217,10 @@ export class LinkAdapter implements LinkSyncAdapter { const others = await this.others(); if (others.filter((other) => other === this.me).length == 0) { - const result = await makeHttpRequest("http://127.0.0.1:8787/addAgent", "POST", {}, { - LinkLanguageUUID: this.languageUid, - did: this.me - }) + const result = await makeHttpRequest("https://socket.ad4m.dev/addAgent", "POST", {}, { + linkLanguageUUID: this.languageUid, + did: this.me + }) } } } From 4b32361c4a1c378a3605e80fe48eaee5622dd159 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 11 Oct 2023 21:08:10 +0100 Subject: [PATCH 37/87] add missing build files --- .../.gitignore | 1 + .../customHttpDownloader.js | 72 +++++++++++++++++++ .../p-diff-sync-socket-signaling/.gitignore | 1 + .../customHttpDownloader.js | 72 +++++++++++++++++++ turbo.json | 3 +- 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/customHttpDownloader.js diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore index d302556a5..09c11a0c7 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore @@ -14,6 +14,7 @@ perspect-diff-sync.dna !rollup.config* !.dna.js !integration-test.js +!customHttpDownloader.js .ad4m-test ad4m-test-* \ No newline at end of file diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js new file mode 100644 index 000000000..d4070dd10 --- /dev/null +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js @@ -0,0 +1,72 @@ +let setup = ({onResolve, onLoad}) => { + onResolve({filter: /^https:\/\/github.com/}, resolveFile) + onResolve({filter: /.*/, namespace: 'http-fetch'}, resolveUrl) + onLoad({filter: /.*/, namespace: 'http-fetch'}, loadSource) +} + +let resolveFile = ({path}) => { + return { + path: path, + namespace: 'http-fetch' + } +} + +export let resolveUrl = ({path, importer}) => { + return { + path: new URL(path, importer).href, + namespace: 'imports' + } +} + +export let loadSource = async ({path}) => { + let source; + if (path.includes('perspect3vism')) { + const commit = path.split("#"); + + const url = `${commit[0].replace("https://github.com", "https://raw.githubusercontent.com")}/${commit[1]}/lib/bundle.js` + + path = url; + } + + source = await fetch(path) + + if (!source.ok) { + let message = `GET ${path} failed: status ${source.status}` + throw new Error(message) + } + + let contents = await source.text() + let pattern = /\/\/# sourceMappingURL=(\S+)/ + let match = contents.match(pattern) + if (match) { + let url = new URL(match[1], source.url) + let dataurl = await loadMap(url) + let comment = `//# sourceMappingURL=${dataurl}` + contents = contents.replace(pattern, comment) + } + + + + let {pathname} = new URL(source.url) + let loader = pathname.match(/[^.]+$/)[0] + + loader = loader === 'mjs' ? 'js' : loader + return {contents, loader} +} + +let loadMap = async url => { + let map = await fetch(url) + let type = map.headers.get('content-type').replace(/\s/g, '') + let buffer = await map.arrayBuffer() + let blob = new Blob([buffer], {type}) + let reader = new FileReader() + return new Promise(cb => { + reader.onload = e => cb(e.target.result) + reader.readAsDataURL(blob) + }) +} + +export default { + name: "custom-http-fetch", + setup +}; \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore index d302556a5..09c11a0c7 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore +++ b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore @@ -14,6 +14,7 @@ perspect-diff-sync.dna !rollup.config* !.dna.js !integration-test.js +!customHttpDownloader.js .ad4m-test ad4m-test-* \ No newline at end of file diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/customHttpDownloader.js b/bootstrap-languages/p-diff-sync-socket-signaling/customHttpDownloader.js new file mode 100644 index 000000000..d4070dd10 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/customHttpDownloader.js @@ -0,0 +1,72 @@ +let setup = ({onResolve, onLoad}) => { + onResolve({filter: /^https:\/\/github.com/}, resolveFile) + onResolve({filter: /.*/, namespace: 'http-fetch'}, resolveUrl) + onLoad({filter: /.*/, namespace: 'http-fetch'}, loadSource) +} + +let resolveFile = ({path}) => { + return { + path: path, + namespace: 'http-fetch' + } +} + +export let resolveUrl = ({path, importer}) => { + return { + path: new URL(path, importer).href, + namespace: 'imports' + } +} + +export let loadSource = async ({path}) => { + let source; + if (path.includes('perspect3vism')) { + const commit = path.split("#"); + + const url = `${commit[0].replace("https://github.com", "https://raw.githubusercontent.com")}/${commit[1]}/lib/bundle.js` + + path = url; + } + + source = await fetch(path) + + if (!source.ok) { + let message = `GET ${path} failed: status ${source.status}` + throw new Error(message) + } + + let contents = await source.text() + let pattern = /\/\/# sourceMappingURL=(\S+)/ + let match = contents.match(pattern) + if (match) { + let url = new URL(match[1], source.url) + let dataurl = await loadMap(url) + let comment = `//# sourceMappingURL=${dataurl}` + contents = contents.replace(pattern, comment) + } + + + + let {pathname} = new URL(source.url) + let loader = pathname.match(/[^.]+$/)[0] + + loader = loader === 'mjs' ? 'js' : loader + return {contents, loader} +} + +let loadMap = async url => { + let map = await fetch(url) + let type = map.headers.get('content-type').replace(/\s/g, '') + let buffer = await map.arrayBuffer() + let blob = new Blob([buffer], {type}) + let reader = new FileReader() + return new Promise(cb => { + reader.onload = e => cb(e.target.result) + reader.readAsDataURL(blob) + }) +} + +export default { + name: "custom-http-fetch", + setup +}; \ No newline at end of file diff --git a/turbo.json b/turbo.json index 31955bc8a..fca6589cc 100644 --- a/turbo.json +++ b/turbo.json @@ -13,7 +13,8 @@ "dependsOn": ["@perspect3vism/perspective-diff-sync#build", "@perspect3vism/agent-language#build", "@perspect3vism/direct-message-language#build", "@perspect3vism/perspective-language#build", "@perspect3vism/language-language#build", "@perspect3vism/neighbourhood-language#build", - "@perspect3vism/file-storage#build", "@perspect3vism/perspective-diff-sync-socket-signaling#build"], + "@perspect3vism/file-storage#build", "@perspect3vism/perspective-diff-sync-socket-signaling#build", + "@perspect3vism/centralized-perspective-diff-sync-socket-signaling#build"], "outputs": ["dist/**", "lib/**", "build/**"] }, From 80ac041f80ab3252960a39e9822b91a63ec0ded1 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 11 Oct 2023 21:10:57 +0100 Subject: [PATCH 38/87] add mutex logic to live signals --- .../linksAdapter.ts | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 782753b89..bc8ced772 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -54,15 +54,24 @@ export class LinkAdapter implements LinkSyncAdapter { //Response from a given call to commit by us or any other agent //contains all the data we need to update our local state and our recordTimestamp as held by the server - this.socket.on("signal-emit", (signal) => { - console.log("Got some live signal from the server", signal, this.myCurrentRevision.timestamp); + this.socket.on("signal-emit", async (signal) => { + //Try and get the mutex, so that we dont allow signals to be processed until we have done the first sync + const release = await this.generalMutex.acquire(); - let serverRecordTimestamp = signal.serverRecordTimestamp; - if (!this.myCurrentRevision.timestamp || this.myCurrentRevision.timestamp < serverRecordTimestamp) { - this.myCurrentRevision.timestamp = serverRecordTimestamp; - this.updateServerSyncState(); - - this.handleSignal(signal.payload); + try { + console.log("Got some live signal from the server", signal, this.myCurrentRevision.timestamp); + + let serverRecordTimestamp = signal.serverRecordTimestamp; + if (!this.myCurrentRevision.timestamp || this.myCurrentRevision.timestamp < serverRecordTimestamp) { + this.myCurrentRevision.timestamp = serverRecordTimestamp; + this.updateServerSyncState(); + + this.handleSignal(signal.payload); + } + } catch (e) { + console.error("PerspectiveDiffSync.signal-emit(); got error", e); + } finally { + release(); } }) From 5c0484759e624a5739333c70464a56d125e41ccc Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 13:01:09 +0100 Subject: [PATCH 39/87] add some fixes to link lang --- .../linksAdapter.ts | 64 +++++++++++-------- .../telepresenceAdapter.ts | 12 ++-- .../util.ts | 2 +- 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index bc8ced772..7bdfbbf71 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -2,7 +2,7 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; -import { io } from "https://esm.sh/socket.io-client@4.7.2"; +import { io, Socket, ServerToClientEvents, ClientToServerEvents } from "https://esm.sh/socket.io-client@4.7.2"; import makeHttpRequest from "./util.ts"; export class LinkAdapter implements LinkSyncAdapter { @@ -10,9 +10,9 @@ export class LinkAdapter implements LinkSyncAdapter { syncStateChangeCallback?: SyncStateChangeObserver generalMutex: Mutex = withTimeout(new Mutex(), 10000, new Error('PerspectiveDiffSync: generalMutex timeout')); me: DID - myCurrentRevision: any | null = null; + myCurrentTime: any | null = null; languageUid: String | null = null; - socket: any; + socketClient: Socket; hasCalledSync = false; constructor(context: LanguageContext, uid: String) { @@ -21,17 +21,18 @@ export class LinkAdapter implements LinkSyncAdapter { //this.addAgentRecord(); - this.socket = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); + this.socketClient = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); console.log("Created socket connection"); - this.socket.on('error', (error: any) => { + this.socketClient.on('error', (error: any) => { console.error('Error:', error); }); - this.socket.on('connect', async () => { + this.socketClient.on('connect', async () => { console.log('Connected to the server'); try { - this.socket.emit("join-room", this.languageUid); + console.log("Trying to join room", this.languageUid); + this.socketClient.emit("join-room", this.languageUid); console.log("Sent the join-room signal"); } catch (e) { console.error("Error in socket connection: ", e); @@ -39,10 +40,14 @@ export class LinkAdapter implements LinkSyncAdapter { }); //Response from a given call to sync; contains all the data we need to update our local state and our recordTimestamp as held by the server - this.socket.on("sync-emit", (signal) => { - console.log("Got some result from sync", signal, this.myCurrentRevision.timestamp); + this.socketClient.on("sync-emit", (signal) => { + console.log("Got some result from sync", signal); - this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; + if (this.myCurrentTime) { + console.log("With current time", this.myCurrentTime); + } + + this.myCurrentTime = signal.serverRecordTimestamp; this.updateServerSyncState(); this.hasCalledSync = true; @@ -54,16 +59,20 @@ export class LinkAdapter implements LinkSyncAdapter { //Response from a given call to commit by us or any other agent //contains all the data we need to update our local state and our recordTimestamp as held by the server - this.socket.on("signal-emit", async (signal) => { + this.socketClient.on("signal-emit", async (signal) => { //Try and get the mutex, so that we dont allow signals to be processed until we have done the first sync const release = await this.generalMutex.acquire(); try { - console.log("Got some live signal from the server", signal, this.myCurrentRevision.timestamp); + console.log("Got some live signal from the server", signal); + + if (this.myCurrentTime) { + console.log("With current time", this.myCurrentTime); + } let serverRecordTimestamp = signal.serverRecordTimestamp; - if (!this.myCurrentRevision.timestamp || this.myCurrentRevision.timestamp < serverRecordTimestamp) { - this.myCurrentRevision.timestamp = serverRecordTimestamp; + if (!this.myCurrentTime|| this.myCurrentTime< serverRecordTimestamp) { + this.myCurrentTime = serverRecordTimestamp; this.updateServerSyncState(); this.handleSignal(signal.payload); @@ -75,15 +84,15 @@ export class LinkAdapter implements LinkSyncAdapter { } }) - this.socket.on('disconnect', () => { + this.socketClient.on('disconnect', () => { console.log('Disconnected from the server'); }); - this.socket.on('connect_error', (error) => { + this.socketClient.on('connect_error', (error) => { console.error('Connection Error:', error); }); - this.socket.on('reconnect', (attemptNumber) => { + this.socketClient.on('reconnect', (attemptNumber) => { console.log('Reconnected to the server on attempt:', attemptNumber); //If we have disconnected and reconnected, we need to sync again @@ -91,14 +100,16 @@ export class LinkAdapter implements LinkSyncAdapter { this.sync(); }); - this.socket.on('reconnect_attempt', () => { + this.socketClient.on('reconnect_attempt', () => { console.log('Trying to reconnect...'); }); } //Tell the server that we have updated our current timestamp so that the server can keep in sync with what we have seen updateServerSyncState() { - this.socket.emit("update-sync-state", {did: this.me, date: this.myCurrentRevision.timestamp, linkLanguageUUID: this.languageUid}) + if (this.myCurrentTime) { + this.socketClient.emit("update-sync-state", {did: this.me, date: this.myCurrentTime, linkLanguageUUID: this.languageUid}) + } } writable(): boolean { @@ -139,7 +150,7 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); //console.log("PerspectiveDiffSync.sync(); Got lock"); try { - this.socket.emit("sync", { + this.socketClient.emit("sync", { linkLanguageUUID: this.languageUid, did: this.me, }); @@ -156,13 +167,14 @@ export class LinkAdapter implements LinkSyncAdapter { async render(): Promise { return new Promise((resolve) => { //Send the request to get the links - this.socket.emit("render", { + this.socketClient.emit("render", { linkLanguageUUID: this.languageUid, }) //Wait for the response - this.socket.on("render-emit", (signal) => { - this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; + this.socketClient.on("render-emit", (signal) => { + this.myCurrentTime = signal.serverRecordTimestamp; + this.updateServerSyncState(); resolve(new Perspective(signal.payload)) }) }); @@ -174,7 +186,7 @@ export class LinkAdapter implements LinkSyncAdapter { try { //Send the commit to the server - this.socket.emit("commit", { + this.socketClient.emit("commit", { additions: diff.additions.map((diff) => prepareLinkExpression(diff)), removals: diff.removals.map((diff) => prepareLinkExpression(diff)), linkLanguageUUID: this.languageUid, @@ -182,10 +194,10 @@ export class LinkAdapter implements LinkSyncAdapter { }) //Wait for a response saying that the commit was successful - this.socket.on("commit-status", (signal) => { + this.socketClient.on("commit-status", (signal) => { if (signal.status === "Ok") { //Update our local timestamp to match the server - this.myCurrentRevision.timestamp = signal.serverRecordTimestamp; + this.myCurrentTime = signal.serverRecordTimestamp; this.updateServerSyncState(); resolve(null); diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts index 00e3d3b54..9815feb40 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts @@ -14,7 +14,7 @@ export class TelepresenceAdapterImplementation implements TelepresenceAdapter { } async setOnlineStatus(status: PerspectiveExpression): Promise { - await makeHttpRequest("http://127.0.0.1:8787/setStatus", "POST", {}, { + await makeHttpRequest("https://socket.ad4m.dev/setStatus", "POST", {}, { did: this.me, link: status, LinkLanguageUUID: this.uuid @@ -22,7 +22,7 @@ export class TelepresenceAdapterImplementation implements TelepresenceAdapter { } async getOnlineAgents(): Promise { - const result = await makeHttpRequest("http://127.0.0.1:8787/getOnlineAgents", "GET", {}, { + const result = await makeHttpRequest("https://socket.ad4m.dev/getOnlineAgents", "GET", {}, { did: this.me, LinkLanguageUUID: this.uuid }) @@ -32,13 +32,13 @@ export class TelepresenceAdapterImplementation implements TelepresenceAdapter { } async sendSignal(remoteAgentDid: string, payload: PerspectiveExpression): Promise { - let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_signal", {remote_agent_did: remoteAgentDid, payload}); - return res; + //let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_signal", {remote_agent_did: remoteAgentDid, payload}); + return {}; } async sendBroadcast(payload: PerspectiveExpression): Promise { - let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_broadcast", payload); - return res; + //let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_broadcast", payload); + return {}; } async registerSignalCallback(callback: TelepresenceSignalCallback): Promise { diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts index e59dcbd54..07cc7f2ce 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts @@ -1,4 +1,4 @@ -import http from 'node:http'; +import http from 'https://deno.land/std@0.177.0/node/http.ts'; export default function makeHttpRequest(url, method, queryParams, requestBody) { return new Promise((resolve, reject) => { From 0799bdcd64ce7ca398643fe49d39ad978eb04c2d Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 13:11:11 +0100 Subject: [PATCH 40/87] add some more logging --- .../linksAdapter.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 7bdfbbf71..47a114194 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -41,7 +41,8 @@ export class LinkAdapter implements LinkSyncAdapter { //Response from a given call to sync; contains all the data we need to update our local state and our recordTimestamp as held by the server this.socketClient.on("sync-emit", (signal) => { - console.log("Got some result from sync", signal); + console.log("Got some result from sync"); + console.dir(signal); if (this.myCurrentTime) { console.log("With current time", this.myCurrentTime); @@ -51,7 +52,9 @@ export class LinkAdapter implements LinkSyncAdapter { this.updateServerSyncState(); this.hasCalledSync = true; - this.handleSignal(signal.payload); + if (signal.payload.additions.length > 0 || signal.payload.removals.length > 0) { + this.handleSignal(signal.payload); + } //Emit and event saying that we are synced this.syncStateChangeCallback(PerspectiveState.Synced); @@ -185,13 +188,15 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); try { - //Send the commit to the server - this.socketClient.emit("commit", { + let preppedDiff = { additions: diff.additions.map((diff) => prepareLinkExpression(diff)), removals: diff.removals.map((diff) => prepareLinkExpression(diff)), linkLanguageUUID: this.languageUid, did: this.me, - }) + }; + console.log("Commit sending prepped diff", preppedDiff); + //Send the commit to the server + this.socketClient.emit("commit", preppedDiff) //Wait for a response saying that the commit was successful this.socketClient.on("commit-status", (signal) => { From b932f35aad30c78205b18b41831875a21b551485 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 13:16:34 +0100 Subject: [PATCH 41/87] add some more logging --- .../linksAdapter.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 47a114194..66336f3f3 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -43,6 +43,7 @@ export class LinkAdapter implements LinkSyncAdapter { this.socketClient.on("sync-emit", (signal) => { console.log("Got some result from sync"); console.dir(signal); + console.log(this.me); if (this.myCurrentTime) { console.log("With current time", this.myCurrentTime); @@ -67,14 +68,16 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); try { - console.log("Got some live signal from the server", signal); + console.log("Got some live signal from the server"); + console.dir(signal); + console.log(this.me); if (this.myCurrentTime) { console.log("With current time", this.myCurrentTime); } let serverRecordTimestamp = signal.serverRecordTimestamp; - if (!this.myCurrentTime|| this.myCurrentTime< serverRecordTimestamp) { + if (!this.myCurrentTime|| this.myCurrentTime < serverRecordTimestamp) { this.myCurrentTime = serverRecordTimestamp; this.updateServerSyncState(); @@ -153,6 +156,8 @@ export class LinkAdapter implements LinkSyncAdapter { const release = await this.generalMutex.acquire(); //console.log("PerspectiveDiffSync.sync(); Got lock"); try { + console.log("Sending the sync event to server"); + console.log(this.me); this.socketClient.emit("sync", { linkLanguageUUID: this.languageUid, did: this.me, @@ -196,7 +201,7 @@ export class LinkAdapter implements LinkSyncAdapter { }; console.log("Commit sending prepped diff", preppedDiff); //Send the commit to the server - this.socketClient.emit("commit", preppedDiff) + this.socketClient.emit("commit", preppedDiff); //Wait for a response saying that the commit was successful this.socketClient.on("commit-status", (signal) => { From ff761ed319325966924aa88eef33e5896b0ce735 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 13:56:49 +0100 Subject: [PATCH 42/87] add more logging to link language error throws --- executor/src/core/Perspective.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/executor/src/core/Perspective.ts b/executor/src/core/Perspective.ts index 8bad153cb..cd9eda986 100644 --- a/executor/src/core/Perspective.ts +++ b/executor/src/core/Perspective.ts @@ -252,7 +252,7 @@ export default class Perspective { resolve(new Ad4mPerspective([])) } } catch(e) { - console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter: ${e}`) + console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter render: ${e}`) reject(e) } }) @@ -287,7 +287,7 @@ export default class Perspective { }) } } catch(e) { - console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter:`, e) + console.error(`NH [${this.sharedUrl}; (${functionName})] (${this.name}): Error while trying to call links adapter general:`, e) reject(e) } }) @@ -328,7 +328,7 @@ export default class Perspective { resolve(null) } } catch(e) { - console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter: ${e}`) + console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter current revision: ${e}`) reject(e) } }) From 2274a8fa07927e07afbbe9f9ff2657636543bedf Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 13:57:04 +0100 Subject: [PATCH 43/87] fix current revision handling in link language --- .../linksAdapter.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 66336f3f3..304100fc8 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -78,6 +78,7 @@ export class LinkAdapter implements LinkSyncAdapter { let serverRecordTimestamp = signal.serverRecordTimestamp; if (!this.myCurrentTime|| this.myCurrentTime < serverRecordTimestamp) { + console.log("Returning that live signal to executor"); this.myCurrentTime = serverRecordTimestamp; this.updateServerSyncState(); @@ -140,9 +141,16 @@ export class LinkAdapter implements LinkSyncAdapter { did: this.me }) + console.log("Current revision got result", result); + if (result) { //@ts-ignore - return result.currentRevision; + if (result.currentRevision === null) { + return ""; + } else { + //@ts-ignore + return result.currentRevision; + }; } return ""; @@ -150,6 +158,7 @@ export class LinkAdapter implements LinkSyncAdapter { //Call sync on the server, which will should fetch all the links we missed since last start of the link language async sync(): Promise { + console.log("Sync call has called sync", this.hasCalledSync); //Only allow sync to be called once since once we have sync'd once we will get future links via signal if (!this.hasCalledSync) { //console.log("PerspectiveDiffSync.sync(); Getting lock"); @@ -210,7 +219,7 @@ export class LinkAdapter implements LinkSyncAdapter { this.myCurrentTime = signal.serverRecordTimestamp; this.updateServerSyncState(); - resolve(null); + resolve(""); } else { reject() } From b06485a2f6be8f47711ac731201ccb7c22edde7c Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 14:27:32 +0100 Subject: [PATCH 44/87] add the callback logic for events --- .../linksAdapter.ts | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 304100fc8..08899d0cd 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -39,28 +39,6 @@ export class LinkAdapter implements LinkSyncAdapter { } }); - //Response from a given call to sync; contains all the data we need to update our local state and our recordTimestamp as held by the server - this.socketClient.on("sync-emit", (signal) => { - console.log("Got some result from sync"); - console.dir(signal); - console.log(this.me); - - if (this.myCurrentTime) { - console.log("With current time", this.myCurrentTime); - } - - this.myCurrentTime = signal.serverRecordTimestamp; - this.updateServerSyncState(); - this.hasCalledSync = true; - - if (signal.payload.additions.length > 0 || signal.payload.removals.length > 0) { - this.handleSignal(signal.payload); - } - - //Emit and event saying that we are synced - this.syncStateChangeCallback(PerspectiveState.Synced); - }); - //Response from a given call to commit by us or any other agent //contains all the data we need to update our local state and our recordTimestamp as held by the server this.socketClient.on("signal-emit", async (signal) => { @@ -115,7 +93,13 @@ export class LinkAdapter implements LinkSyncAdapter { //Tell the server that we have updated our current timestamp so that the server can keep in sync with what we have seen updateServerSyncState() { if (this.myCurrentTime) { - this.socketClient.emit("update-sync-state", {did: this.me, date: this.myCurrentTime, linkLanguageUUID: this.languageUid}) + this.socketClient.emit("update-sync-state", {did: this.me, date: this.myCurrentTime, linkLanguageUUID: this.languageUid}, (err, signal) => { + if (err) { + console.error("Error in update-sync-state call", err); + }; + console.log("Got some result from update-sync-state"); + console.dir(signal); + }) } } @@ -170,6 +154,29 @@ export class LinkAdapter implements LinkSyncAdapter { this.socketClient.emit("sync", { linkLanguageUUID: this.languageUid, did: this.me, + }, (err, signal) => { + if (err) { + console.error("Error in sync call", err); + throw Error(err); + }; + console.log("Got some result from sync"); + console.dir(signal); + console.log(this.me); + + if (this.myCurrentTime) { + console.log("With current time", this.myCurrentTime); + } + + this.myCurrentTime = signal.serverRecordTimestamp; + this.updateServerSyncState(); + this.hasCalledSync = true; + + if (signal.payload.additions.length > 0 || signal.payload.removals.length > 0) { + this.handleSignal(signal.payload); + } + + //Emit and event saying that we are synced + this.syncStateChangeCallback(PerspectiveState.Synced); }); } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); @@ -182,14 +189,15 @@ export class LinkAdapter implements LinkSyncAdapter { //Fetch all the links from the server async render(): Promise { - return new Promise((resolve) => { + return new Promise((resolve, reject) => { //Send the request to get the links this.socketClient.emit("render", { linkLanguageUUID: this.languageUid, - }) - - //Wait for the response - this.socketClient.on("render-emit", (signal) => { + }, (err, signal) => { + if (err) { + console.error("Error in sync call", err); + return reject(err); + }; this.myCurrentTime = signal.serverRecordTimestamp; this.updateServerSyncState(); resolve(new Perspective(signal.payload)) @@ -210,10 +218,11 @@ export class LinkAdapter implements LinkSyncAdapter { }; console.log("Commit sending prepped diff", preppedDiff); //Send the commit to the server - this.socketClient.emit("commit", preppedDiff); - - //Wait for a response saying that the commit was successful - this.socketClient.on("commit-status", (signal) => { + this.socketClient.emit("commit", preppedDiff, (err, signal) => { + if (err) { + console.error("Error in sync call", err); + return reject(err); + }; if (signal.status === "Ok") { //Update our local timestamp to match the server this.myCurrentTime = signal.serverRecordTimestamp; @@ -224,13 +233,10 @@ export class LinkAdapter implements LinkSyncAdapter { reject() } }); - - return ; } catch (e) { console.error("PerspectiveDiffSync.commit(); got error", e); } finally { release(); - reject(null); } }) } From 985d05990a4e7f54572c2769c9cec6b4d32c2b7a Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 15:02:05 +0100 Subject: [PATCH 45/87] improve error logging for link lang call timeouts --- executor/src/core/Perspective.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/executor/src/core/Perspective.ts b/executor/src/core/Perspective.ts index cd9eda986..a0878dfb4 100644 --- a/executor/src/core/Perspective.ts +++ b/executor/src/core/Perspective.ts @@ -241,7 +241,7 @@ export default class Perspective { try { const linksAdapter = await this.getLinksAdapter(); if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) + const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}; (render)] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) //console.debug(`Calling linksAdapter.${functionName}(${JSON.stringify(args)})`) const result = await linksAdapter.render(); clearTimeout(timeout) @@ -272,7 +272,7 @@ export default class Perspective { try { const linksAdapter = await this.getLinksAdapter(); if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) + const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}; (${functionName})] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000) //console.debug(`NH [${this.sharedUrl}] (${this.name}): Calling linksAdapter.${functionName}(${JSON.stringify(args).substring(0, 50)})`) //@ts-ignore const result = await linksAdapter[functionName](...args) @@ -302,7 +302,7 @@ export default class Perspective { try { const linksAdapter = await this.getLinksAdapter(); if(linksAdapter) { - const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl}] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000); + const timeout = setTimeout(() => reject(Error(`NH [${this.sharedUrl} (currentRevision)] (${this.name}): LinkLanguage took to long to respond, timeout at 20000ms`)), 20000); let currentRevisionString = await linksAdapter.currentRevision(); clearInterval(timeout); From 719c6324187cebf06f4c701390ebb336c652bbee Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 15:02:18 +0100 Subject: [PATCH 46/87] remove mutex and improve flow of commit function --- .../linksAdapter.ts | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts index 08899d0cd..9bfc3c9ec 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts @@ -43,7 +43,7 @@ export class LinkAdapter implements LinkSyncAdapter { //contains all the data we need to update our local state and our recordTimestamp as held by the server this.socketClient.on("signal-emit", async (signal) => { //Try and get the mutex, so that we dont allow signals to be processed until we have done the first sync - const release = await this.generalMutex.acquire(); + //const release = await this.generalMutex.acquire(); try { console.log("Got some live signal from the server"); @@ -65,7 +65,7 @@ export class LinkAdapter implements LinkSyncAdapter { } catch (e) { console.error("PerspectiveDiffSync.signal-emit(); got error", e); } finally { - release(); + //release(); } }) @@ -119,11 +119,18 @@ export class LinkAdapter implements LinkSyncAdapter { } async currentRevision(): Promise { - //@ts-ignore - const result = await makeHttpRequest("https://socket.ad4m.dev/currentRevision", "POST", {}, { - linkLanguageUUID: this.languageUid, - did: this.me - }) + console.log("Getting current revision"); + let result; + try { + //@ts-ignore + result = await makeHttpRequest("https://socket.ad4m.dev/currentRevision", "POST", {}, { + linkLanguageUUID: this.languageUid, + did: this.me + }) + } catch (e) { + console.log("Error in currentRevision call", e); + result = null; + } console.log("Current revision got result", result); @@ -146,7 +153,7 @@ export class LinkAdapter implements LinkSyncAdapter { //Only allow sync to be called once since once we have sync'd once we will get future links via signal if (!this.hasCalledSync) { //console.log("PerspectiveDiffSync.sync(); Getting lock"); - const release = await this.generalMutex.acquire(); + //const release = await this.generalMutex.acquire(); //console.log("PerspectiveDiffSync.sync(); Got lock"); try { console.log("Sending the sync event to server"); @@ -181,7 +188,7 @@ export class LinkAdapter implements LinkSyncAdapter { } catch (e) { console.error("PerspectiveDiffSync.sync(); got error", e); } finally { - release(); + //release(); } } return new PerspectiveDiff() @@ -206,39 +213,48 @@ export class LinkAdapter implements LinkSyncAdapter { } async commit(diff: PerspectiveDiff): Promise { - return new Promise(async (resolve, reject) => { - const release = await this.generalMutex.acquire(); - - try { - let preppedDiff = { - additions: diff.additions.map((diff) => prepareLinkExpression(diff)), - removals: diff.removals.map((diff) => prepareLinkExpression(diff)), + //const release = await this.generalMutex.acquire(); + try { + const preppedDiff = { + additions: diff.additions.map((item) => prepareLinkExpression(item)), + removals: diff.removals.map((item) => prepareLinkExpression(item)), linkLanguageUUID: this.languageUid, did: this.me, }; console.log("Commit sending prepped diff", preppedDiff); - //Send the commit to the server - this.socketClient.emit("commit", preppedDiff, (err, signal) => { - if (err) { - console.error("Error in sync call", err); - return reject(err); - }; - if (signal.status === "Ok") { - //Update our local timestamp to match the server - this.myCurrentTime = signal.serverRecordTimestamp; - this.updateServerSyncState(); - - resolve(""); - } else { - reject() - } - }); + + const signal = await this.emitCommit(preppedDiff); + + if (signal.status === "Ok") { + console.log("Got some result from commit"); + console.dir(signal); + //Update our local timestamp to match the server + this.myCurrentTime = signal.serverRecordTimestamp; + this.updateServerSyncState(); + return ""; // Resolve the function with an empty string + } else { + throw new Error("Commit failed with non-Ok status"); + } } catch (e) { console.error("PerspectiveDiffSync.commit(); got error", e); + throw e; // Propagate the error up } finally { - release(); + //release(); } - }) + } + + // Utility method to wrap the socketClient.emit in a Promise + private emitCommit(preppedDiff: any): Promise { + return new Promise((resolve, reject) => { + this.socketClient.emit("commit", preppedDiff, (err, signal) => { + if (err) { + console.error("Error in commit call", err); + reject(err); + } else { + resolve(signal); + } + }); + }); } addCallback(callback: PerspectiveDiffObserver): number { From a1c42a854f4528ebd3f63ef67d0d575770bec547 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 15:41:05 +0100 Subject: [PATCH 47/87] rename centralized link language & add to seed proto --- .../.gitignore | 0 .../README.md | 0 .../customHttpDownloader.js | 0 .../esbuild.ts | 0 .../index.ts | 0 .../integration-test.js | 0 .../linksAdapter.ts | 0 .../package.json | 4 +- .../telepresenceAdapter.ts | 0 .../tsconfig.json | 0 .../util.ts | 0 cli/seed_proto.json | 9 + tests/js/bootstrapSeed.json | 2 +- tests/js/publishBootstrapSeed.json | 2 +- tests/js/scripts/get-builtin-test-langs.js | 2 +- tests/js/tests/integration.test.ts | 12 +- tests/js/tests/neighbourhood.ts | 300 +++++++++--------- turbo.json | 2 +- 18 files changed, 171 insertions(+), 162 deletions(-) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/.gitignore (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/README.md (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/customHttpDownloader.js (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/esbuild.ts (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/index.ts (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/integration-test.js (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/linksAdapter.ts (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/package.json (93%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/telepresenceAdapter.ts (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/tsconfig.json (100%) rename bootstrap-languages/{centralized-p-diff-sync-socket-signaling => centralized-p-diff-sync}/util.ts (100%) diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/centralized-p-diff-sync/.gitignore similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/.gitignore rename to bootstrap-languages/centralized-p-diff-sync/.gitignore diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md b/bootstrap-languages/centralized-p-diff-sync/README.md similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/README.md rename to bootstrap-languages/centralized-p-diff-sync/README.md diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js b/bootstrap-languages/centralized-p-diff-sync/customHttpDownloader.js similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/customHttpDownloader.js rename to bootstrap-languages/centralized-p-diff-sync/customHttpDownloader.js diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts b/bootstrap-languages/centralized-p-diff-sync/esbuild.ts similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/esbuild.ts rename to bootstrap-languages/centralized-p-diff-sync/esbuild.ts diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts b/bootstrap-languages/centralized-p-diff-sync/index.ts similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/index.ts rename to bootstrap-languages/centralized-p-diff-sync/index.ts diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js b/bootstrap-languages/centralized-p-diff-sync/integration-test.js similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/integration-test.js rename to bootstrap-languages/centralized-p-diff-sync/integration-test.js diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/linksAdapter.ts rename to bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json b/bootstrap-languages/centralized-p-diff-sync/package.json similarity index 93% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json rename to bootstrap-languages/centralized-p-diff-sync/package.json index 3494205c4..c3d48a0a8 100644 --- a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/package.json +++ b/bootstrap-languages/centralized-p-diff-sync/package.json @@ -1,7 +1,7 @@ { - "name": "@perspect3vism/centralized-perspective-diff-sync-socket-signaling", + "name": "@perspect3vism/centralized-perspective-diff-sync", "version": "0.6.0", - "description": "An AD4M language for syncing mutations to a share perspective", + "description": "An AD4M language for syncing mutations to a shared perspective via a centralized server", "main": "index.js", "scripts": { "build": "run-script-os", diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/telepresenceAdapter.ts rename to bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json b/bootstrap-languages/centralized-p-diff-sync/tsconfig.json similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/tsconfig.json rename to bootstrap-languages/centralized-p-diff-sync/tsconfig.json diff --git a/bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts b/bootstrap-languages/centralized-p-diff-sync/util.ts similarity index 100% rename from bootstrap-languages/centralized-p-diff-sync-socket-signaling/util.ts rename to bootstrap-languages/centralized-p-diff-sync/util.ts diff --git a/cli/seed_proto.json b/cli/seed_proto.json index a158a5c9d..a67674730 100644 --- a/cli/seed_proto.json +++ b/cli/seed_proto.json @@ -18,6 +18,15 @@ "possibleTemplateParams": ["uid", "name", "description"] }, "resource": "../bootstrap-languages/p-diff-sync-socket-signaling/build/bundle.js" + }, + { + "meta": { + "name": "perspectiveDiffSync", + "description": "Centralized link language", + "sourceCodeLink": "https://github.com/perspect3vism/perspective-diff-sync", + "possibleTemplateParams": ["uid", "name", "description"] + }, + "resource": "../bootstrap-languages/centralized-p-diff-sync/build/bundle.js" } ], "agentLanguage": { diff --git a/tests/js/bootstrapSeed.json b/tests/js/bootstrapSeed.json index 8c7b92871..0afcdbca7 100644 --- a/tests/js/bootstrapSeed.json +++ b/tests/js/bootstrapSeed.json @@ -1 +1 @@ -{"trustedAgents":["did:key:zQ3shkkuZLvqeFgHdgZgFMUx8VGkgVWsLA83w2oekhZxoCW2n"],"knownLinkLanguages":["QmzSYwdfRBC1tKP9XcQSgimWSbWyGyVmck4MMmPPC1Gokr3tq26"],"directMessageLanguage":"QmzSYwdcZPQToRt7653T2zAq8BEt8u7dZ7jyzWMaRTsSxMc4HuZ","agentLanguage":"QmzSYwdfHAE9cvfvCkNZFWH9L5y2QcKBiivNZYU53UR4hE8a8Dx","perspectiveLanguage":"QmzSYwdeBLCn99QU7DSnJuTFrp7TQGRZkrTDRXvxiv2XAbUFeEx","neighbourhoodLanguage":"QmzSYwdexVtzt8GEY37qzRy15mNL59XrpjvZJjgYXa43j6CewKE","languageLanguageBundle":""} \ No newline at end of file +{"trustedAgents":["did:key:zQ3shkkuZLvqeFgHdgZgFMUx8VGkgVWsLA83w2oekhZxoCW2n","did:key:z6MkfNzcoDnBP4a6uaLGZ19VSocDXcv4EeruHSa5xhXboiw1"],"knownLinkLanguages":["QmzSYwdmnYVDMApjjaGW3EyKYEfyFKeSnS4fAmnm62zom33cAwY"],"directMessageLanguage":"QmzSYwdp8xNu5UdWWsKQhzZs4JLYDBTk22T7ksoi3hhpscZAm3E","agentLanguage":"QmzSYwdigpRrQTmtXcATD4zAFp1nqbXB1tVJT7ho1JaThaXCynL","perspectiveLanguage":"QmzSYwdeBLCn99QU7DSnJuTFrp7TQGRZkrTDRXvxiv2XAbUFeEx","neighbourhoodLanguage":"QmzSYwdexVtzt8GEY37qzRy15mNL59XrpjvZJjgYXa43j6CewKE","languageLanguageBundle":"// deno-fmt-ignore-file\n// deno-lint-ignore-file\n// This code was bundled using `deno bundle` and it's not recommended to edit it manually\n\nconst osType = (()=>{\n const { Deno: Deno1 } = globalThis;\n if (typeof Deno1?.build?.os === \"string\") {\n return Deno1.build.os;\n }\n const { navigator } = globalThis;\n if (navigator?.appVersion?.includes?.(\"Win\")) {\n return \"windows\";\n }\n return \"linux\";\n})();\nconst isWindows = osType === \"windows\";\nconst CHAR_FORWARD_SLASH = 47;\nfunction assertPath(path) {\n if (typeof path !== \"string\") {\n throw new TypeError(`Path must be a string. Received ${JSON.stringify(path)}`);\n }\n}\nfunction isPosixPathSeparator(code) {\n return code === 47;\n}\nfunction isPathSeparator(code) {\n return isPosixPathSeparator(code) || code === 92;\n}\nfunction isWindowsDeviceRoot(code) {\n return code >= 97 && code <= 122 || code >= 65 && code <= 90;\n}\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code;\n for(let i = 0, len = path.length; i <= len; ++i){\n if (i < len) code = path.charCodeAt(i);\n else if (isPathSeparator(code)) break;\n else code = CHAR_FORWARD_SLASH;\n if (isPathSeparator(code)) {\n if (lastSlash === i - 1 || dots === 1) {} else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n } else if (res.length === 2 || res.length === 1) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) res += `${separator}..`;\n else res = \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) res += separator + path.slice(lastSlash + 1, i);\n else res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\nfunction _format(sep, pathObject) {\n const dir = pathObject.dir || pathObject.root;\n const base = pathObject.base || (pathObject.name || \"\") + (pathObject.ext || \"\");\n if (!dir) return base;\n if (base === sep) return dir;\n if (dir === pathObject.root) return dir + base;\n return dir + sep + base;\n}\nconst WHITESPACE_ENCODINGS = {\n \"\\u0009\": \"%09\",\n \"\\u000A\": \"%0A\",\n \"\\u000B\": \"%0B\",\n \"\\u000C\": \"%0C\",\n \"\\u000D\": \"%0D\",\n \"\\u0020\": \"%20\"\n};\nfunction encodeWhitespace(string) {\n return string.replaceAll(/[\\s]/g, (c)=>{\n return WHITESPACE_ENCODINGS[c] ?? c;\n });\n}\nfunction lastPathSegment(path, isSep, start = 0) {\n let matchedNonSeparator = false;\n let end = path.length;\n for(let i = path.length - 1; i >= start; --i){\n if (isSep(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n start = i + 1;\n break;\n }\n } else if (!matchedNonSeparator) {\n matchedNonSeparator = true;\n end = i + 1;\n }\n }\n return path.slice(start, end);\n}\nfunction stripTrailingSeparators(segment, isSep) {\n if (segment.length <= 1) {\n return segment;\n }\n let end = segment.length;\n for(let i = segment.length - 1; i > 0; i--){\n if (isSep(segment.charCodeAt(i))) {\n end = i;\n } else {\n break;\n }\n }\n return segment.slice(0, end);\n}\nfunction stripSuffix(name, suffix) {\n if (suffix.length >= name.length) {\n return name;\n }\n const lenDiff = name.length - suffix.length;\n for(let i = suffix.length - 1; i >= 0; --i){\n if (name.charCodeAt(lenDiff + i) !== suffix.charCodeAt(i)) {\n return name;\n }\n }\n return name.slice(0, -suffix.length);\n}\nclass DenoStdInternalError extends Error {\n constructor(message){\n super(message);\n this.name = \"DenoStdInternalError\";\n }\n}\nfunction assert(expr, msg = \"\") {\n if (!expr) {\n throw new DenoStdInternalError(msg);\n }\n}\nconst sep = \"\\\\\";\nconst delimiter = \";\";\nfunction resolve(...pathSegments) {\n let resolvedDevice = \"\";\n let resolvedTail = \"\";\n let resolvedAbsolute = false;\n for(let i = pathSegments.length - 1; i >= -1; i--){\n let path;\n const { Deno: Deno1 } = globalThis;\n if (i >= 0) {\n path = pathSegments[i];\n } else if (!resolvedDevice) {\n if (typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a drive-letter-less path without a CWD.\");\n }\n path = Deno1.cwd();\n } else {\n if (typeof Deno1?.env?.get !== \"function\" || typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a relative path without a CWD.\");\n }\n path = Deno1.cwd();\n if (path === undefined || path.slice(0, 3).toLowerCase() !== `${resolvedDevice.toLowerCase()}\\\\`) {\n path = `${resolvedDevice}\\\\`;\n }\n }\n assertPath(path);\n const len = path.length;\n if (len === 0) continue;\n let rootEnd = 0;\n let device = \"\";\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last)}`;\n rootEnd = j;\n } else if (j !== last) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n rootEnd = 1;\n isAbsolute = true;\n }\n if (device.length > 0 && resolvedDevice.length > 0 && device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n continue;\n }\n if (resolvedDevice.length === 0 && device.length > 0) {\n resolvedDevice = device;\n }\n if (!resolvedAbsolute) {\n resolvedTail = `${path.slice(rootEnd)}\\\\${resolvedTail}`;\n resolvedAbsolute = isAbsolute;\n }\n if (resolvedAbsolute && resolvedDevice.length > 0) break;\n }\n resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, \"\\\\\", isPathSeparator);\n return resolvedDevice + (resolvedAbsolute ? \"\\\\\" : \"\") + resolvedTail || \".\";\n}\nfunction normalize(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return \".\";\n let rootEnd = 0;\n let device;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n } else if (j !== last) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n return \"\\\\\";\n }\n let tail;\n if (rootEnd < len) {\n tail = normalizeString(path.slice(rootEnd), !isAbsolute, \"\\\\\", isPathSeparator);\n } else {\n tail = \"\";\n }\n if (tail.length === 0 && !isAbsolute) tail = \".\";\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += \"\\\\\";\n }\n if (device === undefined) {\n if (isAbsolute) {\n if (tail.length > 0) return `\\\\${tail}`;\n else return \"\\\\\";\n } else if (tail.length > 0) {\n return tail;\n } else {\n return \"\";\n }\n } else if (isAbsolute) {\n if (tail.length > 0) return `${device}\\\\${tail}`;\n else return `${device}\\\\`;\n } else if (tail.length > 0) {\n return device + tail;\n } else {\n return device;\n }\n}\nfunction isAbsolute(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return false;\n const code = path.charCodeAt(0);\n if (isPathSeparator(code)) {\n return true;\n } else if (isWindowsDeviceRoot(code)) {\n if (len > 2 && path.charCodeAt(1) === 58) {\n if (isPathSeparator(path.charCodeAt(2))) return true;\n }\n }\n return false;\n}\nfunction join(...paths) {\n const pathsCount = paths.length;\n if (pathsCount === 0) return \".\";\n let joined;\n let firstPart = null;\n for(let i = 0; i < pathsCount; ++i){\n const path = paths[i];\n assertPath(path);\n if (path.length > 0) {\n if (joined === undefined) joined = firstPart = path;\n else joined += `\\\\${path}`;\n }\n }\n if (joined === undefined) return \".\";\n let needsReplace = true;\n let slashCount = 0;\n assert(firstPart != null);\n if (isPathSeparator(firstPart.charCodeAt(0))) {\n ++slashCount;\n const firstLen = firstPart.length;\n if (firstLen > 1) {\n if (isPathSeparator(firstPart.charCodeAt(1))) {\n ++slashCount;\n if (firstLen > 2) {\n if (isPathSeparator(firstPart.charCodeAt(2))) ++slashCount;\n else {\n needsReplace = false;\n }\n }\n }\n }\n }\n if (needsReplace) {\n for(; slashCount < joined.length; ++slashCount){\n if (!isPathSeparator(joined.charCodeAt(slashCount))) break;\n }\n if (slashCount >= 2) joined = `\\\\${joined.slice(slashCount)}`;\n }\n return normalize(joined);\n}\nfunction relative(from, to) {\n assertPath(from);\n assertPath(to);\n if (from === to) return \"\";\n const fromOrig = resolve(from);\n const toOrig = resolve(to);\n if (fromOrig === toOrig) return \"\";\n from = fromOrig.toLowerCase();\n to = toOrig.toLowerCase();\n if (from === to) return \"\";\n let fromStart = 0;\n let fromEnd = from.length;\n for(; fromStart < fromEnd; ++fromStart){\n if (from.charCodeAt(fromStart) !== 92) break;\n }\n for(; fromEnd - 1 > fromStart; --fromEnd){\n if (from.charCodeAt(fromEnd - 1) !== 92) break;\n }\n const fromLen = fromEnd - fromStart;\n let toStart = 0;\n let toEnd = to.length;\n for(; toStart < toEnd; ++toStart){\n if (to.charCodeAt(toStart) !== 92) break;\n }\n for(; toEnd - 1 > toStart; --toEnd){\n if (to.charCodeAt(toEnd - 1) !== 92) break;\n }\n const toLen = toEnd - toStart;\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for(; i <= length; ++i){\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 92) {\n return toOrig.slice(toStart + i + 1);\n } else if (i === 2) {\n return toOrig.slice(toStart + i);\n }\n }\n if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 92) {\n lastCommonSep = i;\n } else if (i === 2) {\n lastCommonSep = 3;\n }\n }\n break;\n }\n const fromCode = from.charCodeAt(fromStart + i);\n const toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode) break;\n else if (fromCode === 92) lastCommonSep = i;\n }\n if (i !== length && lastCommonSep === -1) {\n return toOrig;\n }\n let out = \"\";\n if (lastCommonSep === -1) lastCommonSep = 0;\n for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){\n if (i === fromEnd || from.charCodeAt(i) === 92) {\n if (out.length === 0) out += \"..\";\n else out += \"\\\\..\";\n }\n }\n if (out.length > 0) {\n return out + toOrig.slice(toStart + lastCommonSep, toEnd);\n } else {\n toStart += lastCommonSep;\n if (toOrig.charCodeAt(toStart) === 92) ++toStart;\n return toOrig.slice(toStart, toEnd);\n }\n}\nfunction toNamespacedPath(path) {\n if (typeof path !== \"string\") return path;\n if (path.length === 0) return \"\";\n const resolvedPath = resolve(path);\n if (resolvedPath.length >= 3) {\n if (resolvedPath.charCodeAt(0) === 92) {\n if (resolvedPath.charCodeAt(1) === 92) {\n const code = resolvedPath.charCodeAt(2);\n if (code !== 63 && code !== 46) {\n return `\\\\\\\\?\\\\UNC\\\\${resolvedPath.slice(2)}`;\n }\n }\n } else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0))) {\n if (resolvedPath.charCodeAt(1) === 58 && resolvedPath.charCodeAt(2) === 92) {\n return `\\\\\\\\?\\\\${resolvedPath}`;\n }\n }\n }\n return path;\n}\nfunction dirname(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return \".\";\n let rootEnd = -1;\n let end = -1;\n let matchedSlash = true;\n let offset = 0;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n rootEnd = offset = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n return path;\n }\n if (j !== last) {\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n rootEnd = offset = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) rootEnd = offset = 3;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n return path;\n }\n for(let i = len - 1; i >= offset; --i){\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n matchedSlash = false;\n }\n }\n if (end === -1) {\n if (rootEnd === -1) return \".\";\n else end = rootEnd;\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\nfunction basename(path, suffix = \"\") {\n assertPath(path);\n if (path.length === 0) return path;\n if (typeof suffix !== \"string\") {\n throw new TypeError(`Suffix must be a string. Received ${JSON.stringify(suffix)}`);\n }\n let start = 0;\n if (path.length >= 2) {\n const drive = path.charCodeAt(0);\n if (isWindowsDeviceRoot(drive)) {\n if (path.charCodeAt(1) === 58) start = 2;\n }\n }\n const lastSegment = lastPathSegment(path, isPathSeparator, start);\n const strippedSegment = stripTrailingSeparators(lastSegment, isPathSeparator);\n return suffix ? stripSuffix(strippedSegment, suffix) : strippedSegment;\n}\nfunction extname(path) {\n assertPath(path);\n let start = 0;\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let preDotState = 0;\n if (path.length >= 2 && path.charCodeAt(1) === 58 && isWindowsDeviceRoot(path.charCodeAt(0))) {\n start = startPart = 2;\n }\n for(let i = path.length - 1; i >= start; --i){\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return \"\";\n }\n return path.slice(startDot, end);\n}\nfunction format(pathObject) {\n if (pathObject === null || typeof pathObject !== \"object\") {\n throw new TypeError(`The \"pathObject\" argument must be of type Object. Received type ${typeof pathObject}`);\n }\n return _format(\"\\\\\", pathObject);\n}\nfunction parse(path) {\n assertPath(path);\n const ret = {\n root: \"\",\n dir: \"\",\n base: \"\",\n ext: \"\",\n name: \"\"\n };\n const len = path.length;\n if (len === 0) return ret;\n let rootEnd = 0;\n let code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n rootEnd = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n rootEnd = j;\n } else if (j !== last) {\n rootEnd = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n if (len === 3) {\n ret.root = ret.dir = path;\n ret.base = \"\\\\\";\n return ret;\n }\n rootEnd = 3;\n }\n } else {\n ret.root = ret.dir = path;\n return ret;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n ret.root = ret.dir = path;\n ret.base = \"\\\\\";\n return ret;\n }\n if (rootEnd > 0) ret.root = path.slice(0, rootEnd);\n let startDot = -1;\n let startPart = rootEnd;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n let preDotState = 0;\n for(; i >= rootEnd; --i){\n code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n ret.ext = path.slice(startDot, end);\n }\n ret.base = ret.base || \"\\\\\";\n if (startPart > 0 && startPart !== rootEnd) {\n ret.dir = path.slice(0, startPart - 1);\n } else ret.dir = ret.root;\n return ret;\n}\nfunction fromFileUrl(url) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol != \"file:\") {\n throw new TypeError(\"Must be a file URL.\");\n }\n let path = decodeURIComponent(url.pathname.replace(/\\//g, \"\\\\\").replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\")).replace(/^\\\\*([A-Za-z]:)(\\\\|$)/, \"$1\\\\\");\n if (url.hostname != \"\") {\n path = `\\\\\\\\${url.hostname}${path}`;\n }\n return path;\n}\nfunction toFileUrl(path) {\n if (!isAbsolute(path)) {\n throw new TypeError(\"Must be an absolute path.\");\n }\n const [, hostname, pathname] = path.match(/^(?:[/\\\\]{2}([^/\\\\]+)(?=[/\\\\](?:[^/\\\\]|$)))?(.*)/);\n const url = new URL(\"file:///\");\n url.pathname = encodeWhitespace(pathname.replace(/%/g, \"%25\"));\n if (hostname != null && hostname != \"localhost\") {\n url.hostname = hostname;\n if (!url.hostname) {\n throw new TypeError(\"Invalid hostname.\");\n }\n }\n return url;\n}\nconst mod = {\n sep: sep,\n delimiter: delimiter,\n resolve: resolve,\n normalize: normalize,\n isAbsolute: isAbsolute,\n join: join,\n relative: relative,\n toNamespacedPath: toNamespacedPath,\n dirname: dirname,\n basename: basename,\n extname: extname,\n format: format,\n parse: parse,\n fromFileUrl: fromFileUrl,\n toFileUrl: toFileUrl\n};\nconst sep1 = \"/\";\nconst delimiter1 = \":\";\nfunction resolve1(...pathSegments) {\n let resolvedPath = \"\";\n let resolvedAbsolute = false;\n for(let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--){\n let path;\n if (i >= 0) path = pathSegments[i];\n else {\n const { Deno: Deno1 } = globalThis;\n if (typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a relative path without a CWD.\");\n }\n path = Deno1.cwd();\n }\n assertPath(path);\n if (path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n }\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, \"/\", isPosixPathSeparator);\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0) return `/${resolvedPath}`;\n else return \"/\";\n } else if (resolvedPath.length > 0) return resolvedPath;\n else return \".\";\n}\nfunction normalize1(path) {\n assertPath(path);\n if (path.length === 0) return \".\";\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n const trailingSeparator = isPosixPathSeparator(path.charCodeAt(path.length - 1));\n path = normalizeString(path, !isAbsolute, \"/\", isPosixPathSeparator);\n if (path.length === 0 && !isAbsolute) path = \".\";\n if (path.length > 0 && trailingSeparator) path += \"/\";\n if (isAbsolute) return `/${path}`;\n return path;\n}\nfunction isAbsolute1(path) {\n assertPath(path);\n return path.length > 0 && isPosixPathSeparator(path.charCodeAt(0));\n}\nfunction join1(...paths) {\n if (paths.length === 0) return \".\";\n let joined;\n for(let i = 0, len = paths.length; i < len; ++i){\n const path = paths[i];\n assertPath(path);\n if (path.length > 0) {\n if (!joined) joined = path;\n else joined += `/${path}`;\n }\n }\n if (!joined) return \".\";\n return normalize1(joined);\n}\nfunction relative1(from, to) {\n assertPath(from);\n assertPath(to);\n if (from === to) return \"\";\n from = resolve1(from);\n to = resolve1(to);\n if (from === to) return \"\";\n let fromStart = 1;\n const fromEnd = from.length;\n for(; fromStart < fromEnd; ++fromStart){\n if (!isPosixPathSeparator(from.charCodeAt(fromStart))) break;\n }\n const fromLen = fromEnd - fromStart;\n let toStart = 1;\n const toEnd = to.length;\n for(; toStart < toEnd; ++toStart){\n if (!isPosixPathSeparator(to.charCodeAt(toStart))) break;\n }\n const toLen = toEnd - toStart;\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for(; i <= length; ++i){\n if (i === length) {\n if (toLen > length) {\n if (isPosixPathSeparator(to.charCodeAt(toStart + i))) {\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (isPosixPathSeparator(from.charCodeAt(fromStart + i))) {\n lastCommonSep = i;\n } else if (i === 0) {\n lastCommonSep = 0;\n }\n }\n break;\n }\n const fromCode = from.charCodeAt(fromStart + i);\n const toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode) break;\n else if (isPosixPathSeparator(fromCode)) lastCommonSep = i;\n }\n let out = \"\";\n for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){\n if (i === fromEnd || isPosixPathSeparator(from.charCodeAt(i))) {\n if (out.length === 0) out += \"..\";\n else out += \"/..\";\n }\n }\n if (out.length > 0) return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (isPosixPathSeparator(to.charCodeAt(toStart))) ++toStart;\n return to.slice(toStart);\n }\n}\nfunction toNamespacedPath1(path) {\n return path;\n}\nfunction dirname1(path) {\n if (path.length === 0) return \".\";\n let end = -1;\n let matchedNonSeparator = false;\n for(let i = path.length - 1; i >= 1; --i){\n if (isPosixPathSeparator(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n end = i;\n break;\n }\n } else {\n matchedNonSeparator = true;\n }\n }\n if (end === -1) {\n return isPosixPathSeparator(path.charCodeAt(0)) ? \"/\" : \".\";\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\nfunction basename1(path, suffix = \"\") {\n assertPath(path);\n if (path.length === 0) return path;\n if (typeof suffix !== \"string\") {\n throw new TypeError(`Suffix must be a string. Received ${JSON.stringify(suffix)}`);\n }\n const lastSegment = lastPathSegment(path, isPosixPathSeparator);\n const strippedSegment = stripTrailingSeparators(lastSegment, isPosixPathSeparator);\n return suffix ? stripSuffix(strippedSegment, suffix) : strippedSegment;\n}\nfunction extname1(path) {\n assertPath(path);\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let preDotState = 0;\n for(let i = path.length - 1; i >= 0; --i){\n const code = path.charCodeAt(i);\n if (isPosixPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return \"\";\n }\n return path.slice(startDot, end);\n}\nfunction format1(pathObject) {\n if (pathObject === null || typeof pathObject !== \"object\") {\n throw new TypeError(`The \"pathObject\" argument must be of type Object. Received type ${typeof pathObject}`);\n }\n return _format(\"/\", pathObject);\n}\nfunction parse1(path) {\n assertPath(path);\n const ret = {\n root: \"\",\n dir: \"\",\n base: \"\",\n ext: \"\",\n name: \"\"\n };\n if (path.length === 0) return ret;\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n let start;\n if (isAbsolute) {\n ret.root = \"/\";\n start = 1;\n } else {\n start = 0;\n }\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n let preDotState = 0;\n for(; i >= start; --i){\n const code = path.charCodeAt(i);\n if (isPosixPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) {\n ret.base = ret.name = path.slice(1, end);\n } else {\n ret.base = ret.name = path.slice(startPart, end);\n }\n }\n ret.base = ret.base || \"/\";\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n if (startPart > 0) {\n ret.dir = stripTrailingSeparators(path.slice(0, startPart - 1), isPosixPathSeparator);\n } else if (isAbsolute) ret.dir = \"/\";\n return ret;\n}\nfunction fromFileUrl1(url) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol != \"file:\") {\n throw new TypeError(\"Must be a file URL.\");\n }\n return decodeURIComponent(url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"));\n}\nfunction toFileUrl1(path) {\n if (!isAbsolute1(path)) {\n throw new TypeError(\"Must be an absolute path.\");\n }\n const url = new URL(\"file:///\");\n url.pathname = encodeWhitespace(path.replace(/%/g, \"%25\").replace(/\\\\/g, \"%5C\"));\n return url;\n}\nconst mod1 = {\n sep: sep1,\n delimiter: delimiter1,\n resolve: resolve1,\n normalize: normalize1,\n isAbsolute: isAbsolute1,\n join: join1,\n relative: relative1,\n toNamespacedPath: toNamespacedPath1,\n dirname: dirname1,\n basename: basename1,\n extname: extname1,\n format: format1,\n parse: parse1,\n fromFileUrl: fromFileUrl1,\n toFileUrl: toFileUrl1\n};\nconst path = isWindows ? mod : mod1;\nconst { join: join2 , normalize: normalize2 } = path;\nconst path1 = isWindows ? mod : mod1;\nconst { basename: basename2 , delimiter: delimiter2 , dirname: dirname2 , extname: extname2 , format: format2 , fromFileUrl: fromFileUrl2 , isAbsolute: isAbsolute2 , join: join3 , normalize: normalize3 , parse: parse2 , relative: relative2 , resolve: resolve2 , sep: sep2 , toFileUrl: toFileUrl2 , toNamespacedPath: toNamespacedPath2 } = path1;\nasync function exists(path, options) {\n try {\n const stat = await Deno.stat(path);\n if (options && (options.isReadable || options.isDirectory || options.isFile)) {\n if (options.isDirectory && options.isFile) {\n throw new TypeError(\"ExistsOptions.options.isDirectory and ExistsOptions.options.isFile must not be true together.\");\n }\n if (options.isDirectory && !stat.isDirectory || options.isFile && !stat.isFile) {\n return false;\n }\n if (options.isReadable) {\n if (stat.mode == null) {\n return true;\n }\n if (Deno.uid() == stat.uid) {\n return (stat.mode & 0o400) == 0o400;\n } else if (Deno.gid() == stat.gid) {\n return (stat.mode & 0o040) == 0o040;\n }\n return (stat.mode & 0o004) == 0o004;\n }\n }\n return true;\n } catch (error) {\n if (error instanceof Deno.errors.NotFound) {\n return false;\n }\n if (error instanceof Deno.errors.PermissionDenied) {\n if ((await Deno.permissions.query({\n name: \"read\",\n path\n })).state === \"granted\") {\n return !options?.isReadable;\n }\n }\n throw error;\n }\n}\nnew Deno.errors.AlreadyExists(\"dest already exists.\");\nvar EOL;\n(function(EOL) {\n EOL[\"LF\"] = \"\\n\";\n EOL[\"CRLF\"] = \"\\r\\n\";\n})(EOL || (EOL = {}));\nclass LangAdapter {\n putAdapter;\n #storagePath;\n constructor(context){\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async getLanguageSource(address) {\n const bundlePath = join3(this.#storagePath, `bundle-${address}.js`);\n try {\n await exists(bundlePath);\n const metaFile = Deno.readTextFileSync(bundlePath);\n return metaFile;\n } catch {\n throw new Error(\"Did not find language source for given address:\" + address);\n }\n }\n}\nclass PutAdapter {\n #agent;\n #storagePath;\n constructor(context){\n this.#agent = context.agent;\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async createPublic(language) {\n const hash = UTILS.hash(language.bundle.toString());\n if (hash != language.meta.address) throw new Error(`Language Persistence: Can't store language. Address stated in meta differs from actual file\\nWanted: ${language.meta.address}\\nGot: ${hash}`);\n const agent = this.#agent;\n const expression = agent.createSignedExpression(language.meta);\n const metaPath = join3(this.#storagePath, `meta-${hash}.json`);\n const bundlePath = join3(this.#storagePath, `bundle-${hash}.js`);\n console.log(\"Writing meta & bundle path: \", metaPath, bundlePath);\n Deno.writeTextFileSync(metaPath, JSON.stringify(expression));\n Deno.writeTextFileSync(bundlePath, language.bundle.toString());\n return hash;\n }\n}\nclass Adapter {\n putAdapter;\n #storagePath;\n constructor(context){\n this.putAdapter = new PutAdapter(context);\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async get(address) {\n const metaPath = join3(this.#storagePath, `meta-${address}.json`);\n try {\n await exists(metaPath);\n const metaFile = JSON.parse(Deno.readTextFileSync(metaPath));\n console.log(\"Found meta file info\", metaFile);\n return metaFile;\n } catch {\n return null;\n }\n }\n}\nconst name = \"languages\";\nfunction interactions(expression) {\n return [];\n}\nasync function create(context) {\n const expressionAdapter = new Adapter(context);\n const languageAdapter = new LangAdapter(context);\n return {\n name,\n expressionAdapter,\n languageAdapter,\n interactions\n };\n}\nexport { name as name };\nexport { create as default };\n"} \ No newline at end of file diff --git a/tests/js/publishBootstrapSeed.json b/tests/js/publishBootstrapSeed.json index 44fa4b0ea..88a9166c6 100644 --- a/tests/js/publishBootstrapSeed.json +++ b/tests/js/publishBootstrapSeed.json @@ -1 +1 @@ -{"trustedAgents":[],"knownLinkLanguages":[],"directMessageLanguage":"","agentLanguage":"","perspectiveLanguage":"","neighbourhoodLanguage":"","languageLanguageBundle":""} \ No newline at end of file +{"trustedAgents":[],"knownLinkLanguages":[],"directMessageLanguage":"","agentLanguage":"","perspectiveLanguage":"","neighbourhoodLanguage":"","languageLanguageBundle":"// deno-fmt-ignore-file\n// deno-lint-ignore-file\n// This code was bundled using `deno bundle` and it's not recommended to edit it manually\n\nconst osType = (()=>{\n const { Deno: Deno1 } = globalThis;\n if (typeof Deno1?.build?.os === \"string\") {\n return Deno1.build.os;\n }\n const { navigator } = globalThis;\n if (navigator?.appVersion?.includes?.(\"Win\")) {\n return \"windows\";\n }\n return \"linux\";\n})();\nconst isWindows = osType === \"windows\";\nconst CHAR_FORWARD_SLASH = 47;\nfunction assertPath(path) {\n if (typeof path !== \"string\") {\n throw new TypeError(`Path must be a string. Received ${JSON.stringify(path)}`);\n }\n}\nfunction isPosixPathSeparator(code) {\n return code === 47;\n}\nfunction isPathSeparator(code) {\n return isPosixPathSeparator(code) || code === 92;\n}\nfunction isWindowsDeviceRoot(code) {\n return code >= 97 && code <= 122 || code >= 65 && code <= 90;\n}\nfunction normalizeString(path, allowAboveRoot, separator, isPathSeparator) {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let code;\n for(let i = 0, len = path.length; i <= len; ++i){\n if (i < len) code = path.charCodeAt(i);\n else if (isPathSeparator(code)) break;\n else code = CHAR_FORWARD_SLASH;\n if (isPathSeparator(code)) {\n if (lastSlash === i - 1 || dots === 1) {} else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 || res.charCodeAt(res.length - 2) !== 46) {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(separator);\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(separator);\n }\n lastSlash = i;\n dots = 0;\n continue;\n } else if (res.length === 2 || res.length === 1) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) res += `${separator}..`;\n else res = \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) res += separator + path.slice(lastSlash + 1, i);\n else res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\nfunction _format(sep, pathObject) {\n const dir = pathObject.dir || pathObject.root;\n const base = pathObject.base || (pathObject.name || \"\") + (pathObject.ext || \"\");\n if (!dir) return base;\n if (base === sep) return dir;\n if (dir === pathObject.root) return dir + base;\n return dir + sep + base;\n}\nconst WHITESPACE_ENCODINGS = {\n \"\\u0009\": \"%09\",\n \"\\u000A\": \"%0A\",\n \"\\u000B\": \"%0B\",\n \"\\u000C\": \"%0C\",\n \"\\u000D\": \"%0D\",\n \"\\u0020\": \"%20\"\n};\nfunction encodeWhitespace(string) {\n return string.replaceAll(/[\\s]/g, (c)=>{\n return WHITESPACE_ENCODINGS[c] ?? c;\n });\n}\nfunction lastPathSegment(path, isSep, start = 0) {\n let matchedNonSeparator = false;\n let end = path.length;\n for(let i = path.length - 1; i >= start; --i){\n if (isSep(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n start = i + 1;\n break;\n }\n } else if (!matchedNonSeparator) {\n matchedNonSeparator = true;\n end = i + 1;\n }\n }\n return path.slice(start, end);\n}\nfunction stripTrailingSeparators(segment, isSep) {\n if (segment.length <= 1) {\n return segment;\n }\n let end = segment.length;\n for(let i = segment.length - 1; i > 0; i--){\n if (isSep(segment.charCodeAt(i))) {\n end = i;\n } else {\n break;\n }\n }\n return segment.slice(0, end);\n}\nfunction stripSuffix(name, suffix) {\n if (suffix.length >= name.length) {\n return name;\n }\n const lenDiff = name.length - suffix.length;\n for(let i = suffix.length - 1; i >= 0; --i){\n if (name.charCodeAt(lenDiff + i) !== suffix.charCodeAt(i)) {\n return name;\n }\n }\n return name.slice(0, -suffix.length);\n}\nclass DenoStdInternalError extends Error {\n constructor(message){\n super(message);\n this.name = \"DenoStdInternalError\";\n }\n}\nfunction assert(expr, msg = \"\") {\n if (!expr) {\n throw new DenoStdInternalError(msg);\n }\n}\nconst sep = \"\\\\\";\nconst delimiter = \";\";\nfunction resolve(...pathSegments) {\n let resolvedDevice = \"\";\n let resolvedTail = \"\";\n let resolvedAbsolute = false;\n for(let i = pathSegments.length - 1; i >= -1; i--){\n let path;\n const { Deno: Deno1 } = globalThis;\n if (i >= 0) {\n path = pathSegments[i];\n } else if (!resolvedDevice) {\n if (typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a drive-letter-less path without a CWD.\");\n }\n path = Deno1.cwd();\n } else {\n if (typeof Deno1?.env?.get !== \"function\" || typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a relative path without a CWD.\");\n }\n path = Deno1.cwd();\n if (path === undefined || path.slice(0, 3).toLowerCase() !== `${resolvedDevice.toLowerCase()}\\\\`) {\n path = `${resolvedDevice}\\\\`;\n }\n }\n assertPath(path);\n const len = path.length;\n if (len === 0) continue;\n let rootEnd = 0;\n let device = \"\";\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last)}`;\n rootEnd = j;\n } else if (j !== last) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n rootEnd = 1;\n isAbsolute = true;\n }\n if (device.length > 0 && resolvedDevice.length > 0 && device.toLowerCase() !== resolvedDevice.toLowerCase()) {\n continue;\n }\n if (resolvedDevice.length === 0 && device.length > 0) {\n resolvedDevice = device;\n }\n if (!resolvedAbsolute) {\n resolvedTail = `${path.slice(rootEnd)}\\\\${resolvedTail}`;\n resolvedAbsolute = isAbsolute;\n }\n if (resolvedAbsolute && resolvedDevice.length > 0) break;\n }\n resolvedTail = normalizeString(resolvedTail, !resolvedAbsolute, \"\\\\\", isPathSeparator);\n return resolvedDevice + (resolvedAbsolute ? \"\\\\\" : \"\") + resolvedTail || \".\";\n}\nfunction normalize(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return \".\";\n let rootEnd = 0;\n let device;\n let isAbsolute = false;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n isAbsolute = true;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n const firstPart = path.slice(last, j);\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n return `\\\\\\\\${firstPart}\\\\${path.slice(last)}\\\\`;\n } else if (j !== last) {\n device = `\\\\\\\\${firstPart}\\\\${path.slice(last, j)}`;\n rootEnd = j;\n }\n }\n }\n } else {\n rootEnd = 1;\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n device = path.slice(0, 2);\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n isAbsolute = true;\n rootEnd = 3;\n }\n }\n }\n }\n } else if (isPathSeparator(code)) {\n return \"\\\\\";\n }\n let tail;\n if (rootEnd < len) {\n tail = normalizeString(path.slice(rootEnd), !isAbsolute, \"\\\\\", isPathSeparator);\n } else {\n tail = \"\";\n }\n if (tail.length === 0 && !isAbsolute) tail = \".\";\n if (tail.length > 0 && isPathSeparator(path.charCodeAt(len - 1))) {\n tail += \"\\\\\";\n }\n if (device === undefined) {\n if (isAbsolute) {\n if (tail.length > 0) return `\\\\${tail}`;\n else return \"\\\\\";\n } else if (tail.length > 0) {\n return tail;\n } else {\n return \"\";\n }\n } else if (isAbsolute) {\n if (tail.length > 0) return `${device}\\\\${tail}`;\n else return `${device}\\\\`;\n } else if (tail.length > 0) {\n return device + tail;\n } else {\n return device;\n }\n}\nfunction isAbsolute(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return false;\n const code = path.charCodeAt(0);\n if (isPathSeparator(code)) {\n return true;\n } else if (isWindowsDeviceRoot(code)) {\n if (len > 2 && path.charCodeAt(1) === 58) {\n if (isPathSeparator(path.charCodeAt(2))) return true;\n }\n }\n return false;\n}\nfunction join(...paths) {\n const pathsCount = paths.length;\n if (pathsCount === 0) return \".\";\n let joined;\n let firstPart = null;\n for(let i = 0; i < pathsCount; ++i){\n const path = paths[i];\n assertPath(path);\n if (path.length > 0) {\n if (joined === undefined) joined = firstPart = path;\n else joined += `\\\\${path}`;\n }\n }\n if (joined === undefined) return \".\";\n let needsReplace = true;\n let slashCount = 0;\n assert(firstPart != null);\n if (isPathSeparator(firstPart.charCodeAt(0))) {\n ++slashCount;\n const firstLen = firstPart.length;\n if (firstLen > 1) {\n if (isPathSeparator(firstPart.charCodeAt(1))) {\n ++slashCount;\n if (firstLen > 2) {\n if (isPathSeparator(firstPart.charCodeAt(2))) ++slashCount;\n else {\n needsReplace = false;\n }\n }\n }\n }\n }\n if (needsReplace) {\n for(; slashCount < joined.length; ++slashCount){\n if (!isPathSeparator(joined.charCodeAt(slashCount))) break;\n }\n if (slashCount >= 2) joined = `\\\\${joined.slice(slashCount)}`;\n }\n return normalize(joined);\n}\nfunction relative(from, to) {\n assertPath(from);\n assertPath(to);\n if (from === to) return \"\";\n const fromOrig = resolve(from);\n const toOrig = resolve(to);\n if (fromOrig === toOrig) return \"\";\n from = fromOrig.toLowerCase();\n to = toOrig.toLowerCase();\n if (from === to) return \"\";\n let fromStart = 0;\n let fromEnd = from.length;\n for(; fromStart < fromEnd; ++fromStart){\n if (from.charCodeAt(fromStart) !== 92) break;\n }\n for(; fromEnd - 1 > fromStart; --fromEnd){\n if (from.charCodeAt(fromEnd - 1) !== 92) break;\n }\n const fromLen = fromEnd - fromStart;\n let toStart = 0;\n let toEnd = to.length;\n for(; toStart < toEnd; ++toStart){\n if (to.charCodeAt(toStart) !== 92) break;\n }\n for(; toEnd - 1 > toStart; --toEnd){\n if (to.charCodeAt(toEnd - 1) !== 92) break;\n }\n const toLen = toEnd - toStart;\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for(; i <= length; ++i){\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 92) {\n return toOrig.slice(toStart + i + 1);\n } else if (i === 2) {\n return toOrig.slice(toStart + i);\n }\n }\n if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 92) {\n lastCommonSep = i;\n } else if (i === 2) {\n lastCommonSep = 3;\n }\n }\n break;\n }\n const fromCode = from.charCodeAt(fromStart + i);\n const toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode) break;\n else if (fromCode === 92) lastCommonSep = i;\n }\n if (i !== length && lastCommonSep === -1) {\n return toOrig;\n }\n let out = \"\";\n if (lastCommonSep === -1) lastCommonSep = 0;\n for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){\n if (i === fromEnd || from.charCodeAt(i) === 92) {\n if (out.length === 0) out += \"..\";\n else out += \"\\\\..\";\n }\n }\n if (out.length > 0) {\n return out + toOrig.slice(toStart + lastCommonSep, toEnd);\n } else {\n toStart += lastCommonSep;\n if (toOrig.charCodeAt(toStart) === 92) ++toStart;\n return toOrig.slice(toStart, toEnd);\n }\n}\nfunction toNamespacedPath(path) {\n if (typeof path !== \"string\") return path;\n if (path.length === 0) return \"\";\n const resolvedPath = resolve(path);\n if (resolvedPath.length >= 3) {\n if (resolvedPath.charCodeAt(0) === 92) {\n if (resolvedPath.charCodeAt(1) === 92) {\n const code = resolvedPath.charCodeAt(2);\n if (code !== 63 && code !== 46) {\n return `\\\\\\\\?\\\\UNC\\\\${resolvedPath.slice(2)}`;\n }\n }\n } else if (isWindowsDeviceRoot(resolvedPath.charCodeAt(0))) {\n if (resolvedPath.charCodeAt(1) === 58 && resolvedPath.charCodeAt(2) === 92) {\n return `\\\\\\\\?\\\\${resolvedPath}`;\n }\n }\n }\n return path;\n}\nfunction dirname(path) {\n assertPath(path);\n const len = path.length;\n if (len === 0) return \".\";\n let rootEnd = -1;\n let end = -1;\n let matchedSlash = true;\n let offset = 0;\n const code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n rootEnd = offset = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n return path;\n }\n if (j !== last) {\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n rootEnd = offset = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) rootEnd = offset = 3;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n return path;\n }\n for(let i = len - 1; i >= offset; --i){\n if (isPathSeparator(path.charCodeAt(i))) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n matchedSlash = false;\n }\n }\n if (end === -1) {\n if (rootEnd === -1) return \".\";\n else end = rootEnd;\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\nfunction basename(path, suffix = \"\") {\n assertPath(path);\n if (path.length === 0) return path;\n if (typeof suffix !== \"string\") {\n throw new TypeError(`Suffix must be a string. Received ${JSON.stringify(suffix)}`);\n }\n let start = 0;\n if (path.length >= 2) {\n const drive = path.charCodeAt(0);\n if (isWindowsDeviceRoot(drive)) {\n if (path.charCodeAt(1) === 58) start = 2;\n }\n }\n const lastSegment = lastPathSegment(path, isPathSeparator, start);\n const strippedSegment = stripTrailingSeparators(lastSegment, isPathSeparator);\n return suffix ? stripSuffix(strippedSegment, suffix) : strippedSegment;\n}\nfunction extname(path) {\n assertPath(path);\n let start = 0;\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let preDotState = 0;\n if (path.length >= 2 && path.charCodeAt(1) === 58 && isWindowsDeviceRoot(path.charCodeAt(0))) {\n start = startPart = 2;\n }\n for(let i = path.length - 1; i >= start; --i){\n const code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return \"\";\n }\n return path.slice(startDot, end);\n}\nfunction format(pathObject) {\n if (pathObject === null || typeof pathObject !== \"object\") {\n throw new TypeError(`The \"pathObject\" argument must be of type Object. Received type ${typeof pathObject}`);\n }\n return _format(\"\\\\\", pathObject);\n}\nfunction parse(path) {\n assertPath(path);\n const ret = {\n root: \"\",\n dir: \"\",\n base: \"\",\n ext: \"\",\n name: \"\"\n };\n const len = path.length;\n if (len === 0) return ret;\n let rootEnd = 0;\n let code = path.charCodeAt(0);\n if (len > 1) {\n if (isPathSeparator(code)) {\n rootEnd = 1;\n if (isPathSeparator(path.charCodeAt(1))) {\n let j = 2;\n let last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (!isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j < len && j !== last) {\n last = j;\n for(; j < len; ++j){\n if (isPathSeparator(path.charCodeAt(j))) break;\n }\n if (j === len) {\n rootEnd = j;\n } else if (j !== last) {\n rootEnd = j + 1;\n }\n }\n }\n }\n } else if (isWindowsDeviceRoot(code)) {\n if (path.charCodeAt(1) === 58) {\n rootEnd = 2;\n if (len > 2) {\n if (isPathSeparator(path.charCodeAt(2))) {\n if (len === 3) {\n ret.root = ret.dir = path;\n ret.base = \"\\\\\";\n return ret;\n }\n rootEnd = 3;\n }\n } else {\n ret.root = ret.dir = path;\n return ret;\n }\n }\n }\n } else if (isPathSeparator(code)) {\n ret.root = ret.dir = path;\n ret.base = \"\\\\\";\n return ret;\n }\n if (rootEnd > 0) ret.root = path.slice(0, rootEnd);\n let startDot = -1;\n let startPart = rootEnd;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n let preDotState = 0;\n for(; i >= rootEnd; --i){\n code = path.charCodeAt(i);\n if (isPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n ret.ext = path.slice(startDot, end);\n }\n ret.base = ret.base || \"\\\\\";\n if (startPart > 0 && startPart !== rootEnd) {\n ret.dir = path.slice(0, startPart - 1);\n } else ret.dir = ret.root;\n return ret;\n}\nfunction fromFileUrl(url) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol != \"file:\") {\n throw new TypeError(\"Must be a file URL.\");\n }\n let path = decodeURIComponent(url.pathname.replace(/\\//g, \"\\\\\").replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\")).replace(/^\\\\*([A-Za-z]:)(\\\\|$)/, \"$1\\\\\");\n if (url.hostname != \"\") {\n path = `\\\\\\\\${url.hostname}${path}`;\n }\n return path;\n}\nfunction toFileUrl(path) {\n if (!isAbsolute(path)) {\n throw new TypeError(\"Must be an absolute path.\");\n }\n const [, hostname, pathname] = path.match(/^(?:[/\\\\]{2}([^/\\\\]+)(?=[/\\\\](?:[^/\\\\]|$)))?(.*)/);\n const url = new URL(\"file:///\");\n url.pathname = encodeWhitespace(pathname.replace(/%/g, \"%25\"));\n if (hostname != null && hostname != \"localhost\") {\n url.hostname = hostname;\n if (!url.hostname) {\n throw new TypeError(\"Invalid hostname.\");\n }\n }\n return url;\n}\nconst mod = {\n sep: sep,\n delimiter: delimiter,\n resolve: resolve,\n normalize: normalize,\n isAbsolute: isAbsolute,\n join: join,\n relative: relative,\n toNamespacedPath: toNamespacedPath,\n dirname: dirname,\n basename: basename,\n extname: extname,\n format: format,\n parse: parse,\n fromFileUrl: fromFileUrl,\n toFileUrl: toFileUrl\n};\nconst sep1 = \"/\";\nconst delimiter1 = \":\";\nfunction resolve1(...pathSegments) {\n let resolvedPath = \"\";\n let resolvedAbsolute = false;\n for(let i = pathSegments.length - 1; i >= -1 && !resolvedAbsolute; i--){\n let path;\n if (i >= 0) path = pathSegments[i];\n else {\n const { Deno: Deno1 } = globalThis;\n if (typeof Deno1?.cwd !== \"function\") {\n throw new TypeError(\"Resolved a relative path without a CWD.\");\n }\n path = Deno1.cwd();\n }\n assertPath(path);\n if (path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n }\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute, \"/\", isPosixPathSeparator);\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0) return `/${resolvedPath}`;\n else return \"/\";\n } else if (resolvedPath.length > 0) return resolvedPath;\n else return \".\";\n}\nfunction normalize1(path) {\n assertPath(path);\n if (path.length === 0) return \".\";\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n const trailingSeparator = isPosixPathSeparator(path.charCodeAt(path.length - 1));\n path = normalizeString(path, !isAbsolute, \"/\", isPosixPathSeparator);\n if (path.length === 0 && !isAbsolute) path = \".\";\n if (path.length > 0 && trailingSeparator) path += \"/\";\n if (isAbsolute) return `/${path}`;\n return path;\n}\nfunction isAbsolute1(path) {\n assertPath(path);\n return path.length > 0 && isPosixPathSeparator(path.charCodeAt(0));\n}\nfunction join1(...paths) {\n if (paths.length === 0) return \".\";\n let joined;\n for(let i = 0, len = paths.length; i < len; ++i){\n const path = paths[i];\n assertPath(path);\n if (path.length > 0) {\n if (!joined) joined = path;\n else joined += `/${path}`;\n }\n }\n if (!joined) return \".\";\n return normalize1(joined);\n}\nfunction relative1(from, to) {\n assertPath(from);\n assertPath(to);\n if (from === to) return \"\";\n from = resolve1(from);\n to = resolve1(to);\n if (from === to) return \"\";\n let fromStart = 1;\n const fromEnd = from.length;\n for(; fromStart < fromEnd; ++fromStart){\n if (!isPosixPathSeparator(from.charCodeAt(fromStart))) break;\n }\n const fromLen = fromEnd - fromStart;\n let toStart = 1;\n const toEnd = to.length;\n for(; toStart < toEnd; ++toStart){\n if (!isPosixPathSeparator(to.charCodeAt(toStart))) break;\n }\n const toLen = toEnd - toStart;\n const length = fromLen < toLen ? fromLen : toLen;\n let lastCommonSep = -1;\n let i = 0;\n for(; i <= length; ++i){\n if (i === length) {\n if (toLen > length) {\n if (isPosixPathSeparator(to.charCodeAt(toStart + i))) {\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (isPosixPathSeparator(from.charCodeAt(fromStart + i))) {\n lastCommonSep = i;\n } else if (i === 0) {\n lastCommonSep = 0;\n }\n }\n break;\n }\n const fromCode = from.charCodeAt(fromStart + i);\n const toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode) break;\n else if (isPosixPathSeparator(fromCode)) lastCommonSep = i;\n }\n let out = \"\";\n for(i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i){\n if (i === fromEnd || isPosixPathSeparator(from.charCodeAt(i))) {\n if (out.length === 0) out += \"..\";\n else out += \"/..\";\n }\n }\n if (out.length > 0) return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (isPosixPathSeparator(to.charCodeAt(toStart))) ++toStart;\n return to.slice(toStart);\n }\n}\nfunction toNamespacedPath1(path) {\n return path;\n}\nfunction dirname1(path) {\n if (path.length === 0) return \".\";\n let end = -1;\n let matchedNonSeparator = false;\n for(let i = path.length - 1; i >= 1; --i){\n if (isPosixPathSeparator(path.charCodeAt(i))) {\n if (matchedNonSeparator) {\n end = i;\n break;\n }\n } else {\n matchedNonSeparator = true;\n }\n }\n if (end === -1) {\n return isPosixPathSeparator(path.charCodeAt(0)) ? \"/\" : \".\";\n }\n return stripTrailingSeparators(path.slice(0, end), isPosixPathSeparator);\n}\nfunction basename1(path, suffix = \"\") {\n assertPath(path);\n if (path.length === 0) return path;\n if (typeof suffix !== \"string\") {\n throw new TypeError(`Suffix must be a string. Received ${JSON.stringify(suffix)}`);\n }\n const lastSegment = lastPathSegment(path, isPosixPathSeparator);\n const strippedSegment = stripTrailingSeparators(lastSegment, isPosixPathSeparator);\n return suffix ? stripSuffix(strippedSegment, suffix) : strippedSegment;\n}\nfunction extname1(path) {\n assertPath(path);\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let preDotState = 0;\n for(let i = path.length - 1; i >= 0; --i){\n const code = path.charCodeAt(i);\n if (isPosixPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return \"\";\n }\n return path.slice(startDot, end);\n}\nfunction format1(pathObject) {\n if (pathObject === null || typeof pathObject !== \"object\") {\n throw new TypeError(`The \"pathObject\" argument must be of type Object. Received type ${typeof pathObject}`);\n }\n return _format(\"/\", pathObject);\n}\nfunction parse1(path) {\n assertPath(path);\n const ret = {\n root: \"\",\n dir: \"\",\n base: \"\",\n ext: \"\",\n name: \"\"\n };\n if (path.length === 0) return ret;\n const isAbsolute = isPosixPathSeparator(path.charCodeAt(0));\n let start;\n if (isAbsolute) {\n ret.root = \"/\";\n start = 1;\n } else {\n start = 0;\n }\n let startDot = -1;\n let startPart = 0;\n let end = -1;\n let matchedSlash = true;\n let i = path.length - 1;\n let preDotState = 0;\n for(; i >= start; --i){\n const code = path.charCodeAt(i);\n if (isPosixPathSeparator(code)) {\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46) {\n if (startDot === -1) startDot = i;\n else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n preDotState = -1;\n }\n }\n if (startDot === -1 || end === -1 || preDotState === 0 || preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) {\n ret.base = ret.name = path.slice(1, end);\n } else {\n ret.base = ret.name = path.slice(startPart, end);\n }\n }\n ret.base = ret.base || \"/\";\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n if (startPart > 0) {\n ret.dir = stripTrailingSeparators(path.slice(0, startPart - 1), isPosixPathSeparator);\n } else if (isAbsolute) ret.dir = \"/\";\n return ret;\n}\nfunction fromFileUrl1(url) {\n url = url instanceof URL ? url : new URL(url);\n if (url.protocol != \"file:\") {\n throw new TypeError(\"Must be a file URL.\");\n }\n return decodeURIComponent(url.pathname.replace(/%(?![0-9A-Fa-f]{2})/g, \"%25\"));\n}\nfunction toFileUrl1(path) {\n if (!isAbsolute1(path)) {\n throw new TypeError(\"Must be an absolute path.\");\n }\n const url = new URL(\"file:///\");\n url.pathname = encodeWhitespace(path.replace(/%/g, \"%25\").replace(/\\\\/g, \"%5C\"));\n return url;\n}\nconst mod1 = {\n sep: sep1,\n delimiter: delimiter1,\n resolve: resolve1,\n normalize: normalize1,\n isAbsolute: isAbsolute1,\n join: join1,\n relative: relative1,\n toNamespacedPath: toNamespacedPath1,\n dirname: dirname1,\n basename: basename1,\n extname: extname1,\n format: format1,\n parse: parse1,\n fromFileUrl: fromFileUrl1,\n toFileUrl: toFileUrl1\n};\nconst path = isWindows ? mod : mod1;\nconst { join: join2 , normalize: normalize2 } = path;\nconst path1 = isWindows ? mod : mod1;\nconst { basename: basename2 , delimiter: delimiter2 , dirname: dirname2 , extname: extname2 , format: format2 , fromFileUrl: fromFileUrl2 , isAbsolute: isAbsolute2 , join: join3 , normalize: normalize3 , parse: parse2 , relative: relative2 , resolve: resolve2 , sep: sep2 , toFileUrl: toFileUrl2 , toNamespacedPath: toNamespacedPath2 } = path1;\nasync function exists(path, options) {\n try {\n const stat = await Deno.stat(path);\n if (options && (options.isReadable || options.isDirectory || options.isFile)) {\n if (options.isDirectory && options.isFile) {\n throw new TypeError(\"ExistsOptions.options.isDirectory and ExistsOptions.options.isFile must not be true together.\");\n }\n if (options.isDirectory && !stat.isDirectory || options.isFile && !stat.isFile) {\n return false;\n }\n if (options.isReadable) {\n if (stat.mode == null) {\n return true;\n }\n if (Deno.uid() == stat.uid) {\n return (stat.mode & 0o400) == 0o400;\n } else if (Deno.gid() == stat.gid) {\n return (stat.mode & 0o040) == 0o040;\n }\n return (stat.mode & 0o004) == 0o004;\n }\n }\n return true;\n } catch (error) {\n if (error instanceof Deno.errors.NotFound) {\n return false;\n }\n if (error instanceof Deno.errors.PermissionDenied) {\n if ((await Deno.permissions.query({\n name: \"read\",\n path\n })).state === \"granted\") {\n return !options?.isReadable;\n }\n }\n throw error;\n }\n}\nnew Deno.errors.AlreadyExists(\"dest already exists.\");\nvar EOL;\n(function(EOL) {\n EOL[\"LF\"] = \"\\n\";\n EOL[\"CRLF\"] = \"\\r\\n\";\n})(EOL || (EOL = {}));\nclass LangAdapter {\n putAdapter;\n #storagePath;\n constructor(context){\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async getLanguageSource(address) {\n const bundlePath = join3(this.#storagePath, `bundle-${address}.js`);\n try {\n await exists(bundlePath);\n const metaFile = Deno.readTextFileSync(bundlePath);\n return metaFile;\n } catch {\n throw new Error(\"Did not find language source for given address:\" + address);\n }\n }\n}\nclass PutAdapter {\n #agent;\n #storagePath;\n constructor(context){\n this.#agent = context.agent;\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async createPublic(language) {\n const hash = UTILS.hash(language.bundle.toString());\n if (hash != language.meta.address) throw new Error(`Language Persistence: Can't store language. Address stated in meta differs from actual file\\nWanted: ${language.meta.address}\\nGot: ${hash}`);\n const agent = this.#agent;\n const expression = agent.createSignedExpression(language.meta);\n const metaPath = join3(this.#storagePath, `meta-${hash}.json`);\n const bundlePath = join3(this.#storagePath, `bundle-${hash}.js`);\n console.log(\"Writing meta & bundle path: \", metaPath, bundlePath);\n Deno.writeTextFileSync(metaPath, JSON.stringify(expression));\n Deno.writeTextFileSync(bundlePath, language.bundle.toString());\n return hash;\n }\n}\nclass Adapter {\n putAdapter;\n #storagePath;\n constructor(context){\n this.putAdapter = new PutAdapter(context);\n if (\"storagePath\" in context.customSettings) {\n this.#storagePath = context.customSettings[\"storagePath\"];\n } else {\n this.#storagePath = \"./tst-tmp/languages\";\n }\n }\n async get(address) {\n const metaPath = join3(this.#storagePath, `meta-${address}.json`);\n try {\n await exists(metaPath);\n const metaFile = JSON.parse(Deno.readTextFileSync(metaPath));\n console.log(\"Found meta file info\", metaFile);\n return metaFile;\n } catch {\n return null;\n }\n }\n}\nconst name = \"languages\";\nfunction interactions(expression) {\n return [];\n}\nasync function create(context) {\n const expressionAdapter = new Adapter(context);\n const languageAdapter = new LangAdapter(context);\n return {\n name,\n expressionAdapter,\n languageAdapter,\n interactions\n };\n}\nexport { name as name };\nexport { create as default };\n"} \ No newline at end of file diff --git a/tests/js/scripts/get-builtin-test-langs.js b/tests/js/scripts/get-builtin-test-langs.js index f1aa09a33..5b0287946 100644 --- a/tests/js/scripts/get-builtin-test-langs.js +++ b/tests/js/scripts/get-builtin-test-langs.js @@ -15,7 +15,7 @@ const languages = { bundle: "https://github.com/perspect3vism/local-neighbourhood-persistence/releases/download/0.0.6/bundle.js", }, "perspective-diff-sync": { - bundle: "../../bootstrap-languages/p-diff-sync/build/bundle.js", + bundle: "../../bootstrap-languages/centralized-p-diff-sync-socket-signaling/build/bundle.js", }, "direct-message-language": { bundle: "../../bootstrap-languages/direct-message-language/build/bundle.js" diff --git a/tests/js/tests/integration.test.ts b/tests/js/tests/integration.test.ts index 99d526136..541574ec2 100644 --- a/tests/js/tests/integration.test.ts +++ b/tests/js/tests/integration.test.ts @@ -128,10 +128,10 @@ describe("Integration tests", function () { }) describe('Agent / Agent-Setup', agentTests(testContext)) - describe('Runtime', runtimeTests(testContext)) - describe('Expression', expressionTests(testContext)) - describe('Perspective', perspectiveTests(testContext)) - describe('Social DNA', socialDNATests(testContext)) + // describe('Runtime', runtimeTests(testContext)) + // describe('Expression', expressionTests(testContext)) + // describe('Perspective', perspectiveTests(testContext)) + // describe('Social DNA', socialDNATests(testContext)) describe('with Alice and Bob', () => { let bobExecutorProcess: ChildProcess | null = null @@ -171,8 +171,8 @@ describe("Integration tests", function () { } }) - describe('Agent Language', agentLanguageTests(testContext)) - describe('Direct Messages', directMessageTests(testContext)) + // describe('Agent Language', agentLanguageTests(testContext)) + // describe('Direct Messages', directMessageTests(testContext)) describe('Language', languageTests(testContext)) describe('Neighbourhood', neighbourhoodTests(testContext)) }) diff --git a/tests/js/tests/neighbourhood.ts b/tests/js/tests/neighbourhood.ts index 0cb7d90c6..3cd8be6f9 100644 --- a/tests/js/tests/neighbourhood.ts +++ b/tests/js/tests/neighbourhood.ts @@ -97,49 +97,49 @@ export default function neighbourhoodTests(testContext: TestContext) { expect(bobLinks.length).to.be.equal(1) }) - it('local link created by Alice NOT received by Bob', async () => { - const alice = testContext.alice - const bob = testContext.bob + // it('local link created by Alice NOT received by Bob', async () => { + // const alice = testContext.alice + // const bob = testContext.bob - aliceP1 = await alice.perspective.add("friends") - const socialContext = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood with Bob test local links"})); - const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, socialContext.address, new Perspective()) - console.log("neighbourhoodUrl", neighbourhoodUrl); - bobP1 = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); + // aliceP1 = await alice.perspective.add("friends") + // const socialContext = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood with Bob test local links"})); + // const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, socialContext.address, new Perspective()) + // console.log("neighbourhoodUrl", neighbourhoodUrl); + // bobP1 = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); - await testContext.makeAllNodesKnown() + // await testContext.makeAllNodesKnown() - await sleep(1000) + // await sleep(1000) - await alice.perspective.addLink(aliceP1.uuid, {source: 'root', target: 'test://test'}, 'local') + // await alice.perspective.addLink(aliceP1.uuid, {source: 'root', target: 'test://test'}, 'local') - await sleep(1000) + // await sleep(1000) - let bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) - let tries = 1 + // let bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) + // let tries = 1 - while(bobLinks.length < 1 && tries < 5) { - console.log("Bob retrying getting NOT received links..."); - await sleep(1000) - bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) - tries++ - } + // while(bobLinks.length < 1 && tries < 5) { + // console.log("Bob retrying getting NOT received links..."); + // await sleep(1000) + // bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) + // tries++ + // } - expect(bobLinks.length).to.be.equal(0) - }) + // expect(bobLinks.length).to.be.equal(0) + // }) - it('can delete neighbourhood', async () => { - const alice = testContext.alice; - const bob = testContext.bob; + // it('can delete neighbourhood', async () => { + // const alice = testContext.alice; + // const bob = testContext.bob; - const deleteNeighbourhood = await alice.perspective.remove(aliceP1!.uuid); - expect(deleteNeighbourhood.perspectiveRemove).to.be.true; + // const deleteNeighbourhood = await alice.perspective.remove(aliceP1!.uuid); + // expect(deleteNeighbourhood.perspectiveRemove).to.be.true; - const bobDeleteNeighbourhood = await bob.perspective.remove(bobP1!.uuid); - expect(bobDeleteNeighbourhood.perspectiveRemove).to.be.true; + // const bobDeleteNeighbourhood = await bob.perspective.remove(bobP1!.uuid); + // expect(bobDeleteNeighbourhood.perspectiveRemove).to.be.true; - const perspectives = await alice.perspective.all(); - }) + // const perspectives = await alice.perspective.all(); + // }) // it('can get the correct state change signals', async () => { // const aliceP1 = await testContext.alice.perspective.add("state-changes") @@ -200,137 +200,137 @@ export default function neighbourhoodTests(testContext: TestContext) { // expect(bobSyncChangeData).to.be.equal(PerspectiveState.Synced); // }) - describe('with set up and joined NH for Telepresence', async () => { - let aliceNH: NeighbourhoodProxy|undefined - let bobNH: NeighbourhoodProxy|undefined - let aliceDID: string|undefined - let bobDID: string|undefined - - before(async () => { - const alice = testContext.alice - const bob = testContext.bob - - const aliceP1 = await alice.perspective.add("telepresence") - const linkLang = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood for Telepresence"})); - const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, linkLang.address, new Perspective()) - await sleep(5000) - const bobP1Handle = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); - const bobP1 = await bob.perspective.byUUID(bobP1Handle.uuid) - await testContext.makeAllNodesKnown() + // describe('with set up and joined NH for Telepresence', async () => { + // let aliceNH: NeighbourhoodProxy|undefined + // let bobNH: NeighbourhoodProxy|undefined + // let aliceDID: string|undefined + // let bobDID: string|undefined + + // before(async () => { + // const alice = testContext.alice + // const bob = testContext.bob + + // const aliceP1 = await alice.perspective.add("telepresence") + // const linkLang = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood for Telepresence"})); + // const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, linkLang.address, new Perspective()) + // await sleep(5000) + // const bobP1Handle = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); + // const bobP1 = await bob.perspective.byUUID(bobP1Handle.uuid) + // await testContext.makeAllNodesKnown() - aliceNH = aliceP1.getNeighbourhoodProxy() - bobNH = bobP1!.getNeighbourhoodProxy() - aliceDID = (await alice.agent.me()).did - bobDID = (await bob.agent.me()).did - await sleep(5000) - }) - - it('they see each other in `otherAgents`', async () => { - await sleep(10000); - const aliceAgents = await aliceNH!.otherAgents() - console.log("alice agents", aliceAgents); - const bobAgents = await bobNH!.otherAgents() - console.log("bob agents", bobAgents); - expect(aliceAgents.length).to.be.equal(1) - expect(aliceAgents[0]).to.be.equal(bobDID) - expect(bobAgents.length).to.be.equal(1) - expect(bobAgents[0]).to.be.equal(aliceDID) - }) - - it('they can set their online status and see each others online status in `onlineAgents`', async () => { - let link = new LinkExpression() - link.author = "did:test"; - link.timestamp = new Date().toISOString(); - link.data = new Link({source: "src", target: "target", predicate: "pred"}); - link.proof = new ExpressionProof("sig", "key"); - link.proof.invalid = true; - link.proof.valid = false; - const testPerspective = new Perspective([link]) - await aliceNH!.setOnlineStatus(testPerspective) - await bobNH!.setOnlineStatus(testPerspective) - - const aliceOnline = await aliceNH!.onlineAgents() - const bobOnline = await bobNH!.onlineAgents() - expect(aliceOnline.length).to.be.equal(1) - expect(aliceOnline[0].did).to.be.equal(bobDID) - console.log(aliceOnline[0].status); - expect(aliceOnline[0].status.data.links).to.deep.equal(testPerspective.links) + // aliceNH = aliceP1.getNeighbourhoodProxy() + // bobNH = bobP1!.getNeighbourhoodProxy() + // aliceDID = (await alice.agent.me()).did + // bobDID = (await bob.agent.me()).did + // await sleep(5000) + // }) + + // it('they see each other in `otherAgents`', async () => { + // await sleep(10000); + // const aliceAgents = await aliceNH!.otherAgents() + // console.log("alice agents", aliceAgents); + // const bobAgents = await bobNH!.otherAgents() + // console.log("bob agents", bobAgents); + // expect(aliceAgents.length).to.be.equal(1) + // expect(aliceAgents[0]).to.be.equal(bobDID) + // expect(bobAgents.length).to.be.equal(1) + // expect(bobAgents[0]).to.be.equal(aliceDID) + // }) + + // it('they can set their online status and see each others online status in `onlineAgents`', async () => { + // let link = new LinkExpression() + // link.author = "did:test"; + // link.timestamp = new Date().toISOString(); + // link.data = new Link({source: "src", target: "target", predicate: "pred"}); + // link.proof = new ExpressionProof("sig", "key"); + // link.proof.invalid = true; + // link.proof.valid = false; + // const testPerspective = new Perspective([link]) + // await aliceNH!.setOnlineStatus(testPerspective) + // await bobNH!.setOnlineStatus(testPerspective) + + // const aliceOnline = await aliceNH!.onlineAgents() + // const bobOnline = await bobNH!.onlineAgents() + // expect(aliceOnline.length).to.be.equal(1) + // expect(aliceOnline[0].did).to.be.equal(bobDID) + // console.log(aliceOnline[0].status); + // expect(aliceOnline[0].status.data.links).to.deep.equal(testPerspective.links) - expect(bobOnline.length).to.be.equal(1) - expect(bobOnline[0].did).to.be.equal(aliceDID) - expect(bobOnline[0].status.data.links).to.deep.equal(testPerspective.links) - - - await aliceNH!.setOnlineStatusU(PerspectiveUnsignedInput.fromLink(new Link({ - source: "test://source", - target: "test://target" - }))) - - const bobOnline2 = await bobNH!.onlineAgents() - - expect(bobOnline2.length).to.be.equal(1) - expect(bobOnline2[0].did).to.be.equal(aliceDID) - expect(bobOnline2[0].status.data.links[0].data.source).to.equal("test://source") - expect(bobOnline2[0].status.data.links[0].data.target).to.equal("test://target") - expect(bobOnline2[0].status.data.links[0].proof.valid).to.be.true - // TODO: Signature check for the whole perspective is broken - // Got to fix that and add back this assertion - //expect(bobOnline2[0].status.proof.valid).to.be.true + // expect(bobOnline.length).to.be.equal(1) + // expect(bobOnline[0].did).to.be.equal(aliceDID) + // expect(bobOnline[0].status.data.links).to.deep.equal(testPerspective.links) + + + // await aliceNH!.setOnlineStatusU(PerspectiveUnsignedInput.fromLink(new Link({ + // source: "test://source", + // target: "test://target" + // }))) + + // const bobOnline2 = await bobNH!.onlineAgents() + + // expect(bobOnline2.length).to.be.equal(1) + // expect(bobOnline2[0].did).to.be.equal(aliceDID) + // expect(bobOnline2[0].status.data.links[0].data.source).to.equal("test://source") + // expect(bobOnline2[0].status.data.links[0].data.target).to.equal("test://target") + // expect(bobOnline2[0].status.data.links[0].proof.valid).to.be.true + // // TODO: Signature check for the whole perspective is broken + // // Got to fix that and add back this assertion + // //expect(bobOnline2[0].status.proof.valid).to.be.true - }) - - it('they can send signals via `sendSignal` and receive callbacks via `addSignalHandler`', async () => { - let aliceCalls = 0; - let aliceData = null; - const aliceHandler = async (payload: Perspective) => { - aliceCalls += 1; - //@ts-ignore - aliceData = payload; - }; - aliceNH!.addSignalHandler(aliceHandler) - - let bobCalls = 0; - let bobData = null; - const bobHandler = async (payload: Perspective) => { - bobCalls += 1; - //@ts-ignore - bobData = payload; - }; - bobNH!.addSignalHandler(bobHandler) - - let link = new LinkExpression() - link.author = aliceDID; - link.timestamp = new Date().toISOString(); - link.data = new Link({source: "alice", target: "bob", predicate: "signal"}); - link.proof = new ExpressionProof("sig", "key"); - const aliceSignal = new Perspective([link]) - - await aliceNH!.sendSignal(bobDID!, aliceSignal) + // }) + + // it('they can send signals via `sendSignal` and receive callbacks via `addSignalHandler`', async () => { + // let aliceCalls = 0; + // let aliceData = null; + // const aliceHandler = async (payload: Perspective) => { + // aliceCalls += 1; + // //@ts-ignore + // aliceData = payload; + // }; + // aliceNH!.addSignalHandler(aliceHandler) + + // let bobCalls = 0; + // let bobData = null; + // const bobHandler = async (payload: Perspective) => { + // bobCalls += 1; + // //@ts-ignore + // bobData = payload; + // }; + // bobNH!.addSignalHandler(bobHandler) + + // let link = new LinkExpression() + // link.author = aliceDID; + // link.timestamp = new Date().toISOString(); + // link.data = new Link({source: "alice", target: "bob", predicate: "signal"}); + // link.proof = new ExpressionProof("sig", "key"); + // const aliceSignal = new Perspective([link]) + + // await aliceNH!.sendSignal(bobDID!, aliceSignal) - await sleep(1000) + // await sleep(1000) - expect(bobCalls).to.be.equal(1) - expect(aliceCalls).to.be.equal(0) + // expect(bobCalls).to.be.equal(1) + // expect(aliceCalls).to.be.equal(0) - link.proof.invalid = true; - link.proof.valid = false; - //@ts-ignore - expect(bobData.data.links).to.deep.equal(aliceSignal.links) + // link.proof.invalid = true; + // link.proof.valid = false; + // //@ts-ignore + // expect(bobData.data.links).to.deep.equal(aliceSignal.links) - let link2 = new Link({source: "bob", target: "alice", predicate: "signal"}); - const bobSignal = new PerspectiveUnsignedInput([link2]) + // let link2 = new Link({source: "bob", target: "alice", predicate: "signal"}); + // const bobSignal = new PerspectiveUnsignedInput([link2]) - await bobNH!.sendBroadcastU(bobSignal) + // await bobNH!.sendBroadcastU(bobSignal) - await sleep(1000) + // await sleep(1000) - expect(aliceCalls).to.be.equal(1) + // expect(aliceCalls).to.be.equal(1) - //@ts-ignore - expect(aliceData.data.links[0].data).to.deep.equal(link2) - }) - }) + // //@ts-ignore + // expect(aliceData.data.links[0].data).to.deep.equal(link2) + // }) + // }) }) } } diff --git a/turbo.json b/turbo.json index fca6589cc..cecfca8ab 100644 --- a/turbo.json +++ b/turbo.json @@ -14,7 +14,7 @@ "@perspect3vism/direct-message-language#build", "@perspect3vism/perspective-language#build", "@perspect3vism/language-language#build", "@perspect3vism/neighbourhood-language#build", "@perspect3vism/file-storage#build", "@perspect3vism/perspective-diff-sync-socket-signaling#build", - "@perspect3vism/centralized-perspective-diff-sync-socket-signaling#build"], + "@perspect3vism/centralized-perspective-diff-sync#build"], "outputs": ["dist/**", "lib/**", "build/**"] }, From ae5e4df9ce17e7a93cb3977f9d1a58555a3ac11e Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 16:02:51 +0100 Subject: [PATCH 48/87] fix bug in test setup --- tests/js/scripts/get-builtin-test-langs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/js/scripts/get-builtin-test-langs.js b/tests/js/scripts/get-builtin-test-langs.js index 5b0287946..54587a3d2 100644 --- a/tests/js/scripts/get-builtin-test-langs.js +++ b/tests/js/scripts/get-builtin-test-langs.js @@ -15,7 +15,7 @@ const languages = { bundle: "https://github.com/perspect3vism/local-neighbourhood-persistence/releases/download/0.0.6/bundle.js", }, "perspective-diff-sync": { - bundle: "../../bootstrap-languages/centralized-p-diff-sync-socket-signaling/build/bundle.js", + bundle: "../../bootstrap-languages/centralized-p-diff-sync/build/bundle.js", }, "direct-message-language": { bundle: "../../bootstrap-languages/direct-message-language/build/bundle.js" From fde5b511a81a0bf62fe7cf01ad1e9d74ba68f8b5 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 16:35:11 +0100 Subject: [PATCH 49/87] enable disabled tests again --- tests/js/tests/integration.test.ts | 12 +- tests/js/tests/language.ts | 2 +- tests/js/tests/neighbourhood.ts | 300 ++++++++++++++--------------- 3 files changed, 157 insertions(+), 157 deletions(-) diff --git a/tests/js/tests/integration.test.ts b/tests/js/tests/integration.test.ts index 541574ec2..99d526136 100644 --- a/tests/js/tests/integration.test.ts +++ b/tests/js/tests/integration.test.ts @@ -128,10 +128,10 @@ describe("Integration tests", function () { }) describe('Agent / Agent-Setup', agentTests(testContext)) - // describe('Runtime', runtimeTests(testContext)) - // describe('Expression', expressionTests(testContext)) - // describe('Perspective', perspectiveTests(testContext)) - // describe('Social DNA', socialDNATests(testContext)) + describe('Runtime', runtimeTests(testContext)) + describe('Expression', expressionTests(testContext)) + describe('Perspective', perspectiveTests(testContext)) + describe('Social DNA', socialDNATests(testContext)) describe('with Alice and Bob', () => { let bobExecutorProcess: ChildProcess | null = null @@ -171,8 +171,8 @@ describe("Integration tests", function () { } }) - // describe('Agent Language', agentLanguageTests(testContext)) - // describe('Direct Messages', directMessageTests(testContext)) + describe('Agent Language', agentLanguageTests(testContext)) + describe('Direct Messages', directMessageTests(testContext)) describe('Language', languageTests(testContext)) describe('Neighbourhood', neighbourhoodTests(testContext)) }) diff --git a/tests/js/tests/language.ts b/tests/js/tests/language.ts index 8340873d4..85f4dcfc8 100644 --- a/tests/js/tests/language.ts +++ b/tests/js/tests/language.ts @@ -18,7 +18,7 @@ export default function languageTests(testContext: TestContext) { let sourceLanguage: LanguageRef = new LanguageRef() let nonHCSourceLanguage: LanguageRef = new LanguageRef() let sourceLanguageMeta: LanguageMetaInput = new LanguageMetaInput("Newly published perspective-diff-sync", "..here for you template"); - sourceLanguageMeta.possibleTemplateParams = ["id", "description", "name"]; + sourceLanguageMeta.possibleTemplateParams = ["uid", "description", "name"]; before(async () => { ad4mClient = testContext.ad4mClient; diff --git a/tests/js/tests/neighbourhood.ts b/tests/js/tests/neighbourhood.ts index 3cd8be6f9..0cb7d90c6 100644 --- a/tests/js/tests/neighbourhood.ts +++ b/tests/js/tests/neighbourhood.ts @@ -97,49 +97,49 @@ export default function neighbourhoodTests(testContext: TestContext) { expect(bobLinks.length).to.be.equal(1) }) - // it('local link created by Alice NOT received by Bob', async () => { - // const alice = testContext.alice - // const bob = testContext.bob + it('local link created by Alice NOT received by Bob', async () => { + const alice = testContext.alice + const bob = testContext.bob - // aliceP1 = await alice.perspective.add("friends") - // const socialContext = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood with Bob test local links"})); - // const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, socialContext.address, new Perspective()) - // console.log("neighbourhoodUrl", neighbourhoodUrl); - // bobP1 = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); + aliceP1 = await alice.perspective.add("friends") + const socialContext = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood with Bob test local links"})); + const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, socialContext.address, new Perspective()) + console.log("neighbourhoodUrl", neighbourhoodUrl); + bobP1 = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); - // await testContext.makeAllNodesKnown() + await testContext.makeAllNodesKnown() - // await sleep(1000) + await sleep(1000) - // await alice.perspective.addLink(aliceP1.uuid, {source: 'root', target: 'test://test'}, 'local') + await alice.perspective.addLink(aliceP1.uuid, {source: 'root', target: 'test://test'}, 'local') - // await sleep(1000) + await sleep(1000) - // let bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) - // let tries = 1 + let bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) + let tries = 1 - // while(bobLinks.length < 1 && tries < 5) { - // console.log("Bob retrying getting NOT received links..."); - // await sleep(1000) - // bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) - // tries++ - // } + while(bobLinks.length < 1 && tries < 5) { + console.log("Bob retrying getting NOT received links..."); + await sleep(1000) + bobLinks = await bob.perspective.queryLinks(bobP1!.uuid, new LinkQuery({source: 'root'})) + tries++ + } - // expect(bobLinks.length).to.be.equal(0) - // }) + expect(bobLinks.length).to.be.equal(0) + }) - // it('can delete neighbourhood', async () => { - // const alice = testContext.alice; - // const bob = testContext.bob; + it('can delete neighbourhood', async () => { + const alice = testContext.alice; + const bob = testContext.bob; - // const deleteNeighbourhood = await alice.perspective.remove(aliceP1!.uuid); - // expect(deleteNeighbourhood.perspectiveRemove).to.be.true; + const deleteNeighbourhood = await alice.perspective.remove(aliceP1!.uuid); + expect(deleteNeighbourhood.perspectiveRemove).to.be.true; - // const bobDeleteNeighbourhood = await bob.perspective.remove(bobP1!.uuid); - // expect(bobDeleteNeighbourhood.perspectiveRemove).to.be.true; + const bobDeleteNeighbourhood = await bob.perspective.remove(bobP1!.uuid); + expect(bobDeleteNeighbourhood.perspectiveRemove).to.be.true; - // const perspectives = await alice.perspective.all(); - // }) + const perspectives = await alice.perspective.all(); + }) // it('can get the correct state change signals', async () => { // const aliceP1 = await testContext.alice.perspective.add("state-changes") @@ -200,137 +200,137 @@ export default function neighbourhoodTests(testContext: TestContext) { // expect(bobSyncChangeData).to.be.equal(PerspectiveState.Synced); // }) - // describe('with set up and joined NH for Telepresence', async () => { - // let aliceNH: NeighbourhoodProxy|undefined - // let bobNH: NeighbourhoodProxy|undefined - // let aliceDID: string|undefined - // let bobDID: string|undefined - - // before(async () => { - // const alice = testContext.alice - // const bob = testContext.bob - - // const aliceP1 = await alice.perspective.add("telepresence") - // const linkLang = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood for Telepresence"})); - // const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, linkLang.address, new Perspective()) - // await sleep(5000) - // const bobP1Handle = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); - // const bobP1 = await bob.perspective.byUUID(bobP1Handle.uuid) - // await testContext.makeAllNodesKnown() + describe('with set up and joined NH for Telepresence', async () => { + let aliceNH: NeighbourhoodProxy|undefined + let bobNH: NeighbourhoodProxy|undefined + let aliceDID: string|undefined + let bobDID: string|undefined + + before(async () => { + const alice = testContext.alice + const bob = testContext.bob + + const aliceP1 = await alice.perspective.add("telepresence") + const linkLang = await alice.languages.applyTemplateAndPublish(DIFF_SYNC_OFFICIAL, JSON.stringify({uid: uuidv4(), name: "Alice's neighbourhood for Telepresence"})); + const neighbourhoodUrl = await alice.neighbourhood.publishFromPerspective(aliceP1.uuid, linkLang.address, new Perspective()) + await sleep(5000) + const bobP1Handle = await bob.neighbourhood.joinFromUrl(neighbourhoodUrl); + const bobP1 = await bob.perspective.byUUID(bobP1Handle.uuid) + await testContext.makeAllNodesKnown() - // aliceNH = aliceP1.getNeighbourhoodProxy() - // bobNH = bobP1!.getNeighbourhoodProxy() - // aliceDID = (await alice.agent.me()).did - // bobDID = (await bob.agent.me()).did - // await sleep(5000) - // }) - - // it('they see each other in `otherAgents`', async () => { - // await sleep(10000); - // const aliceAgents = await aliceNH!.otherAgents() - // console.log("alice agents", aliceAgents); - // const bobAgents = await bobNH!.otherAgents() - // console.log("bob agents", bobAgents); - // expect(aliceAgents.length).to.be.equal(1) - // expect(aliceAgents[0]).to.be.equal(bobDID) - // expect(bobAgents.length).to.be.equal(1) - // expect(bobAgents[0]).to.be.equal(aliceDID) - // }) - - // it('they can set their online status and see each others online status in `onlineAgents`', async () => { - // let link = new LinkExpression() - // link.author = "did:test"; - // link.timestamp = new Date().toISOString(); - // link.data = new Link({source: "src", target: "target", predicate: "pred"}); - // link.proof = new ExpressionProof("sig", "key"); - // link.proof.invalid = true; - // link.proof.valid = false; - // const testPerspective = new Perspective([link]) - // await aliceNH!.setOnlineStatus(testPerspective) - // await bobNH!.setOnlineStatus(testPerspective) - - // const aliceOnline = await aliceNH!.onlineAgents() - // const bobOnline = await bobNH!.onlineAgents() - // expect(aliceOnline.length).to.be.equal(1) - // expect(aliceOnline[0].did).to.be.equal(bobDID) - // console.log(aliceOnline[0].status); - // expect(aliceOnline[0].status.data.links).to.deep.equal(testPerspective.links) + aliceNH = aliceP1.getNeighbourhoodProxy() + bobNH = bobP1!.getNeighbourhoodProxy() + aliceDID = (await alice.agent.me()).did + bobDID = (await bob.agent.me()).did + await sleep(5000) + }) + + it('they see each other in `otherAgents`', async () => { + await sleep(10000); + const aliceAgents = await aliceNH!.otherAgents() + console.log("alice agents", aliceAgents); + const bobAgents = await bobNH!.otherAgents() + console.log("bob agents", bobAgents); + expect(aliceAgents.length).to.be.equal(1) + expect(aliceAgents[0]).to.be.equal(bobDID) + expect(bobAgents.length).to.be.equal(1) + expect(bobAgents[0]).to.be.equal(aliceDID) + }) + + it('they can set their online status and see each others online status in `onlineAgents`', async () => { + let link = new LinkExpression() + link.author = "did:test"; + link.timestamp = new Date().toISOString(); + link.data = new Link({source: "src", target: "target", predicate: "pred"}); + link.proof = new ExpressionProof("sig", "key"); + link.proof.invalid = true; + link.proof.valid = false; + const testPerspective = new Perspective([link]) + await aliceNH!.setOnlineStatus(testPerspective) + await bobNH!.setOnlineStatus(testPerspective) + + const aliceOnline = await aliceNH!.onlineAgents() + const bobOnline = await bobNH!.onlineAgents() + expect(aliceOnline.length).to.be.equal(1) + expect(aliceOnline[0].did).to.be.equal(bobDID) + console.log(aliceOnline[0].status); + expect(aliceOnline[0].status.data.links).to.deep.equal(testPerspective.links) - // expect(bobOnline.length).to.be.equal(1) - // expect(bobOnline[0].did).to.be.equal(aliceDID) - // expect(bobOnline[0].status.data.links).to.deep.equal(testPerspective.links) - - - // await aliceNH!.setOnlineStatusU(PerspectiveUnsignedInput.fromLink(new Link({ - // source: "test://source", - // target: "test://target" - // }))) - - // const bobOnline2 = await bobNH!.onlineAgents() - - // expect(bobOnline2.length).to.be.equal(1) - // expect(bobOnline2[0].did).to.be.equal(aliceDID) - // expect(bobOnline2[0].status.data.links[0].data.source).to.equal("test://source") - // expect(bobOnline2[0].status.data.links[0].data.target).to.equal("test://target") - // expect(bobOnline2[0].status.data.links[0].proof.valid).to.be.true - // // TODO: Signature check for the whole perspective is broken - // // Got to fix that and add back this assertion - // //expect(bobOnline2[0].status.proof.valid).to.be.true + expect(bobOnline.length).to.be.equal(1) + expect(bobOnline[0].did).to.be.equal(aliceDID) + expect(bobOnline[0].status.data.links).to.deep.equal(testPerspective.links) + + + await aliceNH!.setOnlineStatusU(PerspectiveUnsignedInput.fromLink(new Link({ + source: "test://source", + target: "test://target" + }))) + + const bobOnline2 = await bobNH!.onlineAgents() + + expect(bobOnline2.length).to.be.equal(1) + expect(bobOnline2[0].did).to.be.equal(aliceDID) + expect(bobOnline2[0].status.data.links[0].data.source).to.equal("test://source") + expect(bobOnline2[0].status.data.links[0].data.target).to.equal("test://target") + expect(bobOnline2[0].status.data.links[0].proof.valid).to.be.true + // TODO: Signature check for the whole perspective is broken + // Got to fix that and add back this assertion + //expect(bobOnline2[0].status.proof.valid).to.be.true - // }) - - // it('they can send signals via `sendSignal` and receive callbacks via `addSignalHandler`', async () => { - // let aliceCalls = 0; - // let aliceData = null; - // const aliceHandler = async (payload: Perspective) => { - // aliceCalls += 1; - // //@ts-ignore - // aliceData = payload; - // }; - // aliceNH!.addSignalHandler(aliceHandler) - - // let bobCalls = 0; - // let bobData = null; - // const bobHandler = async (payload: Perspective) => { - // bobCalls += 1; - // //@ts-ignore - // bobData = payload; - // }; - // bobNH!.addSignalHandler(bobHandler) - - // let link = new LinkExpression() - // link.author = aliceDID; - // link.timestamp = new Date().toISOString(); - // link.data = new Link({source: "alice", target: "bob", predicate: "signal"}); - // link.proof = new ExpressionProof("sig", "key"); - // const aliceSignal = new Perspective([link]) - - // await aliceNH!.sendSignal(bobDID!, aliceSignal) + }) + + it('they can send signals via `sendSignal` and receive callbacks via `addSignalHandler`', async () => { + let aliceCalls = 0; + let aliceData = null; + const aliceHandler = async (payload: Perspective) => { + aliceCalls += 1; + //@ts-ignore + aliceData = payload; + }; + aliceNH!.addSignalHandler(aliceHandler) + + let bobCalls = 0; + let bobData = null; + const bobHandler = async (payload: Perspective) => { + bobCalls += 1; + //@ts-ignore + bobData = payload; + }; + bobNH!.addSignalHandler(bobHandler) + + let link = new LinkExpression() + link.author = aliceDID; + link.timestamp = new Date().toISOString(); + link.data = new Link({source: "alice", target: "bob", predicate: "signal"}); + link.proof = new ExpressionProof("sig", "key"); + const aliceSignal = new Perspective([link]) + + await aliceNH!.sendSignal(bobDID!, aliceSignal) - // await sleep(1000) + await sleep(1000) - // expect(bobCalls).to.be.equal(1) - // expect(aliceCalls).to.be.equal(0) + expect(bobCalls).to.be.equal(1) + expect(aliceCalls).to.be.equal(0) - // link.proof.invalid = true; - // link.proof.valid = false; - // //@ts-ignore - // expect(bobData.data.links).to.deep.equal(aliceSignal.links) + link.proof.invalid = true; + link.proof.valid = false; + //@ts-ignore + expect(bobData.data.links).to.deep.equal(aliceSignal.links) - // let link2 = new Link({source: "bob", target: "alice", predicate: "signal"}); - // const bobSignal = new PerspectiveUnsignedInput([link2]) + let link2 = new Link({source: "bob", target: "alice", predicate: "signal"}); + const bobSignal = new PerspectiveUnsignedInput([link2]) - // await bobNH!.sendBroadcastU(bobSignal) + await bobNH!.sendBroadcastU(bobSignal) - // await sleep(1000) + await sleep(1000) - // expect(aliceCalls).to.be.equal(1) + expect(aliceCalls).to.be.equal(1) - // //@ts-ignore - // expect(aliceData.data.links[0].data).to.deep.equal(link2) - // }) - // }) + //@ts-ignore + expect(aliceData.data.links[0].data).to.deep.equal(link2) + }) + }) }) } } From 48e2edbc5d8e5c51279deeec8f1f5a638d29d194 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 12 Oct 2023 17:05:01 +0100 Subject: [PATCH 50/87] add console.dir() method to rust-executor utils --- executor/src/deno.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/executor/src/deno.ts b/executor/src/deno.ts index f4c4dc20b..289696aea 100644 --- a/executor/src/deno.ts +++ b/executor/src/deno.ts @@ -26,6 +26,10 @@ console.debug = (...args) => { UTILS.consoleDebug(`${args.reduce((acc, cur) => acc += `${cur} `, "")}`) }; +console.dir = (...args) => { + UTILS.consoleDebug(`${args.reduce((acc, cur) => acc += `${JSON.stringify(cur)} `, "")}`) +}; + console.error = (...args) => { UTILS.consoleError(`${args.reduce((acc, cur) => acc += `${cur} `, "")}`) }; From 6053a603a1aa9f5ea459298c8b59930e7997ca1f Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Fri, 13 Oct 2023 16:31:53 +0530 Subject: [PATCH 51/87] Fixed the issue with circular json --- executor/src/core/LanguageController.ts | 43 ++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/executor/src/core/LanguageController.ts b/executor/src/core/LanguageController.ts index 06d61e7c8..f32677215 100644 --- a/executor/src/core/LanguageController.ts +++ b/executor/src/core/LanguageController.ts @@ -19,6 +19,26 @@ import { Ad4mDb } from './db'; import stringify from 'json-stable-stringify' import { getPubSub } from './utils'; +function cloneWithoutCircularReferences(obj: any, seen: WeakSet = new WeakSet()): any { + if (typeof obj === 'object' && obj !== null) { + if (seen.has(obj)) { + return; + } + seen.add(obj); + + const clonedObj: any = Array.isArray(obj) ? [] : {}; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + clonedObj[key] = cloneWithoutCircularReferences(obj[key], seen); + } + } + + return clonedObj; + } + + return obj; +} + type LinkObservers = (diff: PerspectiveDiff, lang: LanguageRef)=>void; type TelepresenceSignalObserver = (signal: PerspectiveExpression, lang: LanguageRef)=>void; type SyncStateChangeObserver = (state: PerspectiveState, lang: LanguageRef)=>void; @@ -452,9 +472,11 @@ export default class LanguageController { //Remove language from memory this.#languages.delete(hash as string); this.#languageConstructors.delete(hash as string); - - await this.#holochainService.removeDnaForLang(hash as string); - + try { + await this.#holochainService.removeDnaForLang(hash as string); + } catch(e) { + console.log("No DNA found for language installed"); + } //Remove language files const languagePath = path.join(this.#config.languagesPath, hash as string); fs.rmdirSync(languagePath, {recursive: true}); @@ -503,7 +525,13 @@ export default class LanguageController { if (languageHash == languageMetaData.address) { //TODO: in here we are getting the source again even though we have already done that before, implement installLocalLanguage()? const lang = await this.installLanguage(address, languageMeta) - return lang! + + let newLang = { + ...lang, + linksAdapter: cloneWithoutCircularReferences(lang).linksAdapter + }; + // @ts-ignore + return newLang } else { throw new Error("Calculated languageHash did not match address found in meta information") } @@ -550,7 +578,12 @@ export default class LanguageController { if (sourceLanguageTemplated.meta.address === languageHash) { //TODO: in here we are getting the source again even though we have already done that before, implement installLocalLanguage()? const lang = await this.installLanguage(address, languageMeta) - return lang! + let newLang = { + ...lang, + linksAdapter: cloneWithoutCircularReferences(lang).linksAdapter + }; + // @ts-ignore + return newLang! } else { throw new Error(`Templating of original source language did not result in the same language hash of un-trusted language trying to be installed... aborting language install. Expected hash: ${languageHash}. But got: ${sourceLanguageTemplated.meta.address}`) } From 3270cedf5d821338da547f06730ea9ec628503b5 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Fri, 13 Oct 2023 16:32:04 +0530 Subject: [PATCH 52/87] use https for secure connection --- bootstrap-languages/centralized-p-diff-sync/util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap-languages/centralized-p-diff-sync/util.ts b/bootstrap-languages/centralized-p-diff-sync/util.ts index 07cc7f2ce..bb97c9b6d 100644 --- a/bootstrap-languages/centralized-p-diff-sync/util.ts +++ b/bootstrap-languages/centralized-p-diff-sync/util.ts @@ -1,4 +1,4 @@ -import http from 'https://deno.land/std@0.177.0/node/http.ts'; +import http from 'https://deno.land/std@0.177.0/node/https.ts'; export default function makeHttpRequest(url, method, queryParams, requestBody) { return new Promise((resolve, reject) => { From f19ff39fc829affb3389d0b19601c646e65f595f Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 13 Oct 2023 15:44:29 +0100 Subject: [PATCH 53/87] dont every reject a promise in link language try/catches --- executor/src/core/Perspective.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/executor/src/core/Perspective.ts b/executor/src/core/Perspective.ts index a0878dfb4..67f4d69e5 100644 --- a/executor/src/core/Perspective.ts +++ b/executor/src/core/Perspective.ts @@ -253,7 +253,7 @@ export default class Perspective { } } catch(e) { console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter render: ${e}`) - reject(e) + resolve(new Ad4mPerspective([])) } }) } @@ -288,7 +288,10 @@ export default class Perspective { } } catch(e) { console.error(`NH [${this.sharedUrl}; (${functionName})] (${this.name}): Error while trying to call links adapter general:`, e) - reject(e) + resolve({ + additions: [], + removals: [] + } as PerspectiveDiff) } }) } @@ -329,7 +332,7 @@ export default class Perspective { } } catch(e) { console.error(`NH [${this.sharedUrl}] (${this.name}): Error while trying to call links adapter current revision: ${e}`) - reject(e) + resolve(null) } }) } From 9f687e89bf910b7d023f30c7bd7c077c81f0a5f9 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 13 Oct 2023 17:16:41 +0100 Subject: [PATCH 54/87] use axiod instead of custom http function --- .../centralized-p-diff-sync/linksAdapter.ts | 19 +++++---- .../telepresenceAdapter.ts | 6 +-- .../centralized-p-diff-sync/util.ts | 41 ------------------- 3 files changed, 14 insertions(+), 52 deletions(-) delete mode 100644 bootstrap-languages/centralized-p-diff-sync/util.ts diff --git a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts index 9bfc3c9ec..8b5236f76 100644 --- a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts @@ -3,7 +3,7 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; import { io, Socket, ServerToClientEvents, ClientToServerEvents } from "https://esm.sh/socket.io-client@4.7.2"; -import makeHttpRequest from "./util.ts"; +import axiod from "https://deno.land/x/axiod/mod.ts"; export class LinkAdapter implements LinkSyncAdapter { linkCallback?: PerspectiveDiffObserver @@ -113,20 +113,22 @@ export class LinkAdapter implements LinkSyncAdapter { async others(): Promise { // @ts-ignore - return await makeHttpRequest("https://socket.ad4m.dev/getOthers", "GET", {}, { - linkLanguageUUID: this.languageUid - }) + // return await axiod.get("https://socket.ad4m.dev/getOthers", "GET", {}, { + // linkLanguageUUID: this.languageUid + // }) + return []; } async currentRevision(): Promise { console.log("Getting current revision"); let result; try { - //@ts-ignore - result = await makeHttpRequest("https://socket.ad4m.dev/currentRevision", "POST", {}, { + result = await axiod.post("https://socket.ad4m.dev/currentRevision", { linkLanguageUUID: this.languageUid, did: this.me }) + console.log("Current revision returned with result"); + console.dir(result); } catch (e) { console.log("Error in currentRevision call", e); result = null; @@ -279,10 +281,11 @@ export class LinkAdapter implements LinkSyncAdapter { const others = await this.others(); if (others.filter((other) => other === this.me).length == 0) { - const result = await makeHttpRequest("https://socket.ad4m.dev/addAgent", "POST", {}, { + const result = await axiod.post("https://socket.ad4m.dev/addAgent", { linkLanguageUUID: this.languageUid, did: this.me - }) + }); + console.log("Added agent record with result", result); } } } diff --git a/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts index 9815feb40..b3219890b 100644 --- a/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts @@ -1,5 +1,5 @@ import type { TelepresenceAdapter, OnlineAgent, PerspectiveExpression, DID, TelepresenceSignalCallback, HolochainLanguageDelegate, LanguageContext } from "https://esm.sh/@perspect3vism/ad4m@0.5.0";; -import makeHttpRequest from "./util.ts"; +import axiod from "https://deno.land/x/axiod/mod.ts"; export class TelepresenceAdapterImplementation implements TelepresenceAdapter { me: DID @@ -14,7 +14,7 @@ export class TelepresenceAdapterImplementation implements TelepresenceAdapter { } async setOnlineStatus(status: PerspectiveExpression): Promise { - await makeHttpRequest("https://socket.ad4m.dev/setStatus", "POST", {}, { + await axiod.post("https://socket.ad4m.dev/setStatus", { did: this.me, link: status, LinkLanguageUUID: this.uuid @@ -22,7 +22,7 @@ export class TelepresenceAdapterImplementation implements TelepresenceAdapter { } async getOnlineAgents(): Promise { - const result = await makeHttpRequest("https://socket.ad4m.dev/getOnlineAgents", "GET", {}, { + const result = await axiod.post("https://socket.ad4m.dev/getOnlineAgents", { did: this.me, LinkLanguageUUID: this.uuid }) diff --git a/bootstrap-languages/centralized-p-diff-sync/util.ts b/bootstrap-languages/centralized-p-diff-sync/util.ts deleted file mode 100644 index bb97c9b6d..000000000 --- a/bootstrap-languages/centralized-p-diff-sync/util.ts +++ /dev/null @@ -1,41 +0,0 @@ -import http from 'https://deno.land/std@0.177.0/node/https.ts'; - -export default function makeHttpRequest(url, method, queryParams, requestBody) { - return new Promise((resolve, reject) => { - const urlWithParams = new URL(url); - urlWithParams.search = new URLSearchParams(queryParams).toString(); - - const options = { - method: method.toUpperCase(), - headers: { - 'Content-Type': 'application/json', - }, - }; - - if (requestBody) { - options.headers['Content-Length'] = Buffer.from(JSON.stringify(requestBody)).length; - } - - const req = http.request(urlWithParams, options, (res) => { - let data = ''; - res.on('data', (chunk) => { - data += chunk; - }); - - res.on('end', () => { - resolve(data); - }); - }); - - req.on('error', (error) => { - reject(error); - }); - - if (requestBody) { - req.write(JSON.stringify(requestBody)); - } - - req.end(); - }); -} - From d20d95ea170f8238e927835d297b29f5b3695945 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 13 Oct 2023 17:45:51 +0100 Subject: [PATCH 55/87] fix up parsing of result from getting current revision --- .../centralized-p-diff-sync/linksAdapter.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts index 8b5236f76..8b69ef983 100644 --- a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts @@ -127,8 +127,14 @@ export class LinkAdapter implements LinkSyncAdapter { linkLanguageUUID: this.languageUid, did: this.me }) + if (result.status === 200) { + result = result.data; + } else { + console.error("Error in currentRevision call"); + console.error("Got status", result.status); + result = null; + } console.log("Current revision returned with result"); - console.dir(result); } catch (e) { console.log("Error in currentRevision call", e); result = null; @@ -285,7 +291,8 @@ export class LinkAdapter implements LinkSyncAdapter { linkLanguageUUID: this.languageUid, did: this.me }); - console.log("Added agent record with result", result); + console.log("Added agent record with result"); + console.dir(result.data); } } } From 54dad75cbdeafb969284802b0ace41a024fdac5c Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Sat, 14 Oct 2023 15:17:34 +0100 Subject: [PATCH 56/87] add the telepresence implementation to the centralized link language --- .../centralized-p-diff-sync/index.ts | 12 +- .../centralized-p-diff-sync/linksAdapter.ts | 130 +++++++++--------- .../telepresenceAdapter.ts | 71 ++++++++-- 3 files changed, 129 insertions(+), 84 deletions(-) diff --git a/bootstrap-languages/centralized-p-diff-sync/index.ts b/bootstrap-languages/centralized-p-diff-sync/index.ts index da6352a41..387afafd5 100644 --- a/bootstrap-languages/centralized-p-diff-sync/index.ts +++ b/bootstrap-languages/centralized-p-diff-sync/index.ts @@ -1,6 +1,7 @@ import type { Address, Language, Interaction, HolochainLanguageDelegate, LanguageContext, AgentService } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { LinkAdapter } from "./linksAdapter.ts"; import { TelepresenceAdapterImplementation } from "./telepresenceAdapter.ts"; +import { io } from "https://esm.sh/socket.io-client@4.7.2"; function interactions(expression: Address): Interaction[] { return []; @@ -13,8 +14,15 @@ const name = "centralized-perspective-diff-sync"; const uid = "centralized-perspective-diff-sync-uuid"; export default async function create(context: LanguageContext): Promise { - const linksAdapter = new LinkAdapter(context, uid); - const telepresenceAdapter = new TelepresenceAdapterImplementation(context, uid); + let socketClient = io("https://socket.ad4m.dev", { + transports: ['websocket', 'polling'], + autoConnect: true, + query: { did: context.agent.did, linkLanguageUUID: uid } + }); + console.log("Created socket connection"); + + const linksAdapter = new LinkAdapter(context, uid, socketClient); + const telepresenceAdapter = new TelepresenceAdapterImplementation(context, uid, socketClient); //@ts-ignore return { diff --git a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts index 8b69ef983..8d448ace5 100644 --- a/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync/linksAdapter.ts @@ -2,7 +2,7 @@ import { LinkSyncAdapter, PerspectiveDiffObserver, HolochainLanguageDelegate, La LinkExpression, DID, Perspective, PerspectiveState } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import type { SyncStateChangeObserver } from "https://esm.sh/@perspect3vism/ad4m@0.5.0"; import { Mutex, withTimeout } from "https://esm.sh/async-mutex@0.4.0"; -import { io, Socket, ServerToClientEvents, ClientToServerEvents } from "https://esm.sh/socket.io-client@4.7.2"; +import type { Socket, ServerToClientEvents, ClientToServerEvents } from "https://esm.sh/socket.io-client@4.7.2"; import axiod from "https://deno.land/x/axiod/mod.ts"; export class LinkAdapter implements LinkSyncAdapter { @@ -15,14 +15,10 @@ export class LinkAdapter implements LinkSyncAdapter { socketClient: Socket; hasCalledSync = false; - constructor(context: LanguageContext, uid: String) { + constructor(context: LanguageContext, uid: String, socketClient: Socket) { this.me = context.agent.did; this.languageUid = uid; - - //this.addAgentRecord(); - - this.socketClient = io("https://socket.ad4m.dev", { transports: ['websocket', 'polling'], autoConnect: true }); - console.log("Created socket connection"); + this.socketClient = socketClient; this.socketClient.on('error', (error: any) => { console.error('Error:', error); @@ -46,17 +42,17 @@ export class LinkAdapter implements LinkSyncAdapter { //const release = await this.generalMutex.acquire(); try { - console.log("Got some live signal from the server"); - console.dir(signal); - console.log(this.me); + // console.log("Got some live signal from the server"); + // console.dir(signal); + // console.log(this.me); - if (this.myCurrentTime) { - console.log("With current time", this.myCurrentTime); - } + // if (this.myCurrentTime) { + // console.log("With current time", this.myCurrentTime); + // } let serverRecordTimestamp = signal.serverRecordTimestamp; if (!this.myCurrentTime|| this.myCurrentTime < serverRecordTimestamp) { - console.log("Returning that live signal to executor"); + //console.log("Returning that live signal to executor"); this.myCurrentTime = serverRecordTimestamp; this.updateServerSyncState(); @@ -97,8 +93,8 @@ export class LinkAdapter implements LinkSyncAdapter { if (err) { console.error("Error in update-sync-state call", err); }; - console.log("Got some result from update-sync-state"); - console.dir(signal); + // console.log("Got some result from update-sync-state"); + // console.dir(signal); }) } } @@ -112,15 +108,26 @@ export class LinkAdapter implements LinkSyncAdapter { } async others(): Promise { - // @ts-ignore - // return await axiod.get("https://socket.ad4m.dev/getOthers", "GET", {}, { - // linkLanguageUUID: this.languageUid - // }) - return []; + const others = await axiod.get("https://socket.ad4m.dev/getOthers", { + params: { + linkLanguageUUID: this.languageUid + } + }); + if (others.status === 200) { + //Remove myself from others if it exists + const othersIndex = others.data.indexOf(this.me); + if (othersIndex > -1) { + others.data.splice(othersIndex, 1); + } + return others.data; + } else { + console.error("Error fetching others in linkAdapter, got status", others.status); + return []; + } } async currentRevision(): Promise { - console.log("Getting current revision"); + //console.log("Getting current revision"); let result; try { result = await axiod.post("https://socket.ad4m.dev/currentRevision", { @@ -157,7 +164,7 @@ export class LinkAdapter implements LinkSyncAdapter { //Call sync on the server, which will should fetch all the links we missed since last start of the link language async sync(): Promise { - console.log("Sync call has called sync", this.hasCalledSync); + //console.log("Sync call has called sync", this.hasCalledSync); //Only allow sync to be called once since once we have sync'd once we will get future links via signal if (!this.hasCalledSync) { //console.log("PerspectiveDiffSync.sync(); Getting lock"); @@ -174,13 +181,13 @@ export class LinkAdapter implements LinkSyncAdapter { console.error("Error in sync call", err); throw Error(err); }; - console.log("Got some result from sync"); - console.dir(signal); - console.log(this.me); + // console.log("Got some result from sync"); + // console.dir(signal); + //console.log(this.me); - if (this.myCurrentTime) { - console.log("With current time", this.myCurrentTime); - } + // if (this.myCurrentTime) { + // console.log("With current time", this.myCurrentTime); + // } this.myCurrentTime = signal.serverRecordTimestamp; this.updateServerSyncState(); @@ -221,34 +228,34 @@ export class LinkAdapter implements LinkSyncAdapter { } async commit(diff: PerspectiveDiff): Promise { - //const release = await this.generalMutex.acquire(); - try { - const preppedDiff = { - additions: diff.additions.map((item) => prepareLinkExpression(item)), - removals: diff.removals.map((item) => prepareLinkExpression(item)), - linkLanguageUUID: this.languageUid, - did: this.me, - }; - console.log("Commit sending prepped diff", preppedDiff); + //const release = await this.generalMutex.acquire(); + try { + const preppedDiff = { + additions: diff.additions.map((item) => prepareLinkExpression(item)), + removals: diff.removals.map((item) => prepareLinkExpression(item)), + linkLanguageUUID: this.languageUid, + did: this.me, + }; + //console.log("Commit sending prepped diff", preppedDiff); - const signal = await this.emitCommit(preppedDiff); + const signal = await this.emitCommit(preppedDiff); - if (signal.status === "Ok") { - console.log("Got some result from commit"); - console.dir(signal); - //Update our local timestamp to match the server - this.myCurrentTime = signal.serverRecordTimestamp; - this.updateServerSyncState(); - return ""; // Resolve the function with an empty string - } else { - throw new Error("Commit failed with non-Ok status"); - } - } catch (e) { - console.error("PerspectiveDiffSync.commit(); got error", e); - throw e; // Propagate the error up - } finally { - //release(); + if (signal.status === "Ok") { + console.log("Got some result from commit"); + console.dir(signal); + //Update our local timestamp to match the server + this.myCurrentTime = signal.serverRecordTimestamp; + this.updateServerSyncState(); + return ""; // Resolve the function with an empty string + } else { + throw new Error("Commit failed with non-Ok status"); } + } catch (e) { + console.error("PerspectiveDiffSync.commit(); got error", e); + throw e; // Propagate the error up + } finally { + //release(); + } } // Utility method to wrap the socketClient.emit in a Promise @@ -278,23 +285,10 @@ export class LinkAdapter implements LinkSyncAdapter { async handleSignal(signal: any): Promise { //This signal only contains link data and no reference, and therefore came from us in a pull in fast_forward_signal if (this.linkCallback) { - console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback", signal); + //console.log("PerspectiveDiffSync.handleHolochainSignal: calling linkCallback", signal); await this.linkCallback(signal); } } - - async addAgentRecord(): Promise { - const others = await this.others(); - - if (others.filter((other) => other === this.me).length == 0) { - const result = await axiod.post("https://socket.ad4m.dev/addAgent", { - linkLanguageUUID: this.languageUid, - did: this.me - }); - console.log("Added agent record with result"); - console.dir(result.data); - } - } } function prepareLinkExpression(link: LinkExpression): object { diff --git a/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts b/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts index b3219890b..5171d92ab 100644 --- a/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts +++ b/bootstrap-languages/centralized-p-diff-sync/telepresenceAdapter.ts @@ -1,43 +1,86 @@ import type { TelepresenceAdapter, OnlineAgent, PerspectiveExpression, DID, TelepresenceSignalCallback, HolochainLanguageDelegate, LanguageContext } from "https://esm.sh/@perspect3vism/ad4m@0.5.0";; import axiod from "https://deno.land/x/axiod/mod.ts"; +import type { Socket, ServerToClientEvents, ClientToServerEvents } from "https://esm.sh/socket.io-client@4.7.2"; export class TelepresenceAdapterImplementation implements TelepresenceAdapter { me: DID uuid: string; hcDna: HolochainLanguageDelegate; signalCallbacks: TelepresenceSignalCallback[] = []; + socketClient: Socket; - constructor(context: LanguageContext, uuid: string) { + constructor(context: LanguageContext, uuid: string, socketClient: Socket) { this.hcDna = context.Holochain as HolochainLanguageDelegate; this.me = context.agent.did; this.uuid = uuid; + this.socketClient = socketClient; + + //Add broadcast signal handler from socket to signalCallbacks + this.socketClient.on("telepresence-signal", (payload: PerspectiveExpression) => { + this.signalCallbacks.forEach(callback => { + callback(payload); + }); + }); } async setOnlineStatus(status: PerspectiveExpression): Promise { - await axiod.post("https://socket.ad4m.dev/setStatus", { + const res = await axiod.post("https://socket.ad4m.dev/setAgentStatus", { did: this.me, - link: status, - LinkLanguageUUID: this.uuid - }) + status: status, + linkLanguageUUID: this.uuid + }); + if (res.status === 200) { + console.log("setOnlineStatus: success"); + console.log(res.data); + } else { + console.log("setOnlineStatus: failed"); + console.log(res.data); + } + return null; } async getOnlineAgents(): Promise { - const result = await axiod.post("https://socket.ad4m.dev/getOnlineAgents", { - did: this.me, - LinkLanguageUUID: this.uuid - }) - - // @ts-ignore - return result + const result = await axiod.get("https://socket.ad4m.dev/getOnlineAgents", { + params: { + did: this.me, + linkLanguageUUID: this.uuid + } + }); + if (result.status === 200) { + console.log("getOnlineAgents: success"); + console.dir(result.data); + return result.data; + } else { + console.log("getOnlineAgents: failed"); + console.dir(result.data); + return []; + } } async sendSignal(remoteAgentDid: string, payload: PerspectiveExpression): Promise { - //let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_signal", {remote_agent_did: remoteAgentDid, payload}); + this.socketClient.emit("send-signal", { remoteAgentDid, linkLanguageUUID: this.uuid, payload }, (err, signal) => { + if (err) { + console.log("sendSignal: failed"); + console.dir(err); + } else { + console.log("sendSignal: success"); + console.dir(signal); + } + }); return {}; } async sendBroadcast(payload: PerspectiveExpression): Promise { - //let res = await this.hcDna.call(DNA_NICK, ZOME_NAME, "send_broadcast", payload); + this.socketClient.emit("send-broadcast", { linkLanguageUUID: this.uuid, payload }, (err, signal) => { + if (err) { + console.log("sendBroadcast: failed"); + console.dir(err); + } else { + console.log("sendBroadcast: success"); + console.dir(signal); + } + }); + return {}; } From 43e1f156d525bb8f0c95b0026b848199da88df55 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 16 Oct 2023 12:47:36 +0100 Subject: [PATCH 57/87] revert p diff sync test target to holochain only language --- tests/js/scripts/get-builtin-test-langs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/js/scripts/get-builtin-test-langs.js b/tests/js/scripts/get-builtin-test-langs.js index 54587a3d2..f1aa09a33 100644 --- a/tests/js/scripts/get-builtin-test-langs.js +++ b/tests/js/scripts/get-builtin-test-langs.js @@ -15,7 +15,7 @@ const languages = { bundle: "https://github.com/perspect3vism/local-neighbourhood-persistence/releases/download/0.0.6/bundle.js", }, "perspective-diff-sync": { - bundle: "../../bootstrap-languages/centralized-p-diff-sync/build/bundle.js", + bundle: "../../bootstrap-languages/p-diff-sync/build/bundle.js", }, "direct-message-language": { bundle: "../../bootstrap-languages/direct-message-language/build/bundle.js" From 81c92117bbb1e4e3ad5fa0ec93a69c702c764575 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 16 Oct 2023 12:48:36 +0100 Subject: [PATCH 58/87] add new mainnet seed with new link languages --- rust-executor/src/mainnet_seed.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rust-executor/src/mainnet_seed.json b/rust-executor/src/mainnet_seed.json index 67ce9cefc..704b10d9b 100644 --- a/rust-executor/src/mainnet_seed.json +++ b/rust-executor/src/mainnet_seed.json @@ -3,7 +3,9 @@ "did:key:z6MkvPpWxwXAnLtMcoc9sX7GEoJ96oNnQ3VcQJRLspNJfpE7" ], "knownLinkLanguages": [ - "QmzSYwdfZvt4WwS5TNxd8aKjz8UxSM2Bd2QvW3ReS45iLc5ujUX" + "QmzSYwdmKg9nm4HXnwDZ7orhJCu3XoQYvAX2Muv4nY5aWtJVKyc", + "QmzSYwddpeaDLxr7pPyG9jhz8bJSz2GAKP6xPVuRfthi4TPwTi4", + "QmzSYwdeC5L6ZyzwgEEVxKPm17UKwPttyXnmNHakjm3EweWq52W" ], "directMessageLanguage": "QmzSYwdp8xNu5UdWWsKQhzZs4JLYDBTk22T7ksoi3hhpscZAm3E", "agentLanguage": "QmzSYwdigpRrQTmtXcATD4zAFp1nqbXB1tVJT7ho1JaThaXCynL", From f1614a6490655abc021efd56d22893d3886fd6da Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Mon, 16 Oct 2023 19:22:37 +0530 Subject: [PATCH 59/87] Added cmake & protobuf to windows ci --- .github/workflows/publish.yml | 6 +++++- .github/workflows/publish_staging.yml | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c05d952bd..4965e4b53 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -78,10 +78,14 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - - name: install dependencies (ubuntu only) + - name: install dependencies (macos only) if: matrix.platform == 'macos-latest' run: brew install protobuf cmake + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 133fce2af..49700994b 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -70,10 +70,14 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - - name: install dependencies (ubuntu only) + - name: install dependencies (macos only) if: matrix.platform == 'macos-latest' run: brew install protobuf cmake + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV From 9ca9aa6dfaed821535a0ec1c2da3d48e6e2c14a9 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 16 Oct 2023 17:28:05 +0100 Subject: [PATCH 60/87] add new yarn.lock with ad4m-core linked directly --- yarn.lock | 398 +++++++++++++++++++++++++++--------------------------- 1 file changed, 199 insertions(+), 199 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9ece745f3..e1cd41eef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -184,25 +184,25 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.14.8", "@babel/core@^7.16.0", "@babel/core@^7.2.2", "@babel/core@^7.22.1", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.8.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" - integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.23.0" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.0" + "@babel/helpers" "^7.23.2" "@babel/parser" "^7.23.0" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" + "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" convert-source-map "^2.0.0" debug "^4.1.0" @@ -278,10 +278,10 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" - integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" @@ -346,7 +346,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": +"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== @@ -409,13 +409,13 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" + "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" "@babel/highlight@^7.22.13": @@ -457,9 +457,9 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.16.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.0.tgz#66d9014173b3267a9ced3e69935138bc64ffb5c8" - integrity sha512-kYsT+f5ARWF6AdFmqoEEp+hpqxEB8vGmRWfw2aj78M2vTwS2uHW91EF58iFm1Z9U8Y/RrLu2XKJn46P9ca1b0w== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8" + integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg== dependencies: "@babel/helper-create-class-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" @@ -674,14 +674,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" - integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== +"@babel/plugin-transform-async-generator-functions@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" + integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-to-generator@^7.22.5": @@ -700,7 +700,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoping@^7.22.15": +"@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== @@ -747,7 +747,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.22.15": +"@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== @@ -847,7 +847,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.22.5": +"@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== @@ -855,7 +855,7 @@ "@babel/helper-module-transforms" "^7.23.0" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": +"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== @@ -864,7 +864,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.22.11": +"@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== @@ -940,7 +940,7 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.22.15": +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== @@ -995,7 +995,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx-development@^7.16.7", "@babel/plugin-transform-react-jsx-development@^7.22.5": +"@babel/plugin-transform-react-jsx-development@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== @@ -1016,7 +1016,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": +"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== @@ -1051,15 +1051,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.16.4": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" - integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990" + integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.22.5": @@ -1140,11 +1140,11 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" - integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059" + integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ== dependencies: - "@babel/compat-data" "^7.22.20" + "@babel/compat-data" "^7.23.2" "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" @@ -1170,15 +1170,15 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.22.5" - "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-generator-functions" "^7.23.2" "@babel/plugin-transform-async-to-generator" "^7.22.5" "@babel/plugin-transform-block-scoped-functions" "^7.22.5" - "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-block-scoping" "^7.23.0" "@babel/plugin-transform-class-properties" "^7.22.5" "@babel/plugin-transform-class-static-block" "^7.22.11" "@babel/plugin-transform-classes" "^7.22.15" "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-destructuring" "^7.23.0" "@babel/plugin-transform-dotall-regex" "^7.22.5" "@babel/plugin-transform-duplicate-keys" "^7.22.5" "@babel/plugin-transform-dynamic-import" "^7.22.11" @@ -1190,9 +1190,9 @@ "@babel/plugin-transform-literals" "^7.22.5" "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" "@babel/plugin-transform-member-expression-literals" "^7.22.5" - "@babel/plugin-transform-modules-amd" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.15" - "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-amd" "^7.23.0" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-modules-systemjs" "^7.23.0" "@babel/plugin-transform-modules-umd" "^7.22.5" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.22.5" @@ -1201,7 +1201,7 @@ "@babel/plugin-transform-object-rest-spread" "^7.22.15" "@babel/plugin-transform-object-super" "^7.22.5" "@babel/plugin-transform-optional-catch-binding" "^7.22.11" - "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-optional-chaining" "^7.23.0" "@babel/plugin-transform-parameters" "^7.22.15" "@babel/plugin-transform-private-methods" "^7.22.5" "@babel/plugin-transform-private-property-in-object" "^7.22.11" @@ -1218,10 +1218,10 @@ "@babel/plugin-transform-unicode-regex" "^7.22.5" "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "0.1.6-no-external-plugins" - "@babel/types" "^7.22.19" - babel-plugin-polyfill-corejs2 "^0.4.5" - babel-plugin-polyfill-corejs3 "^0.8.3" - babel-plugin-polyfill-regenerator "^0.5.2" + "@babel/types" "^7.23.0" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1247,9 +1247,9 @@ "@babel/plugin-transform-react-pure-annotations" "^7.22.5" "@babel/preset-typescript@^7.16.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" - integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz#c8de488130b7081f7e1482936ad3de5b018beef4" + integrity sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA== dependencies: "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-option" "^7.22.15" @@ -1263,9 +1263,9 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.1", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== dependencies: regenerator-runtime "^0.14.0" @@ -1278,10 +1278,10 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.23.0", "@babel/traverse@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.23.0" @@ -2428,7 +2428,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2465,9 +2465,9 @@ integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz#64df34e2f12e68e78ac57e571d25ec07fa460ca9" - integrity sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz#d693d972974a354034454ec1317eb6afd0b00312" + integrity sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g== "@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": version "1.6.3" @@ -2880,18 +2880,18 @@ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@preact/preset-vite@^2.4.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@preact/preset-vite/-/preset-vite-2.5.0.tgz#6ff815558c16062a36e2d5da4b1225d7b216478d" - integrity sha512-BUhfB2xQ6ex0yPkrT1Z3LbfPzjpJecOZwQ/xJrXGFSZD84+ObyS//41RdEoQCMWsM0t7UHGaujUxUBub7WM1Jw== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@preact/preset-vite/-/preset-vite-2.6.0.tgz#2b2c54ee2196d75b7b9e0297998497d3dbe37ce0" + integrity sha512-5nztNzXbCpqyVum/K94nB2YQ5PTnvWdz4u7/X0jc8+kLyskSSpkNUxLQJeI90zfGSFIX1Ibj2G2JIS/mySHWYQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.14.9" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@prefresh/vite" "^2.2.8" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@prefresh/vite" "^2.4.1" "@rollup/pluginutils" "^4.1.1" babel-plugin-transform-hook-names "^1.0.2" - debug "^4.3.1" - kolorist "^1.2.10" - resolve "^1.20.0" + debug "^4.3.4" + kolorist "^1.8.0" + resolve "^1.22.8" "@prefresh/babel-plugin@0.5.0": version "0.5.0" @@ -2908,7 +2908,7 @@ resolved "https://registry.yarnpkg.com/@prefresh/utils/-/utils-1.2.0.tgz#cbdfe549b207041e38bb6cc382408b30cd24fec8" integrity sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ== -"@prefresh/vite@^2.2.8", "@prefresh/vite@^2.2.9": +"@prefresh/vite@^2.2.9", "@prefresh/vite@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@prefresh/vite/-/vite-2.4.1.tgz#c565ae2f8ec2c5ea03611969810dd02a779c2581" integrity sha512-vthWmEqu8TZFeyrBNc9YE5SiC3DVSzPgsOCp/WQ7FqdHpOIJi7Z8XvCK06rBPOtG4914S52MjG9Ls22eVAiuqQ== @@ -3032,16 +3032,16 @@ resolve "^1.17.0" "@rollup/plugin-commonjs@^25.0.4": - version "25.0.5" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.5.tgz#0bac8f985a5de151b4b09338847f8c7f20a28a29" - integrity sha512-xY8r/A9oisSeSuLCTfhssyDjo9Vp/eDiRLXkg1MXCcEEgEjPmLU+ZyDB20OOD0NlyDa/8SGbK5uIggF5XTx77w== + version "25.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" + integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" estree-walker "^2.0.2" glob "^8.0.3" is-reference "1.2.1" - magic-string "^0.27.0" + magic-string "^0.30.3" "@rollup/plugin-json@^4.1.0": version "4.1.0" @@ -3919,9 +3919,9 @@ "@types/chai" "*" "@types/chai@*": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" - integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== + version "4.3.8" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.8.tgz#aa200a264a3bc78ccfc1718eedbd3b9d5a591270" + integrity sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA== "@types/connect-history-api-fallback@^1.3.5": version "1.5.1" @@ -3976,9 +3976,9 @@ "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.44.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.3.tgz#96614fae4875ea6328f56de38666f582d911d962" - integrity sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g== + version "8.44.4" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.4.tgz#28eaff82e1ca0a96554ec5bb0188f10ae1a74c2f" + integrity sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -4027,9 +4027,9 @@ "@types/range-parser" "*" "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.8": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + version "4.17.19" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.19.tgz#6ff9b4851fda132c5d3dcd2f89fdb6a7a0031ced" + integrity sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -4110,9 +4110,9 @@ "@types/node" "*" "@types/is-ci@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.1.tgz#802da8f2376d9bf5c20ac17c9f869aed2b532297" - integrity sha512-mnb1ngaGQPm6LFZaNdh3xPOoQMkrQb/KBPhPPN2p2Wk8XgeUqWj6xPnvyQ8rvcK/VFritVmQG8tvQuy7g+9/nQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.2.tgz#62acd24fc99bf31047086e0f6b1a657919837f15" + integrity sha512-9PyP1rgCro6xO3R7zOEoMgx5U9HpLhIg1FFb9p2mWX/x5QI8KMuCWWYtCT1dUQpicp84OsxEAw3iqwIKQY5Pog== dependencies: ci-info "^3.1.0" @@ -4160,9 +4160,9 @@ pretty-format "^27.0.0" "@types/js-yaml@^4.0.0", "@types/js-yaml@^4.0.2": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.6.tgz#4b3afd5158b8749095b1f096967b6d0f838d862f" - integrity sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw== + version "4.0.7" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.7.tgz#f11c2ec37bb748fa5cfa3262abcb8b1cfd83d8ae" + integrity sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg== "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.13" @@ -4266,9 +4266,11 @@ form-data "^4.0.0" "@types/node@*", "@types/node@>=6": - version "20.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.3.tgz#c4ae2bb1cfab2999ed441a95c122bbbe1567a66d" - integrity sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw== + version "20.8.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" + integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + dependencies: + undici-types "~5.25.1" "@types/node@18.11.10": version "18.11.10" @@ -4296,9 +4298,9 @@ integrity sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA== "@types/node@^18.0.0": - version "18.18.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.4.tgz#519fef47a13cf869be290c20fc6ae9b7fe887aa7" - integrity sha512-t3rNFBgJRugIhackit2mVcLfF6IRc0JE4oeizPQL8Zrm8n2WY/0wOdpOPhdtG0V9Q2TlW/axbF1MJ6z+Yj/kKQ== + version "18.18.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.5.tgz#afc0fd975df946d6e1add5bbf98264225b212244" + integrity sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A== "@types/normalize-package-data@^2.4.0": version "2.4.2" @@ -4348,25 +4350,25 @@ "@types/react" "^17" "@types/react-dom@^18.0.9": - version "18.2.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58" - integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg== + version "18.2.13" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.13.tgz#89cd7f9ec8b28c8b6f0392b9591671fb4a9e96b7" + integrity sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw== dependencies: "@types/react" "*" "@types/react@*", "@types/react@>=16": - version "18.2.25" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199" - integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw== + version "18.2.28" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.28.tgz#86877465c0fcf751659a36c769ecedfcfacee332" + integrity sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17", "@types/react@^17.0.40": - version "17.0.67" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.67.tgz#1c224738f203829a4692aa48e33a732c34fd014a" - integrity sha512-zE76EIJ0Y58Oy9yDX/9csb/NuKjt0Eq2YgWb/8Wxo91YmuLzzbyiRoaqJE9h8iDlsT7n35GdpoLomHlaB1kFbg== + version "17.0.68" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" + integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4522,9 +4524,9 @@ "@types/node" "*" "@types/ws@^8.5.5": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" - integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + version "8.5.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.7.tgz#1ca585074fe5d2c81dec7a3d451f244a2a6d83cb" + integrity sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ== dependencies: "@types/node" "*" @@ -5850,29 +5852,29 @@ babel-plugin-named-asset-import@^0.3.8: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== -babel-plugin-polyfill-corejs2@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" - integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz#1fac2b1dcef6274e72b3c72977ed8325cb330591" - integrity sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg== +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" + integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" core-js-compat "^3.32.2" -babel-plugin-polyfill-regenerator@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" - integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.2" + "@babel/helper-define-polyfill-provider" "^0.4.3" babel-plugin-transform-hook-names@^1.0.2: version "1.0.2" @@ -6647,9 +6649,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001546" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz#10fdad03436cfe3cc632d3af7a99a0fb497407f0" - integrity sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw== + version "1.0.30001549" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" + integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== canonicalize@^1.0.1, canonicalize@^1.0.3: version "1.0.8" @@ -8347,7 +8349,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -8491,9 +8493,9 @@ defer-to-connect@^2.0.0: integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" gopd "^1.0.1" @@ -8957,9 +8959,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.535: - version "1.4.544" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz#fcb156d83f0ee6e4c9d030c6fedb2a37594f3abf" - integrity sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w== + version "1.4.554" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" + integrity sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ== electron@^20.0.3: version "20.3.12" @@ -10510,9 +10512,9 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fragment-cache@^0.2.1: version "0.2.1" @@ -10610,9 +10612,9 @@ fstream@^1.0.12: rimraf "2" function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" @@ -10672,7 +10674,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0, get-func-name@^2.0.2: +get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== @@ -12236,7 +12238,7 @@ is-color-stop@^1.0.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: +is-core-module@^2.13.0, is-core-module@^2.5.0: version "2.13.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== @@ -13966,9 +13968,9 @@ keyv@^4.0.0, keyv@^4.5.3: json-buffer "3.0.1" khroma@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" - integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== kill-process-by-name@^1.0.5: version "1.0.5" @@ -14021,7 +14023,7 @@ klona@^2.0.4, klona@^2.0.5: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== -kolorist@^1.2.10: +kolorist@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== @@ -14426,11 +14428,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lower-case@^2.0.2: version "2.0.2" @@ -14503,17 +14505,10 @@ magic-string@^0.25.0, magic-string@^0.25.2, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - -magic-string@^0.30.0: - version "0.30.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.4.tgz#c2c683265fc18dda49b56fc7318d33ca0332c98c" - integrity sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg== +magic-string@^0.30.0, magic-string@^0.30.3: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -16408,9 +16403,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.0.tgz#42695d3879e1cd5bda6df5062164d80c996e23e2" + integrity sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g== object-is@^1.1.5: version "1.1.5" @@ -19093,21 +19088,21 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.1.4, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.4.0: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== +resolve@^1.1.4, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.4, resolve@^1.22.8, resolve@^1.4.0: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3, resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -19464,9 +19459,9 @@ sass-loader@^12.3.0: neo-async "^2.6.2" sass@*: - version "1.69.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.0.tgz#5195075371c239ed556280cf2f5944d234f42679" - integrity sha512-l3bbFpfTOGgQZCLU/gvm1lbsQ5mC/WnLz3djL2v4WCJBDrWm58PO+jgngcGRNnKUh6wSsdm50YaovTqskZ0xDQ== + version "1.69.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.3.tgz#f8a0c488697e6419519834a13335e7b65a609c11" + integrity sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -19789,9 +19784,9 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== shiki@^0.14.1, shiki@^0.14.3: - version "0.14.4" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.4.tgz#2454969b466a5f75067d0f2fa0d7426d32881b20" - integrity sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ== + version "0.14.5" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.5.tgz#375dd214e57eccb04f0daf35a32aa615861deb93" + integrity sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw== dependencies: ansi-sequence-parser "^1.1.0" jsonc-parser "^3.2.0" @@ -20442,9 +20437,9 @@ style-loader@^3.3.1: integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== style-to-object@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.2.tgz#a8247057111dea8bd3b8a1a66d2d0c9cf9218a54" - integrity sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA== + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== dependencies: inline-style-parser "0.1.1" @@ -20785,9 +20780,9 @@ terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: terser "^5.16.8" terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: - version "5.21.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.21.0.tgz#d2b27e92b5e56650bc83b6defa00a110f0b124b2" - integrity sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw== + version "5.22.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -21497,6 +21492,11 @@ underscore@^1.13.2: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -22296,9 +22296,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.64.4: - version "5.88.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" - integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + version "5.89.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" + integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" @@ -22805,9 +22805,9 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.1.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== yargs-parser@20.2.4: version "20.2.4" From 905484cb374f1d8c889abd7bd53873ac88f8abfd Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 16 Oct 2023 18:47:48 +0100 Subject: [PATCH 61/87] replace all linux runners with self hosted variant --- .github/workflows/agent-language-tests.yml | 2 +- .../workflows/direct-message-language-tests.yml | 2 +- .../workflows/file-storage-language-tests.yml | 4 ++-- .github/workflows/integration_js.yml | 2 +- .github/workflows/p-diff-sync-tests.yml | 16 ++++++++-------- .github/workflows/publish.yml | 16 ++++++++-------- .github/workflows/publish_staging.yml | 16 ++++++++-------- .../file-storage/.github/workflows/test.yml | 4 ++-- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index 3fab49960..345c0f83a 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index 79c003454..e57f222bc 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index cef568be1..467e34f0f 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -62,7 +62,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 9256ca060..8e33c8c2e 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 274e4dae2..9a82f4e14 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -45,7 +45,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -90,7 +90,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -136,7 +136,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -182,7 +182,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -229,7 +229,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -275,7 +275,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -321,7 +321,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4965e4b53..f769e0378 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,7 +7,7 @@ on: jobs: create-release: - runs-on: ubuntu-22.04 + runs-on: self-hosted outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04, macos-latest, windows-latest] + platform: [self-hosted, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -73,7 +73,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -125,7 +125,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -137,7 +137,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -173,7 +173,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -280,7 +280,7 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: ubuntu-22.04 + runs-on: self-hosted steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -330,7 +330,7 @@ jobs: crates-publish: - runs-on: ubuntu-22.04 + runs-on: self-hosted steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 49700994b..dc96280e1 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -7,7 +7,7 @@ on: jobs: create-release: - runs-on: ubuntu-22.04 + runs-on: self-hosted outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04, macos-latest, windows-latest] + platform: [self-hosted, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -65,7 +65,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -140,7 +140,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -152,7 +152,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -188,7 +188,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -295,7 +295,7 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: ubuntu-22.04 + runs-on: self-hosted steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -373,7 +373,7 @@ jobs: crates-publish: - runs-on: ubuntu-22.04 + runs-on: self-hosted steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/bootstrap-languages/file-storage/.github/workflows/test.yml b/bootstrap-languages/file-storage/.github/workflows/test.yml index 2d193f1ce..bcbb80dee 100644 --- a/bootstrap-languages/file-storage/.github/workflows/test.yml +++ b/bootstrap-languages/file-storage/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -53,7 +53,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [self-hosted] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ From f7f1e60002ce9faaa4110c0e78676e1901a62e77 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Mon, 16 Oct 2023 19:17:03 +0100 Subject: [PATCH 62/87] use docker containers for all linux workflow runs --- .github/workflows/agent-language-tests.yml | 1 + .../direct-message-language-tests.yml | 1 + .../workflows/file-storage-language-tests.yml | 2 + .github/workflows/integration_js.yml | 1 + .github/workflows/p-diff-sync-tests.yml | 8 ++ .github/workflows/publish.yml | 108 ++++++++++++--- .github/workflows/publish_staging.yml | 128 ++++++++++++++---- .../file-storage/.github/workflows/test.yml | 2 + 8 files changed, 203 insertions(+), 48 deletions(-) diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index 345c0f83a..d3f89f491 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -17,6 +17,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index e57f222bc..a37e582a8 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -17,6 +17,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index 467e34f0f..cdf71a55e 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -17,6 +17,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -63,6 +64,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 8e33c8c2e..08a34175f 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 9a82f4e14..e88244bf6 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -17,6 +17,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -46,6 +47,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -91,6 +93,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -137,6 +140,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -183,6 +187,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -230,6 +235,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -276,6 +282,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -322,6 +329,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f769e0378..8ef2cf508 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -8,6 +8,7 @@ on: jobs: create-release: runs-on: self-hosted + container: "ubuntu:22.04" outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -38,11 +39,12 @@ jobs: draft: true prerelease: false - build-launcher-binary: + build-launcher-binary-linux: strategy: fail-fast: false matrix: - platform: [self-hosted, macos-latest, windows-latest] + platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [18.17.0] needs: @@ -78,14 +80,6 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - - name: install dependencies (macos only) - if: matrix.platform == 'macos-latest' - run: brew install protobuf cmake - - - name: install dependencies (windows only) - if: matrix.platform == 'windows-latest' - run: choco install protoc cmake - - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -114,15 +108,6 @@ jobs: APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} run: yarn run package-ad4m - - name: Build AD4M-CLI & build Launcher binary (windows-latest) - if: matrix.platform == 'windows-latest' - env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - run: | - choco install curl cygwin gnuwin32-m4 libgcc make mingw - yarn run package-ad4m - - name: Upload Release Deb Asset id: upload-release-deb-asset if: matrix.platform == 'self-hosted' @@ -149,7 +134,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -161,7 +146,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -183,6 +168,85 @@ jobs: asset_name: ad4m-linux-${{ steps.extract_version.outputs.version }}-x64 asset_content_type: application/octet-stream + build-launcher-binary-others: + strategy: + fail-fast: false + matrix: + platform: [macos-latest, windows-latest] + node-version: [18.17.0] + + needs: + - create-release + - npm-publish + + runs-on: ${{ matrix.platform }} + + steps: + - name: Fetch source code + uses: actions/checkout@v2 + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + override: true + toolchain: 1.71.1 + + - name: Install GO + uses: actions/setup-go@v4 + with: + go-version: '1.18' + + - name: Install Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.32.4 + - run: rustup target add wasm32-unknown-unknown + + - name: install dependencies (macos only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake + + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + + - name: get version + run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV + + - name: Extract version + id: extract_version + uses: Saionaro/extract-package-version@v1.1.1 + with: + path: ui + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Yarn Install + run: yarn install + + - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) + if: matrix.platform != 'windows-latest' + env: + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + run: yarn run package-ad4m + + - name: Build AD4M-CLI & build Launcher binary (windows-latest) + if: matrix.platform == 'windows-latest' + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + run: | + choco install curl cygwin gnuwin32-m4 libgcc make mingw + yarn run package-ad4m + - name: Upload Release Macos Asset id: upload-release-macos-asset if: matrix.platform == 'macos-latest' @@ -281,6 +345,7 @@ jobs: npm-publish: runs-on: self-hosted + container: "ubuntu:22.04" steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -331,6 +396,7 @@ jobs: crates-publish: runs-on: self-hosted + container: "ubuntu:22.04" steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index dc96280e1..cabd34d09 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -8,6 +8,7 @@ on: jobs: create-release: runs-on: self-hosted + container: "ubuntu:22.04" outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -38,11 +39,12 @@ jobs: draft: true prerelease: true - build-launcher-binary: + build-launcher-binary-linux: strategy: fail-fast: false matrix: - platform: [self-hosted, macos-latest, windows-latest] + platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [18.17.0] needs: @@ -70,14 +72,6 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - - name: install dependencies (macos only) - if: matrix.platform == 'macos-latest' - run: brew install protobuf cmake - - - name: install dependencies (windows only) - if: matrix.platform == 'windows-latest' - run: choco install protoc cmake - - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -123,21 +117,6 @@ jobs: releaseDraft: true prerelease: false - - name: Build AD4M-CLI & build Launcher binary (windows-latest) - if: matrix.platform == 'windows-latest' - env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - run: | - choco install curl cygwin gnuwin32-m4 libgcc make mingw - yarn run package-ad4m - - name: Upload Release Deb Asset id: upload-release-deb-asset if: matrix.platform == 'self-hosted' @@ -164,7 +143,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -176,7 +155,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'self-hosted' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -198,6 +177,101 @@ jobs: asset_name: ad4m-linux-${{ steps.extract_version.outputs.version }}-x64 asset_content_type: application/octet-stream + + build-launcher-binary-others: + strategy: + fail-fast: false + matrix: + platform: [macos-latest, windows-latest] + node-version: [18.17.0] + + needs: + - create-release + + runs-on: ${{ matrix.platform }} + steps: + - name: Fetch source code + uses: actions/checkout@v2 + + - name: Install Rust stable + uses: actions-rs/toolchain@v1 + with: + override: true + toolchain: 1.71.1 + - name: Install Deno + uses: denoland/setup-deno@v1 + with: + deno-version: v1.32.4 + - run: rustup target add wasm32-unknown-unknown + + - name: install dependencies (macos only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake + + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + + - name: get version + run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV + + - name: Extract version + id: extract_version + uses: Saionaro/extract-package-version@v1.1.1 + with: + path: ui + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: Install GO + uses: actions/setup-go@v4 + with: + go-version: '1.18' + + - name: Yarn Install + run: yarn install --no-cache + + - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) + if: matrix.platform != 'windows-latest' + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + run: yarn run build + + - name: Build the app + uses: tauri-apps/tauri-action@v0 + env: + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + with: + tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version + releaseName: 'ADAM Launcher v__VERSION__' + releaseBody: 'See the assets to download this version and install.' + releaseDraft: true + prerelease: false + + - name: Build AD4M-CLI & build Launcher binary (windows-latest) + if: matrix.platform == 'windows-latest' + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + run: | + choco install curl cygwin gnuwin32-m4 libgcc make mingw + yarn run package-ad4m + - name: Upload Release Macos Asset id: upload-release-macos-asset if: matrix.platform == 'macos-latest' diff --git a/bootstrap-languages/file-storage/.github/workflows/test.yml b/bootstrap-languages/file-storage/.github/workflows/test.yml index bcbb80dee..0080e307c 100644 --- a/bootstrap-languages/file-storage/.github/workflows/test.yml +++ b/bootstrap-languages/file-storage/.github/workflows/test.yml @@ -16,6 +16,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ @@ -54,6 +55,7 @@ jobs: strategy: matrix: platform: [self-hosted] + container: ["ubuntu:22.04"] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ From aab6c909061cbf037d8b1dba87414b4fc2e427ab Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 17 Oct 2023 14:35:21 +0100 Subject: [PATCH 63/87] try adding build tools on dep install --- .github/workflows/integration_js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 08a34175f..6377b5608 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -61,7 +61,7 @@ jobs: - name: install system dependencies run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler gcc gcc-multilib build-essential - name: Install HC run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" From 089d93341fac00d1592e3a337cb1536bac963e67 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 17 Oct 2023 15:22:14 +0100 Subject: [PATCH 64/87] go back to github runner but optimize build space before doing run --- .github/workflows/agent-language-tests.yml | 11 ++- .../direct-message-language-tests.yml | 11 ++- .../workflows/file-storage-language-tests.yml | 22 ++++- .github/workflows/integration_js.yml | 11 ++- .github/workflows/p-diff-sync-tests.yml | 88 +++++++++++++++---- .github/workflows/publish.yml | 56 +++++++++--- .github/workflows/publish_staging.yml | 54 +++++++++--- .../file-storage/.github/workflows/test.yml | 22 ++++- 8 files changed, 219 insertions(+), 56 deletions(-) diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index d3f89f491..a79c55b8a 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -16,14 +16,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index a37e582a8..3331c32da 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -16,14 +16,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index cdf71a55e..f1054735a 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -16,14 +16,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -63,14 +70,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 6377b5608..298d49b07 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -13,14 +13,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index e88244bf6..3850ea13f 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -16,14 +16,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -46,14 +53,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -92,14 +106,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -139,14 +160,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -186,14 +214,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -234,14 +269,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -281,14 +323,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -328,14 +377,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8ef2cf508..b025db63b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,12 +7,19 @@ on: jobs: create-release: - runs-on: self-hosted - container: "ubuntu:22.04" + runs-on: ubuntu-22.04 outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 @@ -43,8 +50,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [18.17.0] needs: @@ -54,6 +60,14 @@ jobs: runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -75,7 +89,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -110,7 +124,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -122,7 +136,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -134,7 +148,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -146,7 +160,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -158,7 +172,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -344,9 +358,16 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: self-hosted - container: "ubuntu:22.04" + runs-on: ubuntu-22.04 steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - name: Use Node.js 16.x @@ -395,9 +416,16 @@ jobs: crates-publish: - runs-on: self-hosted - container: "ubuntu:22.04" + runs-on: ubuntu-22.04 steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index cabd34d09..814a1c25e 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -7,12 +7,19 @@ on: jobs: create-release: - runs-on: self-hosted - container: "ubuntu:22.04" + runs-on: ubuntu-22.04 outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 @@ -43,8 +50,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [18.17.0] needs: @@ -52,6 +58,14 @@ jobs: runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -67,7 +81,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -119,7 +133,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -131,7 +145,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -143,7 +157,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -155,7 +169,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -167,7 +181,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'self-hosted' + if: matrix.platform == 'ubuntu-22.04' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -369,8 +383,16 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: self-hosted + runs-on: ubuntu-22.04 steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - name: Use Node.js 16.x @@ -447,8 +469,16 @@ jobs: crates-publish: - runs-on: self-hosted + runs-on: ubuntu-22.04 steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/bootstrap-languages/file-storage/.github/workflows/test.yml b/bootstrap-languages/file-storage/.github/workflows/test.yml index 0080e307c..d7e8f0fd4 100644 --- a/bootstrap-languages/file-storage/.github/workflows/test.yml +++ b/bootstrap-languages/file-storage/.github/workflows/test.yml @@ -15,14 +15,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -54,14 +61,21 @@ jobs: strategy: matrix: - platform: [self-hosted] - container: ["ubuntu:22.04"] + platform: [ubuntu-22.04] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ runs-on: ${{ matrix.platform }} steps: + - name: Maximize build space + uses: easimon/maximize-build-space@master + with: + root-reserve-mb: 512 + swap-size-mb: 1024 + remove-dotnet: 'true' + remove-andriod: 'true' + remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: From 78afdb0deef9638dfb81039141463d1062737738 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 17 Oct 2023 15:25:13 +0100 Subject: [PATCH 65/87] fix typo in maximise build-space --- .github/workflows/agent-language-tests.yml | 2 +- .../workflows/direct-message-language-tests.yml | 2 +- .../workflows/file-storage-language-tests.yml | 4 ++-- .github/workflows/integration_js.yml | 2 +- .github/workflows/p-diff-sync-tests.yml | 16 ++++++++-------- .github/workflows/publish.yml | 8 ++++---- .github/workflows/publish_staging.yml | 8 ++++---- .../file-storage/.github/workflows/test.yml | 4 ++-- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index a79c55b8a..af5aa49c2 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -29,7 +29,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index 3331c32da..ceaf14622 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -29,7 +29,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index f1054735a..8db21dfa0 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -29,7 +29,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -83,7 +83,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 298d49b07..35fa9e782 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -26,7 +26,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 3850ea13f..5e1df73d7 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -29,7 +29,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -66,7 +66,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -119,7 +119,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -173,7 +173,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -227,7 +227,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -282,7 +282,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -336,7 +336,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -390,7 +390,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b025db63b..782aae096 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -18,7 +18,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node @@ -66,7 +66,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -366,7 +366,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -424,7 +424,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 814a1c25e..265f700bc 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -18,7 +18,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node @@ -64,7 +64,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -391,7 +391,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -477,7 +477,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/bootstrap-languages/file-storage/.github/workflows/test.yml b/bootstrap-languages/file-storage/.github/workflows/test.yml index d7e8f0fd4..100939027 100644 --- a/bootstrap-languages/file-storage/.github/workflows/test.yml +++ b/bootstrap-languages/file-storage/.github/workflows/test.yml @@ -28,7 +28,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 @@ -74,7 +74,7 @@ jobs: root-reserve-mb: 512 swap-size-mb: 1024 remove-dotnet: 'true' - remove-andriod: 'true' + remove-android: 'true' remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 From 9c847a988b726e5797244edec36b57840b90548f Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 17 Oct 2023 16:15:44 +0100 Subject: [PATCH 66/87] increase root build space --- .github/workflows/integration_js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 35fa9e782..8f0c33fef 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -23,7 +23,7 @@ jobs: - name: Maximize build space uses: easimon/maximize-build-space@master with: - root-reserve-mb: 512 + root-reserve-mb: 4048 swap-size-mb: 1024 remove-dotnet: 'true' remove-android: 'true' From 443029793c95afa6f40c4462b252ab2561d7a79e Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Tue, 17 Oct 2023 16:29:28 +0100 Subject: [PATCH 67/87] more space on root --- .github/workflows/integration_js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 8f0c33fef..d8242e9d4 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -23,7 +23,7 @@ jobs: - name: Maximize build space uses: easimon/maximize-build-space@master with: - root-reserve-mb: 4048 + root-reserve-mb: 6048 swap-size-mb: 1024 remove-dotnet: 'true' remove-android: 'true' From 23f8cb62ac8701d634887cac50a35ba1d93194a4 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 18 Oct 2023 12:45:33 +0100 Subject: [PATCH 68/87] Reverted to 9ca9aa6dfaed821535a0ec1c2da3d48e6e2c14a9 --- .github/workflows/agent-language-tests.yml | 8 - .../direct-message-language-tests.yml | 8 - .../workflows/file-storage-language-tests.yml | 16 -- .github/workflows/integration_js.yml | 10 +- .github/workflows/p-diff-sync-tests.yml | 64 ------- .github/workflows/publish.yml | 136 +++------------ .github/workflows/publish_staging.yml | 158 +++--------------- .../file-storage/.github/workflows/test.yml | 16 -- 8 files changed, 49 insertions(+), 367 deletions(-) diff --git a/.github/workflows/agent-language-tests.yml b/.github/workflows/agent-language-tests.yml index af5aa49c2..3fab49960 100644 --- a/.github/workflows/agent-language-tests.yml +++ b/.github/workflows/agent-language-tests.yml @@ -23,14 +23,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/direct-message-language-tests.yml b/.github/workflows/direct-message-language-tests.yml index ceaf14622..79c003454 100644 --- a/.github/workflows/direct-message-language-tests.yml +++ b/.github/workflows/direct-message-language-tests.yml @@ -23,14 +23,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/file-storage-language-tests.yml b/.github/workflows/file-storage-language-tests.yml index 8db21dfa0..cef568be1 100644 --- a/.github/workflows/file-storage-language-tests.yml +++ b/.github/workflows/file-storage-language-tests.yml @@ -23,14 +23,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -77,14 +69,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index d8242e9d4..9256ca060 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -20,14 +20,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 6048 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: @@ -68,7 +60,7 @@ jobs: - name: install system dependencies run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler gcc gcc-multilib build-essential + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler - name: Install HC run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 5e1df73d7..274e4dae2 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -23,14 +23,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -60,14 +52,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -113,14 +97,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -167,14 +143,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -221,14 +189,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -276,14 +236,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -330,14 +282,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -384,14 +328,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 782aae096..4965e4b53 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,14 +12,6 @@ jobs: upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 @@ -46,11 +38,11 @@ jobs: draft: true prerelease: false - build-launcher-binary-linux: + build-launcher-binary: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04] + platform: [ubuntu-22.04, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -60,14 +52,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -94,6 +78,14 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + - name: install dependencies (macos only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake + + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -122,6 +114,15 @@ jobs: APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} run: yarn run package-ad4m + - name: Build AD4M-CLI & build Launcher binary (windows-latest) + if: matrix.platform == 'windows-latest' + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + run: | + choco install curl cygwin gnuwin32-m4 libgcc make mingw + yarn run package-ad4m + - name: Upload Release Deb Asset id: upload-release-deb-asset if: matrix.platform == 'ubuntu-22.04' @@ -148,7 +149,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'ubuntu-latest' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -160,7 +161,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'ubuntu-latest' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -182,85 +183,6 @@ jobs: asset_name: ad4m-linux-${{ steps.extract_version.outputs.version }}-x64 asset_content_type: application/octet-stream - build-launcher-binary-others: - strategy: - fail-fast: false - matrix: - platform: [macos-latest, windows-latest] - node-version: [18.17.0] - - needs: - - create-release - - npm-publish - - runs-on: ${{ matrix.platform }} - - steps: - - name: Fetch source code - uses: actions/checkout@v2 - - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - override: true - toolchain: 1.71.1 - - - name: Install GO - uses: actions/setup-go@v4 - with: - go-version: '1.18' - - - name: Install Deno - uses: denoland/setup-deno@v1 - with: - deno-version: v1.32.4 - - run: rustup target add wasm32-unknown-unknown - - - name: install dependencies (macos only) - if: matrix.platform == 'macos-latest' - run: brew install protobuf cmake - - - name: install dependencies (windows only) - if: matrix.platform == 'windows-latest' - run: choco install protoc cmake - - - name: get version - run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV - - - name: Extract version - id: extract_version - uses: Saionaro/extract-package-version@v1.1.1 - with: - path: ui - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - - name: Yarn Install - run: yarn install - - - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) - if: matrix.platform != 'windows-latest' - env: - ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - run: yarn run package-ad4m - - - name: Build AD4M-CLI & build Launcher binary (windows-latest) - if: matrix.platform == 'windows-latest' - env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - run: | - choco install curl cygwin gnuwin32-m4 libgcc make mingw - yarn run package-ad4m - - name: Upload Release Macos Asset id: upload-release-macos-asset if: matrix.platform == 'macos-latest' @@ -360,14 +282,6 @@ jobs: npm-publish: runs-on: ubuntu-22.04 steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - name: Use Node.js 16.x @@ -418,14 +332,6 @@ jobs: crates-publish: runs-on: ubuntu-22.04 steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 265f700bc..49700994b 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -12,14 +12,6 @@ jobs: upload_url: ${{ steps.create-release.outputs.upload_url }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v3 - name: setup node uses: actions/setup-node@v3 @@ -46,11 +38,11 @@ jobs: draft: true prerelease: true - build-launcher-binary-linux: + build-launcher-binary: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04] + platform: [ubuntu-22.04, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -58,14 +50,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - name: Fetch source code uses: actions/checkout@v2 @@ -86,6 +70,14 @@ jobs: sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + - name: install dependencies (macos only) + if: matrix.platform == 'macos-latest' + run: brew install protobuf cmake + + - name: install dependencies (windows only) + if: matrix.platform == 'windows-latest' + run: choco install protoc cmake + - name: get version run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV @@ -131,6 +123,21 @@ jobs: releaseDraft: true prerelease: false + - name: Build AD4M-CLI & build Launcher binary (windows-latest) + if: matrix.platform == 'windows-latest' + env: + TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + run: | + choco install curl cygwin gnuwin32-m4 libgcc make mingw + yarn run package-ad4m + - name: Upload Release Deb Asset id: upload-release-deb-asset if: matrix.platform == 'ubuntu-22.04' @@ -157,7 +164,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'ubuntu-latest' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -169,7 +176,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'ubuntu-latest' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -191,101 +198,6 @@ jobs: asset_name: ad4m-linux-${{ steps.extract_version.outputs.version }}-x64 asset_content_type: application/octet-stream - - build-launcher-binary-others: - strategy: - fail-fast: false - matrix: - platform: [macos-latest, windows-latest] - node-version: [18.17.0] - - needs: - - create-release - - runs-on: ${{ matrix.platform }} - steps: - - name: Fetch source code - uses: actions/checkout@v2 - - - name: Install Rust stable - uses: actions-rs/toolchain@v1 - with: - override: true - toolchain: 1.71.1 - - name: Install Deno - uses: denoland/setup-deno@v1 - with: - deno-version: v1.32.4 - - run: rustup target add wasm32-unknown-unknown - - - name: install dependencies (macos only) - if: matrix.platform == 'macos-latest' - run: brew install protobuf cmake - - - name: install dependencies (windows only) - if: matrix.platform == 'windows-latest' - run: choco install protoc cmake - - - name: get version - run: echo "PACKAGE_VERSION=$(node -p "require('./ui/package.json').version")" >> $GITHUB_ENV - - - name: Extract version - id: extract_version - uses: Saionaro/extract-package-version@v1.1.1 - with: - path: ui - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - - name: Install GO - uses: actions/setup-go@v4 - with: - go-version: '1.18' - - - name: Yarn Install - run: yarn install --no-cache - - - name: Build AD4M-CLI & build Launcher binary (macos/linux-latest) - if: matrix.platform != 'windows-latest' - env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - run: yarn run build - - - name: Build the app - uses: tauri-apps/tauri-action@v0 - env: - ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - with: - tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version - releaseName: 'ADAM Launcher v__VERSION__' - releaseBody: 'See the assets to download this version and install.' - releaseDraft: true - prerelease: false - - - name: Build AD4M-CLI & build Launcher binary (windows-latest) - if: matrix.platform == 'windows-latest' - env: - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} - APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} - run: | - choco install curl cygwin gnuwin32-m4 libgcc make mingw - yarn run package-ad4m - - name: Upload Release Macos Asset id: upload-release-macos-asset if: matrix.platform == 'macos-latest' @@ -385,14 +297,6 @@ jobs: npm-publish: runs-on: ubuntu-22.04 steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm - name: Use Node.js 16.x @@ -471,14 +375,6 @@ jobs: crates-publish: runs-on: ubuntu-22.04 steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: diff --git a/bootstrap-languages/file-storage/.github/workflows/test.yml b/bootstrap-languages/file-storage/.github/workflows/test.yml index 100939027..2d193f1ce 100644 --- a/bootstrap-languages/file-storage/.github/workflows/test.yml +++ b/bootstrap-languages/file-storage/.github/workflows/test.yml @@ -22,14 +22,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: @@ -68,14 +60,6 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Maximize build space - uses: easimon/maximize-build-space@master - with: - root-reserve-mb: 512 - swap-size-mb: 1024 - remove-dotnet: 'true' - remove-android: 'true' - remove-haskell: 'true' - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 with: From 40d04ec69c19a9c98a638f444f781a133bfa1bd8 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 18 Oct 2023 12:51:04 +0100 Subject: [PATCH 69/87] have linux ci integration test & publishing run on premium github runner --- .github/workflows/integration_js.yml | 2 +- .github/workflows/publish.yml | 20 ++++++++++---------- .github/workflows/publish_staging.yml | 20 ++++++++++---------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 9256ca060..2d0468f2f 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - platform: [ubuntu-22.04] + platform: [GH-hosted-ubuntu] node-version: [16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4965e4b53..d8fd1e9ec 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -7,7 +7,7 @@ on: jobs: create-release: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04, macos-latest, windows-latest] + platform: [GH-hosted-ubuntu, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -73,7 +73,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -125,7 +125,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -137,7 +137,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -149,7 +149,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -161,7 +161,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -173,7 +173,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -280,7 +280,7 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -330,7 +330,7 @@ jobs: crates-publish: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 49700994b..1bc90776f 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -7,7 +7,7 @@ on: jobs: create-release: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu outputs: upload_url: ${{ steps.create-release.outputs.upload_url }} @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ubuntu-22.04, macos-latest, windows-latest] + platform: [GH-hosted-ubuntu, macos-latest, windows-latest] node-version: [18.17.0] needs: @@ -65,7 +65,7 @@ jobs: - run: rustup target add wasm32-unknown-unknown - name: install dependencies (ubuntu only) - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler @@ -140,7 +140,7 @@ jobs: - name: Upload Release Deb Asset id: upload-release-deb-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -152,7 +152,7 @@ jobs: - name: Upload Release AppImage Asset id: upload-release-appimage-asset - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -164,7 +164,7 @@ jobs: - name: Upload Release AppImage Update Asset id: upload-release-appimage-asset-update - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -176,7 +176,7 @@ jobs: - name: Upload Release AppImage update sig Asset id: upload-release-appimage-asset-update-sig - if: matrix.platform == 'ubuntu-latest' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -188,7 +188,7 @@ jobs: - name: Upload Release AD4M CLI Linux Binary id: upload-release-linux-ad4m-cli-binary - if: matrix.platform == 'ubuntu-22.04' + if: matrix.platform == 'GH-hosted-ubuntu' uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -295,7 +295,7 @@ jobs: asset_content_type: application/octet-stream npm-publish: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu steps: - uses: actions/checkout@v3 # Setup .npmrc file to publish to npm @@ -373,7 +373,7 @@ jobs: crates-publish: - runs-on: ubuntu-22.04 + runs-on: GH-hosted-ubuntu steps: - uses: actions/checkout@v2 - uses: actions-rs/toolchain@v1 From 607450a4e0c40926de5fb5fca38cca9dc11ff752 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 18 Oct 2023 13:00:45 +0100 Subject: [PATCH 70/87] remove p diff sync integration test --- .github/workflows/p-diff-sync-tests.yml | 88 ++++++++++++------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/.github/workflows/p-diff-sync-tests.yml b/.github/workflows/p-diff-sync-tests.yml index 274e4dae2..43c950aee 100644 --- a/.github/workflows/p-diff-sync-tests.yml +++ b/.github/workflows/p-diff-sync-tests.yml @@ -316,48 +316,48 @@ jobs: - run: yarn run build-languages - run: cd bootstrap-languages/p-diff-sync/hc-dna/zomes/tests && yarn install && yarn run test-telepresence - integration: - name: Integration Test + # integration: + # name: Integration Test - strategy: - matrix: - platform: [ubuntu-22.04] - node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - runs-on: ${{ matrix.platform }} - - steps: - - uses: actions/checkout@v2 - - uses: actions-rs/toolchain@v1 - with: - toolchain: 1.71.1 - - - name: Cache cargo - id: cache-cargo - uses: actions/cache@v3 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - - name: Install Deno - uses: denoland/setup-deno@v1 - with: - deno-version: v1.32.4 - - - run: rustup target add wasm32-unknown-unknown - - run: yarn install - - run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" - - run: yarn run build - - run: cd bootstrap-languages/p-diff-sync && yarn run integration-test \ No newline at end of file + # strategy: + # matrix: + # platform: [ubuntu-22.04] + # node-version: [16.x] + # # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + # runs-on: ${{ matrix.platform }} + + # steps: + # - uses: actions/checkout@v2 + # - uses: actions-rs/toolchain@v1 + # with: + # toolchain: 1.71.1 + + # - name: Cache cargo + # id: cache-cargo + # uses: actions/cache@v3 + # with: + # path: | + # ~/.cargo/bin/ + # ~/.cargo/registry/index/ + # ~/.cargo/registry/cache/ + # ~/.cargo/git/db/ + # target/ + # key: ${{ runner.os }}-cargo + + # - name: Use Node.js ${{ matrix.node-version }} + # uses: actions/setup-node@v2 + # with: + # node-version: ${{ matrix.node-version }} + # cache: 'npm' + + # - name: Install Deno + # uses: denoland/setup-deno@v1 + # with: + # deno-version: v1.32.4 + + # - run: rustup target add wasm32-unknown-unknown + # - run: yarn install + # - run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" + # - run: yarn run build + # - run: cd bootstrap-languages/p-diff-sync && yarn run integration-test \ No newline at end of file From f31ae2cee43716a5e50226f76473e103c7a05887 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 18 Oct 2023 13:06:03 +0100 Subject: [PATCH 71/87] fix typo on linux cache save --- .github/workflows/integration_js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 2d0468f2f..6d591c6bb 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -80,7 +80,7 @@ jobs: ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ - key: $${{ runner.os }}-cargo-${{ hashFiles('./Cargo.lock') }} + key: ${{ runner.os }}-cargo-${{ hashFiles('./Cargo.lock') }} - name: Run the tests run: yarn test From ab848be42d5d95e8667636600e2055374d88526a Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 18 Oct 2023 22:13:34 +0530 Subject: [PATCH 72/87] Fixed ad4m core tests not working --- core/package.json | 15 +- core/patches/graphql+15.7.2.patch | 26 + core/src/Ad4mClient.test.ts | 26 +- yarn.lock | 1065 ++++++++++++----------------- 4 files changed, 510 insertions(+), 622 deletions(-) create mode 100644 core/patches/graphql+15.7.2.patch diff --git a/core/package.json b/core/package.json index a371fdc1c..1ee904b48 100644 --- a/core/package.json +++ b/core/package.json @@ -6,11 +6,13 @@ "module": "lib/index.js", "types": "lib/src/index.d.ts", "type": "module", + "private": true, "scripts": { - "build": "tsc && yarn run buildSchema && yarn run bundle", + "build": "patch-package && tsc && yarn run buildSchema && yarn run bundle", "buildSchema": "node --es-module-specifier-resolution=node lib/src/buildSchema.js", "bundle": "rollup -c rollup.config.js", - "test": "jest --forceExit" + "test": "jest --forceExit", + "postinstall": "patch-package" }, "repository": { "type": "git", @@ -33,6 +35,7 @@ "homepage": "https://ad4m.dev", "dependencies": { "@apollo/client": "3.7.10", + "@apollo/server": "^4.9.4", "@holochain/client": "0.16.0", "@types/jest": "^26.0.14", "class-validator": "^0.13.1", @@ -45,16 +48,20 @@ "@rollup/plugin-alias": "^3.1.5", "@rollup/plugin-commonjs": "^20.0.0", "@rollup/plugin-node-resolve": "^13.0.4", - "apollo-server-core": "3.12.0", - "apollo-server-express": "3.12.0", "concat-md": "^0.5.0", "cross-fetch": "^3.1.4", "graphql-ws": "5.12.0", "honkit": "^4.0.0", "jest": "^26.6.0", + "patch-package": "^8.0.0", "rollup": "^2.56.3", "ts-jest": "^26.5.6", "typescript": "^4.6.2", "ws": "8.13.0" + }, + "workspaces": { + "nohoist": [ + "**" + ] } } diff --git a/core/patches/graphql+15.7.2.patch b/core/patches/graphql+15.7.2.patch new file mode 100644 index 000000000..c9dc4911a --- /dev/null +++ b/core/patches/graphql+15.7.2.patch @@ -0,0 +1,26 @@ +diff --git a/node_modules/graphql/jsutils/instanceOf.js b/node_modules/graphql/jsutils/instanceOf.js +index 7098094..99ba917 100644 +--- a/node_modules/graphql/jsutils/instanceOf.js ++++ b/node_modules/graphql/jsutils/instanceOf.js +@@ -13,7 +13,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi + + // See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production + // See: https://webpack.js.org/guides/production/ +-var _default = process.env.NODE_ENV === 'production' ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') ++var _default = true ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + // eslint-disable-next-line no-shadow + function instanceOf(value, constructor) { + return value instanceof constructor; +diff --git a/node_modules/graphql/jsutils/instanceOf.mjs b/node_modules/graphql/jsutils/instanceOf.mjs +index ff46fca..5a1f7a2 100644 +--- a/node_modules/graphql/jsutils/instanceOf.mjs ++++ b/node_modules/graphql/jsutils/instanceOf.mjs +@@ -8,7 +8,7 @@ import inspect from "./inspect.mjs"; + + // See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production + // See: https://webpack.js.org/guides/production/ +-export default process.env.NODE_ENV === 'production' ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') ++export default true ? // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2317') + // eslint-disable-next-line no-shadow + function instanceOf(value, constructor) { + return value instanceof constructor; diff --git a/core/src/Ad4mClient.test.ts b/core/src/Ad4mClient.test.ts index 17bd93a7d..b518558d7 100644 --- a/core/src/Ad4mClient.test.ts +++ b/core/src/Ad4mClient.test.ts @@ -1,13 +1,16 @@ import { buildSchema } from "type-graphql" import { createServer } from 'http'; -import { ApolloServerPluginDrainHttpServer } from "apollo-server-core"; -import { ApolloServer } from "apollo-server-express"; +import { ApolloServer } from '@apollo/server'; +import { expressMiddleware } from '@apollo/server/express4'; +import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer' + import { WebSocketServer } from 'ws'; import { GraphQLWsLink } from "@apollo/client/link/subscriptions"; import { useServer } from 'graphql-ws/lib/use/ws'; import { ApolloClient, InMemoryCache } from "@apollo/client/core"; + import { createClient } from 'graphql-ws'; import Websocket from "ws"; import express from 'express'; @@ -51,21 +54,23 @@ async function createGqlServer(port: number) { { async serverWillStart() { return { - async drainServer() { - await serverCleanup.dispose(); + async drainServer() { + await serverCleanup.dispose(); }, }; }, }, - ] + ], }); + + // Creating the WebSocket server const wsServer = new WebSocketServer({ // This is the `httpServer` we created in a previous step. server: httpServer, // Pass a different path here if your ApolloServer serves at // a different path. - path: '/graphql', + path: '/subscriptions', }); // Hand in the schema we just created and have the @@ -73,7 +78,8 @@ async function createGqlServer(port: number) { serverCleanup = useServer({ schema }, wsServer); await server.start() - server.applyMiddleware({ app }); + app.use('/graphql', expressMiddleware(server)); + // server.applyMiddleware({ app }); httpServer.listen({ port }) return port } @@ -88,10 +94,12 @@ describe('Ad4mClient', () => { console.log(`GraphQL server listening at: http://localhost:${port}/graphql`) const wsLink = new GraphQLWsLink(createClient({ - url: `ws://localhost:${port}/graphql`, + url: `ws://localhost:${port}/subscriptions`, webSocketImpl: Websocket })); + + apolloClient = new ApolloClient({ link: wsLink, cache: new InMemoryCache(), @@ -106,6 +114,8 @@ describe('Ad4mClient', () => { console.log("GraphQL client connected") ad4mClient = new Ad4mClient(apolloClient) + + console.log("GraphQL client connected") }) describe('.agent', () => { diff --git a/yarn.lock b/yarn.lock index e1cd41eef..7fd733fd1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,6 +34,11 @@ jsonpointer "^5.0.0" leven "^3.1.0" +"@apollo/cache-control-types@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@apollo/cache-control-types/-/cache-control-types-1.0.3.tgz#5da62cf64c3b4419dabfef4536b57a40c8ff0b47" + integrity sha512-F17/vCp7QVwom9eG7ToauIKdAxpSoadsJnqIfyryLFSkLSOEqu+eC5Z3N8OXcUVStuOMcNHlyraRsA6rRICu4g== + "@apollo/client@3.7.10": version "3.7.10" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.7.10.tgz#addc5fcebaf016981d9476268a06d529be83f568" @@ -53,25 +58,6 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" -"@apollo/protobufjs@1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.6.tgz#d601e65211e06ae1432bf5993a1a0105f2862f27" - integrity sha512-Wqo1oSHNUj/jxmsVp4iR3I480p6qdqHikn38lKrFhfzcDJ7lwd7Ck7cHRl4JE81tWNArl77xhnG/OkZhxKBYOw== - dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" - long "^4.0.0" - "@apollo/protobufjs@1.2.7": version "1.2.7" resolved "https://registry.yarnpkg.com/@apollo/protobufjs/-/protobufjs-1.2.7.tgz#3a8675512817e4a046a897e5f4f16415f16a7d8a" @@ -90,76 +76,129 @@ "@types/long" "^4.0.0" long "^4.0.0" -"@apollo/usage-reporting-protobuf@^4.0.0": +"@apollo/server-gateway-interface@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@apollo/server-gateway-interface/-/server-gateway-interface-1.1.1.tgz#a79632aa921edefcd532589943f6b97c96fa4d3c" + integrity sha512-pGwCl/po6+rxRmDMFgozKQo2pbsSwE91TpsDBAOgf74CRDPXHHtM88wbwjab0wMMZh95QfR45GGyDIdhY24bkQ== + dependencies: + "@apollo/usage-reporting-protobuf" "^4.1.1" + "@apollo/utils.fetcher" "^2.0.0" + "@apollo/utils.keyvaluecache" "^2.1.0" + "@apollo/utils.logger" "^2.0.0" + +"@apollo/server@^4.9.4": + version "4.9.4" + resolved "https://registry.yarnpkg.com/@apollo/server/-/server-4.9.4.tgz#fde57e984beef1b2962354a492d3bca072c1067c" + integrity sha512-lopNDM3sZerTcYH/P85QX5HqSNV4HoVbtX3zOrf0ak7eplhPDiGVyF0jQWRbL64znG6KXW+nMuLDTyFTMQnvgA== + dependencies: + "@apollo/cache-control-types" "^1.0.3" + "@apollo/server-gateway-interface" "^1.1.1" + "@apollo/usage-reporting-protobuf" "^4.1.1" + "@apollo/utils.createhash" "^2.0.0" + "@apollo/utils.fetcher" "^2.0.0" + "@apollo/utils.isnodelike" "^2.0.0" + "@apollo/utils.keyvaluecache" "^2.1.0" + "@apollo/utils.logger" "^2.0.0" + "@apollo/utils.usagereporting" "^2.1.0" + "@apollo/utils.withrequired" "^2.0.0" + "@graphql-tools/schema" "^9.0.0" + "@josephg/resolvable" "^1.0.0" + "@types/express" "^4.17.13" + "@types/express-serve-static-core" "^4.17.30" + "@types/node-fetch" "^2.6.1" + async-retry "^1.2.1" + body-parser "^1.20.0" + cors "^2.8.5" + express "^4.17.1" + loglevel "^1.6.8" + lru-cache "^7.10.1" + negotiator "^0.6.3" + node-abort-controller "^3.1.1" + node-fetch "^2.6.7" + uuid "^9.0.0" + whatwg-mimetype "^3.0.0" + +"@apollo/usage-reporting-protobuf@^4.1.0", "@apollo/usage-reporting-protobuf@^4.1.1": version "4.1.1" resolved "https://registry.yarnpkg.com/@apollo/usage-reporting-protobuf/-/usage-reporting-protobuf-4.1.1.tgz#407c3d18c7fbed7a264f3b9a3812620b93499de1" integrity sha512-u40dIUePHaSKVshcedO7Wp+mPiZsaU6xjv9J+VyxpoU/zL6Jle+9zWeG98tr/+SZ0nZ4OXhrbb8SNr0rAPpIDA== dependencies: "@apollo/protobufjs" "1.2.7" -"@apollo/utils.dropunuseddefinitions@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-1.1.0.tgz#02b04006442eaf037f4c4624146b12775d70d929" - integrity sha512-jU1XjMr6ec9pPoL+BFWzEPW7VHHulVdGKMkPAMiCigpVIT11VmCbnij0bWob8uS3ODJ65tZLYKAh/55vLw2rbg== - -"@apollo/utils.keyvaluecache@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-1.0.2.tgz#2bfe358c4d82f3a0950518451996758c52613f57" - integrity sha512-p7PVdLPMnPzmXSQVEsy27cYEjVON+SH/Wb7COyW3rQN8+wJgT1nv9jZouYtztWW8ZgTkii5T6tC9qfoDREd4mg== +"@apollo/utils.createhash@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.createhash/-/utils.createhash-2.0.1.tgz#9d982a166833ce08265ff70f8ef781d65109bdaa" + integrity sha512-fQO4/ZOP8LcXWvMNhKiee+2KuKyqIcfHrICA+M4lj/h/Lh1H10ICcUtk6N/chnEo5HXu0yejg64wshdaiFitJg== dependencies: - "@apollo/utils.logger" "^1.0.0" - lru-cache "7.10.1 - 7.13.1" + "@apollo/utils.isnodelike" "^2.0.1" + sha.js "^2.4.11" -"@apollo/utils.logger@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-1.0.1.tgz#aea0d1bb7ceb237f506c6bbf38f10a555b99a695" - integrity sha512-XdlzoY7fYNK4OIcvMD2G94RoFZbzTQaNP0jozmqqMudmaGo2I/2Jx71xlDJ801mWA/mbYRihyaw6KJii7k5RVA== +"@apollo/utils.dropunuseddefinitions@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.dropunuseddefinitions/-/utils.dropunuseddefinitions-2.0.1.tgz#916cd912cbd88769d3b0eab2d24f4674eeda8124" + integrity sha512-EsPIBqsSt2BwDsv8Wu76LK5R1KtsVkNoO4b0M5aK0hx+dGg9xJXuqlr7Fo34Dl+y83jmzn+UvEW+t1/GP2melA== -"@apollo/utils.printwithreducedwhitespace@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-1.1.0.tgz#c466299a4766eef8577a2a64c8f27712e8bd7e30" - integrity sha512-GfFSkAv3n1toDZ4V6u2d7L4xMwLA+lv+6hqXicMN9KELSJ9yy9RzuEXaX73c/Ry+GzRsBy/fdSUGayGqdHfT2Q== +"@apollo/utils.fetcher@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.fetcher/-/utils.fetcher-2.0.1.tgz#2f6e3edc8ce79fbe916110d9baaddad7e13d955f" + integrity sha512-jvvon885hEyWXd4H6zpWeN3tl88QcWnHp5gWF5OPF34uhvoR+DFqcNxs9vrRaBBSY3qda3Qe0bdud7tz2zGx1A== -"@apollo/utils.removealiases@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-1.0.0.tgz#75f6d83098af1fcae2d3beb4f515ad4a8452a8c1" - integrity sha512-6cM8sEOJW2LaGjL/0vHV0GtRaSekrPQR4DiywaApQlL9EdROASZU5PsQibe2MWeZCOhNrPRuHh4wDMwPsWTn8A== +"@apollo/utils.isnodelike@^2.0.0", "@apollo/utils.isnodelike@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.isnodelike/-/utils.isnodelike-2.0.1.tgz#08a7e50f08d2031122efa25af089d1c6ee609f31" + integrity sha512-w41XyepR+jBEuVpoRM715N2ZD0xMD413UiJx8w5xnAZD2ZkSJnMJBoIzauK83kJpSgNuR6ywbV29jG9NmxjK0Q== -"@apollo/utils.sortast@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-1.1.0.tgz#93218c7008daf3e2a0725196085a33f5aab5ad07" - integrity sha512-VPlTsmUnOwzPK5yGZENN069y6uUHgeiSlpEhRnLFYwYNoJHsuJq2vXVwIaSmts015WTPa2fpz1inkLYByeuRQA== +"@apollo/utils.keyvaluecache@^2.1.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.keyvaluecache/-/utils.keyvaluecache-2.1.1.tgz#f3f79a2f00520c6ab7a77a680a4e1fec4d19e1a6" + integrity sha512-qVo5PvUUMD8oB9oYvq4ViCjYAMWnZ5zZwEjNF37L2m1u528x5mueMlU+Cr1UinupCgdB78g+egA1G98rbJ03Vw== dependencies: - lodash.sortby "^4.7.0" + "@apollo/utils.logger" "^2.0.1" + lru-cache "^7.14.1" -"@apollo/utils.stripsensitiveliterals@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-1.2.0.tgz#4920651f36beee8e260e12031a0c5863ad0c7b28" - integrity sha512-E41rDUzkz/cdikM5147d8nfCFVKovXxKBcjvLEQ7bjZm/cg9zEcXvS6vFY8ugTubI3fn6zoqo0CyU8zT+BGP9w== +"@apollo/utils.logger@^2.0.0", "@apollo/utils.logger@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.logger/-/utils.logger-2.0.1.tgz#74faeb97d7ad9f22282dfb465bcb2e6873b8a625" + integrity sha512-YuplwLHaHf1oviidB7MxnCXAdHp3IqYV8n0momZ3JfLniae92eYqMIx+j5qJFX6WKJPs6q7bczmV4lXIsTu5Pg== -"@apollo/utils.usagereporting@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-1.0.1.tgz#3c70b49e554771659576fe35381c7a4b321d27fd" - integrity sha512-6dk+0hZlnDbahDBB2mP/PZ5ybrtCJdLMbeNJD+TJpKyZmSY6bA3SjI8Cr2EM9QA+AdziywuWg+SgbWUF3/zQqQ== +"@apollo/utils.printwithreducedwhitespace@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.printwithreducedwhitespace/-/utils.printwithreducedwhitespace-2.0.1.tgz#f4fadea0ae849af2c19c339cc5420d1ddfaa905e" + integrity sha512-9M4LUXV/fQBh8vZWlLvb/HyyhjJ77/I5ZKu+NBWV/BmYGyRmoEP9EVAy7LCVoY3t8BDcyCAGfxJaLFCSuQkPUg== + +"@apollo/utils.removealiases@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.removealiases/-/utils.removealiases-2.0.1.tgz#2873c93d72d086c60fc0d77e23d0f75e66a2598f" + integrity sha512-0joRc2HBO4u594Op1nev+mUF6yRnxoUH64xw8x3bX7n8QBDYdeYgY4tF0vJReTy+zdn2xv6fMsquATSgC722FA== + +"@apollo/utils.sortast@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.sortast/-/utils.sortast-2.0.1.tgz#58c90bb8bd24726346b61fa51ba7fcf06e922ef7" + integrity sha512-eciIavsWpJ09za1pn37wpsCGrQNXUhM0TktnZmHwO+Zy9O4fu/WdB4+5BvVhFiZYOXvfjzJUcc+hsIV8RUOtMw== dependencies: - "@apollo/usage-reporting-protobuf" "^4.0.0" - "@apollo/utils.dropunuseddefinitions" "^1.1.0" - "@apollo/utils.printwithreducedwhitespace" "^1.1.0" - "@apollo/utils.removealiases" "1.0.0" - "@apollo/utils.sortast" "^1.1.0" - "@apollo/utils.stripsensitiveliterals" "^1.2.0" + lodash.sortby "^4.7.0" -"@apollographql/apollo-tools@^0.5.3": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@apollographql/apollo-tools/-/apollo-tools-0.5.4.tgz#cb3998c6cf12e494b90c733f44dd9935e2d8196c" - integrity sha512-shM3q7rUbNyXVVRkQJQseXv6bnYM3BUma/eZhwXR4xsuM+bqWnJKvW7SAfRjP7LuSCocrexa5AXhjjawNHrIlw== +"@apollo/utils.stripsensitiveliterals@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.stripsensitiveliterals/-/utils.stripsensitiveliterals-2.0.1.tgz#2f3350483be376a98229f90185eaf19888323132" + integrity sha512-QJs7HtzXS/JIPMKWimFnUMK7VjkGQTzqD9bKD1h3iuPAqLsxd0mUNVbkYOPTsDhUKgcvUOfOqOJWYohAKMvcSA== -"@apollographql/graphql-playground-html@1.6.29": - version "1.6.29" - resolved "https://registry.yarnpkg.com/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.29.tgz#a7a646614a255f62e10dcf64a7f68ead41dec453" - integrity sha512-xCcXpoz52rI4ksJSdOCxeOCn2DLocxwHf9dVT/Q90Pte1LX+LY+91SFtJF3KXVHH8kEin+g1KKCQPKBjZJfWNA== +"@apollo/utils.usagereporting@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@apollo/utils.usagereporting/-/utils.usagereporting-2.1.0.tgz#11bca6a61fcbc6e6d812004503b38916e74313f4" + integrity sha512-LPSlBrn+S17oBy5eWkrRSGb98sWmnEzo3DPTZgp8IQc8sJe0prDgDuppGq4NeQlpoqEHz0hQeYHAOA0Z3aQsxQ== dependencies: - xss "^1.0.8" + "@apollo/usage-reporting-protobuf" "^4.1.0" + "@apollo/utils.dropunuseddefinitions" "^2.0.1" + "@apollo/utils.printwithreducedwhitespace" "^2.0.1" + "@apollo/utils.removealiases" "2.0.1" + "@apollo/utils.sortast" "^2.0.1" + "@apollo/utils.stripsensitiveliterals" "^2.0.1" + +"@apollo/utils.withrequired@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@apollo/utils.withrequired/-/utils.withrequired-2.0.1.tgz#e72bc512582a6f26af150439f7eb7473b46ba874" + integrity sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA== "@asciidoctor/cli@3.5.0": version "3.5.0" @@ -1807,14 +1846,6 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.51.0.tgz#6d419c240cfb2b66da37df230f7e7eef801c32fa" integrity sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg== -"@graphql-tools/merge@8.3.1": - version "8.3.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.3.1.tgz#06121942ad28982a14635dbc87b5d488a041d722" - integrity sha512-BMm99mqdNZbEYeTPK3it9r9S6rsZsQKtlqJsSBknAclXq2pGEfOxjcIZi+kBSkHZKPKCRrYDd5vY0+rUmIHVLg== - dependencies: - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - "@graphql-tools/merge@^8.4.1": version "8.4.2" resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-8.4.2.tgz#95778bbe26b635e8d2f60ce9856b388f11fe8288" @@ -1823,27 +1854,7 @@ "@graphql-tools/utils" "^9.2.1" tslib "^2.4.0" -"@graphql-tools/mock@^8.1.2": - version "8.7.20" - resolved "https://registry.yarnpkg.com/@graphql-tools/mock/-/mock-8.7.20.tgz#c83ae0f1940d194a3982120c9c85f3ac6b4f7f20" - integrity sha512-ljcHSJWjC/ZyzpXd5cfNhPI7YljRVvabKHPzKjEs5ElxWu2cdlLGvyNYepApXDsM/OJG/2xuhGM+9GWu5gEAPQ== - dependencies: - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" - fast-json-stable-stringify "^2.1.0" - tslib "^2.4.0" - -"@graphql-tools/schema@^8.0.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-8.5.1.tgz#c2f2ff1448380919a330312399c9471db2580b58" - integrity sha512-0Esilsh0P/qYcB5DKQpiKeQs/jevzIadNTaT0jeWklPMwNbT7yMX4EqZany7mbeRRlSRwMzNzL5olyFdffHBZg== - dependencies: - "@graphql-tools/merge" "8.3.1" - "@graphql-tools/utils" "8.9.0" - tslib "^2.4.0" - value-or-promise "1.0.11" - -"@graphql-tools/schema@^9.0.18": +"@graphql-tools/schema@^9.0.0": version "9.0.19" resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" integrity sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w== @@ -1853,13 +1864,6 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/utils@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-8.9.0.tgz#c6aa5f651c9c99e1aca55510af21b56ec296cdb7" - integrity sha512-pjJIWH0XOVnYGXCqej8g/u/tsfV4LvLlj0eATKQu5zwnxd/TiTHq7Cg313qUPTFFHZ3PP5wJ15chYVtLDwaymg== - dependencies: - tslib "^2.4.0" - "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" @@ -2442,9 +2446,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2635,10 +2639,10 @@ "@napi-rs/simple-git-win32-arm64-msvc" "0.1.9" "@napi-rs/simple-git-win32-x64-msvc" "0.1.9" -"@next/env@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.4.tgz#777c3af16de2cf2f611b6c8126910062d13d222c" - integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ== +"@next/env@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.5.tgz#c26fb9784fe4eae1279c0f2906d925c2297816e9" + integrity sha512-agvIhYWp+ilbScg81s/sLueZo8CNEYLjNOqhISxheLmD/AQI4/VxV7bV76i/KzxH4iHy/va0YS9z0AOwGnw4Fg== "@next/eslint-plugin-next@12.3.4": version "12.3.4" @@ -2647,50 +2651,50 @@ dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz#241957774fef3f876dc714cfc0ca6f00f561737e" - integrity sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w== - -"@next/swc-darwin-x64@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz#fa11bb97bf06cd45cbd554354b46bf93e22c025b" - integrity sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw== - -"@next/swc-linux-arm64-gnu@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz#dd3a482cd6871ed23b049066a0f3c4c2f955dc88" - integrity sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w== - -"@next/swc-linux-arm64-musl@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz#ed6d7abaf5712cff2752ce5300d6bacc6aff1b18" - integrity sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg== - -"@next/swc-linux-x64-gnu@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz#977a040388e8a685a3a85e0dbdff90a4ee2a7189" - integrity sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg== - -"@next/swc-linux-x64-musl@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz#3e29a0ad8efc016196c3a120da04397eea328b2a" - integrity sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg== - -"@next/swc-win32-arm64-msvc@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz#18a236c3fe5a48d24b56d939e6a05488bb682b7e" - integrity sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w== - -"@next/swc-win32-ia32-msvc@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz#255132243ab6fb20d3c7c92a585e2c4fa50368fe" - integrity sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw== - -"@next/swc-win32-x64-msvc@13.5.4": - version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz#cc542907b55247c5634d9a8298e1c143a1847e25" - integrity sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg== +"@next/swc-darwin-arm64@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.5.tgz#0ab604e2ae39d9ca5d8d7190f6eedc2f63ef89a1" + integrity sha512-FvTdcJdTA7H1FGY8dKPPbf/O0oDC041/znHZwXA7liiGUhgw5hOQ+9z8tWvuz0M5a/SDjY/IRPBAb5FIFogYww== + +"@next/swc-darwin-x64@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.5.tgz#400fe2a2845998c76c0547b6605877d7ba65aa67" + integrity sha512-mTqNIecaojmyia7appVO2QggBe1Z2fdzxgn6jb3x9qlAk8yY2sy4MAcsj71kC9RlenCqDmr9vtC/ESFf110TPA== + +"@next/swc-linux-arm64-gnu@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.5.tgz#b21291e2a5b691ac426331ce6cb0b1c4e8c3e1c7" + integrity sha512-U9e+kNkfvwh/T8yo+xcslvNXgyMzPPX1IbwCwnHHFmX5ckb1Uc3XZSInNjFQEQR5xhJpB5sFdal+IiBIiLYkZA== + +"@next/swc-linux-arm64-musl@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.5.tgz#2dc33466edbe8db37f08aefd2ae472db437ac3ca" + integrity sha512-h7b58eIoNCSmKVC5fr167U0HWZ/yGLbkKD9wIller0nGdyl5zfTji0SsPKJvrG8jvKPFt2xOkVBmXlFOtuKynw== + +"@next/swc-linux-x64-gnu@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.5.tgz#3239655c97fbc13449841bc44f9b2b86c3c7ef35" + integrity sha512-6U4y21T1J6FfcpM9uqzBJicxycpB5gJKLyQ3g6KOfBzT8H1sMwfHTRrvHKB09GIn1BCRy5YJHrA1G26DzqR46w== + +"@next/swc-linux-x64-musl@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.5.tgz#60c66bc1b2c3d1f3993dd2fa55da1ff7c8247901" + integrity sha512-OuqWSAQHJQM2EsapPFTSU/FLQ0wKm7UeRNatiR/jLeCe1V02aB9xmzuWYo2Neaxxag4rss3S8fj+lvMLzwDaFA== + +"@next/swc-win32-arm64-msvc@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.5.tgz#521b3073bac7d4b89df520a61b7ae71510a0bc5c" + integrity sha512-+yLrOZIIZDY4uGn9bLOc0wTgs+M8RuOUFSUK3BhmcLav9e+tcAj0jyBHD4aXv2qWhppUeuYMsyBo1I58/eE6Dg== + +"@next/swc-win32-ia32-msvc@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.5.tgz#a21e29a57bd0534c646ba3e6d73191064f396b96" + integrity sha512-SyMxXyJtf9ScMH0Dh87THJMXNFvfkRAk841xyW9SeOX3KxM1buXX3hN7vof4kMGk0Yg996OGsX+7C9ueS8ugsw== + +"@next/swc-win32-x64-msvc@13.5.5": + version "13.5.5" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.5.tgz#7a442ee669dd6b0e5c774a86cd98457cd945c867" + integrity sha512-n5KVf2Ok0BbLwofAaHiiKf+BQCj1M8WmTujiER4/qzYAVngnsNSjqEWvJ03raeN9eURqxDO+yL5VRoDrR33H9A== "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -2731,13 +2735,13 @@ fastq "^1.6.0" "@peculiar/asn1-schema@^2.3.6": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" - integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== + version "2.3.8" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz#04b38832a814e25731232dd5be883460a156da3b" + integrity sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA== dependencies: asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" + pvtsutils "^1.3.5" + tslib "^2.6.2" "@peculiar/json-schema@^1.1.12": version "1.1.12" @@ -2784,6 +2788,7 @@ version "0.6.1-prerelease" dependencies: "@apollo/client" "3.7.10" + "@apollo/server" "^4.9.4" "@holochain/client" "0.16.0" "@types/jest" "^26.0.14" class-validator "^0.13.1" @@ -2846,6 +2851,7 @@ version "0.6.1-prerelease" dependencies: "@apollo/client" "3.7.10" + "@apollo/server" "^4.9.4" "@holochain/client" "0.16.0" "@types/jest" "^26.0.14" class-validator "^0.13.1" @@ -2972,10 +2978,10 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@remix-run/router@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6" - integrity sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA== +"@remix-run/router@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.10.0.tgz#e2170dc2049b06e65bbe883adad0e8ddf8291278" + integrity sha512-Lm+fYpMfZoEucJ7cMxgt4dYt8jLfbpwRCzAjm9UgSLOkmlqo9gupxt6YX3DY0Fk155NT9l17d/ydi+964uS9Lw== "@rollup/plugin-alias@^3.1.5": version "3.1.9" @@ -3529,9 +3535,9 @@ defer-to-connect "^2.0.0" "@tauri-apps/api@^1.2.0", "@tauri-apps/api@^1.4.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.5.0.tgz#46a0f9b6edd4bfc39be32afc4ad242e0b8cca3ea" - integrity sha512-yQY9wpVNuiYhLLuyDlu1nBpqJELT1fGp7OctN4rW9I2W1T2p7A3tqPxsEzQprEwneQRBAlPM9vC8NsnMbct+pg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.5.1.tgz#9074476c4323f71351db624e9711c99277cdfb99" + integrity sha512-6unsZDOdlXTmauU3NhWhn+Cx0rODV+rvNvTdvolE5Kls5ybA6cqndQENDt1+FS0tF7ozCP66jwWoH6a5h90BrA== "@tauri-apps/cli-darwin-arm64@1.4.0": version "1.4.0" @@ -3826,13 +3832,6 @@ resolved "https://registry.yarnpkg.com/@tsconfig/svelte/-/svelte-1.0.13.tgz#2fa34376627192c0d643ce54964915e2bd3a58e4" integrity sha512-5lYJP45Xllo4yE/RUBccBT32eBlRDbqN8r1/MIvQbKxW3aFqaYPCNgm8D5V20X4ShHcwvYWNlKg3liDh1MlBoA== -"@types/accepts@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" - integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== - dependencies: - "@types/node" "*" - "@types/acorn@^4.0.0": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" @@ -3841,14 +3840,14 @@ "@types/estree" "*" "@types/aria-query@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.2.tgz#6f1225829d89794fd9f891989c9ce667422d7f64" - integrity sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ== + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.3.tgz#07570ebd25f9b516c910a91f7244052c9b58eabc" + integrity sha512-0Z6Tr7wjKJIk4OUEjVUQMtyunLDy339vcMaj38Kpj6jM2OE1p3S4kXExKZ7a3uXQAPCoy3sbrP1wibDKaf39oA== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.7": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" - integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778" + integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -3857,47 +3856,39 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.5" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" - integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== + version "7.6.6" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" + integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" - integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" + integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" - integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" + integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== dependencies: "@babel/types" "^7.20.7" "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/body-parser@1.19.2": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + version "3.5.12" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" + integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== dependencies: "@types/node" "*" @@ -3912,88 +3903,83 @@ "@types/responselike" "^1.0.0" "@types/chai-as-promised@*": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1" - integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.7.tgz#fd16a981ba9542c83d4e1d2f40c7899aae82aa38" + integrity sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw== dependencies: "@types/chai" "*" "@types/chai@*": - version "4.3.8" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.8.tgz#aa200a264a3bc78ccfc1718eedbd3b9d5a591270" - integrity sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA== + version "4.3.9" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.9.tgz#144d762491967db8c6dea38e03d2206c2623feec" + integrity sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg== "@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" + integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== dependencies: "@types/node" "*" -"@types/cors@2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - "@types/d3-scale-chromatic@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#103124777e8cdec85b20b51fd3397c682ee1e954" - integrity sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.1.tgz#646c8cf9ce869fd316a5180bb7f862efa4e74123" + integrity sha512-Ob7OrwiTeQXY/WBBbRHGZBOn6rH1h7y3jjpTSKYqDEeqFjktql6k2XSgNwLrLDmAsXhEn8P9NHDY4VTuo0ZY1w== "@types/d3-scale@^4.0.3": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.5.tgz#daa4faa5438315a37a1f5eb1bcdc5aeb3d3e5a2d" - integrity sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA== + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.6.tgz#9d221949f37b90b52696ec99f9b1e972d55fe10d" + integrity sha512-lo3oMLSiqsQUovv8j15X4BNEDOsnHuGjeVg7GRbAuB2PUa1prK5BNSOu6xixgNf3nqxPl4I1BqJWrPvFGlQoGQ== dependencies: "@types/d3-time" "*" "@types/d3-time@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.1.tgz#f0c8f9037632cc4511ae55e7e1459dcb95fb3619" - integrity sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.2.tgz#f4425b2ebcb04495a7b2390da03633ef1a8adbe5" + integrity sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg== "@types/debug@^4.0.0": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005" - integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" + integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== dependencies: "@types/ms" "*" "@types/eslint-scope@^3.7.3": - version "3.7.5" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz#e28b09dbb1d9d35fdfa8a884225f00440dfc5a3e" - integrity sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.44.4" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.4.tgz#28eaff82e1ca0a96554ec5bb0188f10ae1a74c2f" - integrity sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA== + version "8.44.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.5.tgz#24d7f3b07aff47a13b570efd5c52d96f38cd352e" + integrity sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree-jsx@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.1.tgz#cc26c8566c67f27795bbc025f57cf0499d7cedd6" - integrity sha512-sHyakZlAezNFxmYRo0fopDZW+XvK6ipeZkkp5EAOLjdPfZp8VjZBJ67vSRI99RSCAoqXVmXOHS4fnWoxpuGQtQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.2.tgz#758bcb4f35f2a970362b2bd2b7021fe2ae6e8509" + integrity sha512-GNBWlGBMjiiiL5TSkvPtOteuXsiVitw5MYGY1UYlrAq0SKyczsls6sCD7TZ8fsjRsvCVxml7EbyjJezPb3DrSA== dependencies: "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.1": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" - integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== "@types/estree@0.0.39": version "0.0.39" @@ -4007,45 +3993,26 @@ dependencies: expect "*" -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18", "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.30", "@types/express-serve-static-core@^4.17.33": + version "4.17.38" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.38.tgz#d9c1d3a134a1226d84ec8e40c182f960f969d5a4" + integrity sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express-serve-static-core@4.17.31": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/express@*", "@types/express@^4.17.13", "@types/express@^4.17.8": - version "4.17.19" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.19.tgz#6ff9b4851fda132c5d3dcd2f89fdb6a7a0031ced" - integrity sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" -"@types/express@4.17.14": - version "4.17.14" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" - integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/faker@^5.5.7": version "5.5.9" resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.5.9.tgz#588ede92186dc557bff8341d294335d50d255f0c" @@ -4067,23 +4034,23 @@ "@types/node" "*" "@types/graceful-fs@^4.1.2": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.7.tgz#30443a2e64fd51113bc3e2ba0914d47109695e2a" - integrity sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915" + integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw== dependencies: "@types/node" "*" "@types/hast@^2.0.0": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" - integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + version "2.3.7" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.7.tgz#5e9bd7ab4452d5313aeec9d38fbc193a70f8d810" + integrity sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw== dependencies: "@types/unist" "^2" "@types/hast@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.1.tgz#e1705ec9258ac4885659c2d50bac06b4fcd16466" - integrity sha512-hs/iBJx2aydugBQx5ETV3ZgeSS0oIreQrFJ4bjBl0XvM4wAmDjFEALY7p0rTSLt2eL+ibjRAAs9dTPiCLtmbqQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.2.tgz#e6c1126a33955cb9493a5074ddf1873fb48248c7" + integrity sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw== dependencies: "@types/unist" "*" @@ -4093,52 +4060,52 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" - integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#a3ff232bf7d5c55f38e4e45693eda2ebb545794d" + integrity sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA== "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== "@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + version "1.17.13" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" + integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== dependencies: "@types/node" "*" "@types/is-ci@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.2.tgz#62acd24fc99bf31047086e0f6b1a657919837f15" - integrity sha512-9PyP1rgCro6xO3R7zOEoMgx5U9HpLhIg1FFb9p2mWX/x5QI8KMuCWWYtCT1dUQpicp84OsxEAw3iqwIKQY5Pog== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/is-ci/-/is-ci-3.0.3.tgz#6042f2fe12a16b2616deabb11d9a422f46a2ec03" + integrity sha512-FdHbjLiN2e8fk9QYQyVYZrK8svUDJpxSaSWLUga8EZS1RGAvvrqM9zbVARBtQuYPeLgnJxM2xloOswPwj1o2cQ== dependencies: ci-info "^3.1.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== "@types/istanbul-lib-report@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#412e0725ef41cde73bfa03e0e833eaff41e0fd63" - integrity sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1" + integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz#edc8e421991a3b4df875036d381fc0a5a982f549" - integrity sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7" + integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@*": - version "29.5.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.5.tgz#727204e06228fe24373df9bae76b90f3e8236a2a" - integrity sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg== + version "29.5.6" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.6.tgz#f4cf7ef1b5b0bfc1aa744e41b24d9cc52533130b" + integrity sha512-/t9NnzkOpXb4Nfvg17ieHE6EeSjDS2SGSpNYfoLbUAeL/EOueU/RSdOWFpfQTXBEM7BguYW1XQ0EbM+6RlIh6w== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -4160,19 +4127,19 @@ pretty-format "^27.0.0" "@types/js-yaml@^4.0.0", "@types/js-yaml@^4.0.2": - version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.7.tgz#f11c2ec37bb748fa5cfa3262abcb8b1cfd83d8ae" - integrity sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg== + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.8.tgz#7574e422d70d4a1b41f517d1d9abc61be2299a97" + integrity sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA== "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json-stable-stringify@^1.0.33": - version "1.0.34" - resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" - integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== + version "1.0.35" + resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.35.tgz#9cea8628b50a093ae00a7e73de49676f2f9ade27" + integrity sha512-zlCWqsRBI0+ANN7dzGeDFJ4CHaVFTLqBNRS11GjR2mHCW6XxNtnMxhQzBKMzfsnjI8oI+kWq2vBwinyQpZVSsg== "@types/json5@^0.0.29": version "0.0.29" @@ -4180,9 +4147,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/katex@^0.16.0": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.3.tgz#a341c89705145b7dd8e2a133b282a133eabe6076" - integrity sha512-CeVMX9EhVUW8MWnei05eIRks4D5Wscw/W9Byz1s3PA+yJvcdvq9SaDjiUKvRvEgjpdTyJMjQA43ae4KTwsvOPg== + version "0.16.4" + resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.4.tgz#f2cff66aadc7f475993201f4fdae4b2362150434" + integrity sha512-v7xrnafkJM59tHmNGhVxTfXiYcak2I1lbb3ux29fuMHUKxOz9+3bTT7w84qsFI87u42B7IjBLkOlHKrrhoHzUA== "@types/keyv@^3.1.1", "@types/keyv@^3.1.4": version "3.1.4" @@ -4192,9 +4159,9 @@ "@types/node" "*" "@types/lodash@*": - version "4.14.199" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" - integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== + version "4.14.200" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.200.tgz#435b6035c7eba9cdf1e039af8212c9e9281e7149" + integrity sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q== "@types/long@^4.0.0": version "4.0.2" @@ -4202,23 +4169,23 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/lowdb@^1.0.11": - version "1.0.12" - resolved "https://registry.yarnpkg.com/@types/lowdb/-/lowdb-1.0.12.tgz#e9828264cb5cc5ccd5462c437a9a625d34088f7f" - integrity sha512-m/hOfY7nuwo9V3yApvR6aJ3uZP6iNC74S7Bx5BWz0L7IrzjKyzUur/jEdlYWBWWVjmkCz+ECK9nk8UJoQa8aZw== + version "1.0.13" + resolved "https://registry.yarnpkg.com/@types/lowdb/-/lowdb-1.0.13.tgz#0c7be910eb4a0b83cec9bed7e147eeb88780aa1a" + integrity sha512-IBQwi4NYT7bxWtzsQzvXTGTPC52w3brUwuzPE2oghVCeNBvp9MWHpIBqw+Igd4SrmcBjiT9K0E78Ia7+Ml7EwA== dependencies: "@types/lodash" "*" "@types/mdast@^3.0.0": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.13.tgz#b7ba6e52d0faeb9c493e32c205f3831022be4e1b" - integrity sha512-HjiGiWedR0DVFkeNljpa6Lv4/IZU1+30VY5d747K7lBudFc3R0Ibr6yJ9lN3BE28VnZyDfLF/VB1Ql1ZIbKrmg== + version "3.0.14" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" + integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== dependencies: "@types/unist" "^2" "@types/mdast@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.1.tgz#9c45e60a04e79f160dcefe6545d28ae536a6ed22" - integrity sha512-IlKct1rUTJ1T81d8OHzyop15kGv9A/ff7Gz7IJgrk6jDb4Udw77pCJ+vq8oxZf4Ghpm+616+i1s/LNg/Vh7d+g== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.2.tgz#4695661024ffbd9e52cf71e05c69a1f08c0792f6" + integrity sha512-tYR83EignvhYO9iU3kDg8V28M0jqyh9zzp5GV+EO+AYnyUl3P5ltkTeJuTiFZQFz670FSb3EwT/6LQdX+UdKfw== dependencies: "@types/unist" "*" @@ -4243,32 +4210,32 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.3.tgz#dd249cef80c6fff2ba6a0d4e5beca913e04e25f8" - integrity sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" + integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== "@types/mocha@*", "@types/mocha@^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.2.tgz#96d63314255540a36bf24da094cce7a13668d73b" - integrity sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w== + version "10.0.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812" + integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ== "@types/ms@*": - version "0.7.32" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab" - integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g== + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" + integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== "@types/node-fetch@^2.5.11", "@types/node-fetch@^2.6.1": - version "2.6.6" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.6.tgz#b72f3f4bc0c0afee1c0bc9cff68e041d01e3e779" - integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== + version "2.6.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.7.tgz#a1abe2ce24228b58ad97f99480fdcf9bbc6ab16d" + integrity sha512-lX17GZVpJ/fuCjguZ5b3TjEbSENxmEk1B2z02yoXSK9WMEWRivhdSY73wWMn6bpcCDAOh6qAdktpKHIlkDk2lg== dependencies: "@types/node" "*" form-data "^4.0.0" "@types/node@*", "@types/node@>=6": - version "20.8.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.6.tgz#0dbd4ebcc82ad0128df05d0e6f57e05359ee47fa" - integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== dependencies: undici-types "~5.25.1" @@ -4277,11 +4244,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.10.tgz#4c64759f3c2343b7e6c4b9caf761c7a3a05cee34" integrity sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ== -"@types/node@^10.1.0": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - "@types/node@^12.7.1": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" @@ -4293,24 +4255,24 @@ integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== "@types/node@^16.11.26": - version "16.18.58" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.58.tgz#bf66f63983104ed57c754f4e84ccaf16f8235adb" - integrity sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA== + version "16.18.59" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.59.tgz#4cdbd631be6d9be266a96fb17b5d0d7ad6bbe26c" + integrity sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ== "@types/node@^18.0.0": - version "18.18.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.5.tgz#afc0fd975df946d6e1add5bbf98264225b212244" - integrity sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A== + version "18.18.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.6.tgz#26da694f75cdb057750f49d099da5e3f3824cb3e" + integrity sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w== "@types/normalize-package-data@^2.4.0": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz#9b0e3e8533fe5024ad32d6637eb9589988b6fdca" - integrity sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.1.tgz#27f7559836ad796cea31acb63163b203756a5b4e" + integrity sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng== "@types/prettier@^2.0.0", "@types/prettier@^2.1.5": version "2.7.3" @@ -4318,29 +4280,29 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": - version "15.7.8" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.8.tgz#805eae6e8f41bd19e88917d2ea200dc992f405d3" - integrity sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ== + version "15.7.9" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== "@types/pug@^2.0.4": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.7.tgz#ffb9239e4da7ea1af27070cad9343049e440993d" - integrity sha512-I469DU0UXNC1aHepwirWhu9YKg5fkxohZD95Ey/5A7lovC+Siu+MCLffva87lnfThaOrw9Vb1DUN5t55oULAAw== + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.8.tgz#1a85ecb760f7472d9ec3bab19bfe17454c69499d" + integrity sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ== "@types/q@^1.5.1": - version "1.5.6" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.6.tgz#a6edffe8283910e46dc7a573621f928e6b47fa56" - integrity sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ== + version "1.5.7" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.7.tgz#5fe8cf91556bfb310d17f2e2b4263a7c12c2c2ca" + integrity sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/range-parser@*": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.5.tgz#38bd1733ae299620771bd414837ade2e57757498" - integrity sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== "@types/react-dom@<18.0.0": version "17.0.21" @@ -4357,18 +4319,18 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16": - version "18.2.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.28.tgz#86877465c0fcf751659a36c769ecedfcfacee332" - integrity sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg== + version "18.2.29" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.29.tgz#88b48a287e00f6fdcd6f95662878fb701ae18b27" + integrity sha512-Z+ZrIRocWtdD70j45izShRwDuiB4JZqDegqMFW/I8aG5DxxLKOzVNoq62UIO82v9bdgi+DO1jvsb9sTEZUSm+Q== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17", "@types/react@^17.0.40": - version "17.0.68" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.68.tgz#99b17f567e258f5e7be855a281ac67b49a34f9f2" - integrity sha512-y8heXejd/Gi43S28GOqIFmr6BzhLa3anMlPojRu4rHh3MtRrrpB+BtLEcqP3XPO1urXByzBdkOLU7sodYWnpkA== + version "17.0.69" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.69.tgz#245a0cf2f5b0fb1d645691d3083e3c7d4409b98f" + integrity sha512-klEeru//GhiQvXUBayz0Q4l3rKHWsBR/EUOhOeow6hK2jV7MlO44+8yEk6+OtPeOlRfnpUnrLXzGK+iGph5aeg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -4387,9 +4349,9 @@ integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== "@types/responselike@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.1.tgz#1dd57e54509b3b95c7958e52709567077019d65d" - integrity sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.2.tgz#8de1b0477fd7c12df77e50832fa51701a8414bd6" + integrity sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA== dependencies: "@types/node" "*" @@ -4411,9 +4373,9 @@ integrity sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ== "@types/secp256k1@^4.0.3": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.4.tgz#33c760de627fce1f449c2d4270da07e4da54c830" - integrity sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.5.tgz#14b1766b4fbc198b0af5599d9fd21c89056633ce" + integrity sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA== dependencies: "@types/node" "*" @@ -4423,59 +4385,59 @@ integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/send@*": - version "0.17.2" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.2.tgz#af78a4495e3c2b79bfbdac3955fdd50e03cc98f2" - integrity sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw== + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" - integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" + integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.3" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" - integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sha256@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@types/sha256/-/sha256-0.2.0.tgz#e91194d70f4eb67f08812e847feecf5146f4afdd" - integrity sha512-QYMr6HuxTQunFWRLZpGopbkgQFoFWOmKTBGgNSYiWMqU/CWnQSTo3edyHvgsRXsOWtOSOG/cmDptPzgCeOsQGw== + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/sha256/-/sha256-0.2.1.tgz#7b6e347e0882fccb9f4ad6acb4a2c80ae847e399" + integrity sha512-ValOc4t7kVBoKo7FcySlX57AAJjr9bJDwqSziAcVXeTw6G8co0oOTKa3NtvixKnMDaDYV+8txMJ8sJ79gg+FTg== dependencies: "@types/node" "*" "@types/sinon@*": - version "10.0.19" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.19.tgz#752b752bc40bb5af0bb1aec29bde49b139b91d35" - integrity sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ== + version "10.0.20" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.20.tgz#f1585debf4c0d99f9938f4111e5479fb74865146" + integrity sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg== dependencies: "@types/sinonjs__fake-timers" "*" "@types/sinonjs__fake-timers@*": - version "8.1.3" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz#575789c5cf6d410cb288b0b4affaf7e6da44ca51" - integrity sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ== + version "8.1.4" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz#663bb44e01f6bae4eaae3719d8b037411217c992" + integrity sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ== "@types/sockjs@^0.3.33": - version "0.3.34" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" - integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== + version "0.3.35" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" + integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== dependencies: "@types/node" "*" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b" + integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw== "@types/testing-library__jest-dom@^5.9.1": version "5.14.9" @@ -4884,7 +4846,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@^1.3.5, accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -5197,14 +5159,6 @@ apollo-client@^2.6.10: tslib "^1.10.0" zen-observable "^0.8.0" -apollo-datasource@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-3.3.2.tgz#5711f8b38d4b7b53fb788cb4dbd4a6a526ea74c8" - integrity sha512-L5TiS8E2Hn/Yz7SSnWIVbZw0ZfEIXZCa5VUiVxD9P53JvSrf4aStvsFDlGWPvpIdCR+aly2CfoB79B9/JjKFqg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - apollo-server-env "^4.2.1" - apollo-link-error@^1.0.3: version "1.1.13" resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd" @@ -5242,117 +5196,6 @@ apollo-link@^1.0.0, apollo-link@^1.0.6, apollo-link@^1.2.14: tslib "^1.9.3" zen-observable-ts "^0.8.21" -apollo-reporting-protobuf@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/apollo-reporting-protobuf/-/apollo-reporting-protobuf-3.4.0.tgz#6edd31f09d4a3704d9e808d1db30eca2229ded26" - integrity sha512-h0u3EbC/9RpihWOmcSsvTW2O6RXVaD/mPEjfrPkxRPTEPWqncsgOoRJw+wih4OqfH3PvTJvoEIf4LwKrUaqWog== - dependencies: - "@apollo/protobufjs" "1.2.6" - -apollo-server-core@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.12.0.tgz#8aa2a7329ce6fe1823290c45168c749db01548df" - integrity sha512-hq7iH6Cgldgmnjs9FVSZeKWRpi0/ZR+iJ1arzeD2VXGxxgk1mAm/cz1Tx0TYgegZI+FvvrRl0UhKEx7sLnIxIg== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - "@apollo/utils.usagereporting" "^1.0.0" - "@apollographql/apollo-tools" "^0.5.3" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.2" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.7.2" - apollo-server-types "^3.8.0" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - node-abort-controller "^3.0.1" - sha.js "^2.4.11" - uuid "^9.0.0" - whatwg-mimetype "^3.0.0" - -apollo-server-core@^3.12.0: - version "3.12.1" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.12.1.tgz#ba255c37345db29c48a2e0c064c519a8d62eb5af" - integrity sha512-9SF5WAkkV0FZQ2HVUWI9Jada1U0jg7e8NCN9EklbtvaCeUlOLyXyM+KCWuZ7+dqHxjshbtcwylPHutt3uzoNkw== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - "@apollo/utils.usagereporting" "^1.0.0" - "@apollographql/apollo-tools" "^0.5.3" - "@apollographql/graphql-playground-html" "1.6.29" - "@graphql-tools/mock" "^8.1.2" - "@graphql-tools/schema" "^8.0.0" - "@josephg/resolvable" "^1.0.0" - apollo-datasource "^3.3.2" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - apollo-server-errors "^3.3.1" - apollo-server-plugin-base "^3.7.2" - apollo-server-types "^3.8.0" - async-retry "^1.2.1" - fast-json-stable-stringify "^2.1.0" - graphql-tag "^2.11.0" - loglevel "^1.6.8" - lru-cache "^6.0.0" - node-abort-controller "^3.0.1" - sha.js "^2.4.11" - uuid "^9.0.0" - whatwg-mimetype "^3.0.0" - -apollo-server-env@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/apollo-server-env/-/apollo-server-env-4.2.1.tgz#ea5b1944accdbdba311f179e4dfaeca482c20185" - integrity sha512-vm/7c7ld+zFMxibzqZ7SSa5tBENc4B0uye9LTfjJwGoQFY5xsUPH5FpO5j0bMUDZ8YYNbrF9SNtzc5Cngcr90g== - dependencies: - node-fetch "^2.6.7" - -apollo-server-errors@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-3.3.1.tgz#ba5c00cdaa33d4cbd09779f8cb6f47475d1cd655" - integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== - -apollo-server-express@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-3.12.0.tgz#a6e392bb0427544b8c7e5d841ef07f7691b0c105" - integrity sha512-m8FaGPUfDOEGSm7QRWRmUUGjG/vqvpQoorkId9/FXkC57fz/A59kEdrzkMt9538Xgsa5AV+X4MEWLJhTvlW3LQ== - dependencies: - "@types/accepts" "^1.3.5" - "@types/body-parser" "1.19.2" - "@types/cors" "2.8.12" - "@types/express" "4.17.14" - "@types/express-serve-static-core" "4.17.31" - accepts "^1.3.5" - apollo-server-core "^3.12.0" - apollo-server-types "^3.8.0" - body-parser "^1.19.0" - cors "^2.8.5" - parseurl "^1.3.3" - -apollo-server-plugin-base@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/apollo-server-plugin-base/-/apollo-server-plugin-base-3.7.2.tgz#c19cd137bc4c993ba2490ba2b571b0f3ce60a0cd" - integrity sha512-wE8dwGDvBOGehSsPTRZ8P/33Jan6/PmL0y0aN/1Z5a5GcbFhDaaJCjK5cav6npbbGL2DPKK0r6MPXi3k3N45aw== - dependencies: - apollo-server-types "^3.8.0" - -apollo-server-types@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/apollo-server-types/-/apollo-server-types-3.8.0.tgz#d976b6967878681f715fe2b9e4dad9ba86b1346f" - integrity sha512-ZI/8rTE4ww8BHktsVpb91Sdq7Cb71rdSkXELSwdSR0eXu600/sY+1UXhTWdiJvk+Eq5ljqoHLwLbY2+Clq2b9A== - dependencies: - "@apollo/utils.keyvaluecache" "^1.0.1" - "@apollo/utils.logger" "^1.0.0" - apollo-reporting-protobuf "^3.4.0" - apollo-server-env "^4.2.1" - apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" @@ -5365,7 +5208,6 @@ apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: "appdata-path@github:perspect3vism/appdata-path", appdata-path@perspect3vism/appdata-path: version "1.0.0" - uid "6304ea16cbfebc98749c33941d643c3046b45985" resolved "https://codeload.github.com/perspect3vism/appdata-path/tar.gz/6304ea16cbfebc98749c33941d643c3046b45985" aproba@^1.0.3: @@ -6142,7 +5984,7 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" -body-parser@^1.19.0: +body-parser@^1.20.0: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== @@ -6649,9 +6491,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001549" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz#7d1a3dce7ea78c06ed72c32c2743ea364b3615aa" - integrity sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA== + version "1.0.30001550" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz#6ec6a2239eb2a8123cc26cfe0571db5c79eb8669" + integrity sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ== canonicalize@^1.0.1, canonicalize@^1.0.3: version "1.0.8" @@ -6932,7 +6774,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.1.0, ci-info@^3.2.0: +ci-info@^3.1.0, ci-info@^3.2.0, ci-info@^3.7.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -7225,7 +7067,7 @@ commander@7, commander@^7.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^2.15.0, commander@^2.20.0, commander@^2.20.3: +commander@^2.15.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -7812,11 +7654,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssfilter@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" - integrity sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw== - cssnano-preset-default@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" @@ -8959,9 +8796,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.535: - version "1.4.554" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.554.tgz#04e09c2ee31dc0f1546174033809b54cc372740b" - integrity sha512-Q0umzPJjfBrrj8unkONTgbKQXzXRrH7sVV7D9ea2yBV3Oaogz991yhbpfvo2LMNkJItmruXTEzVpP9cp7vaIiQ== + version "1.4.557" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz#f3941b569c82b7bb909411855c6ff9bfe1507829" + integrity sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw== electron@^20.0.3: version "20.3.12" @@ -10034,7 +9871,7 @@ expect@^27.5.1: jest-matcher-utils "^27.5.1" jest-message-util "^27.5.1" -express@4.18.2, express@^4.17.3: +express@4.18.2, express@^4.17.1, express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== @@ -11061,7 +10898,7 @@ graphql-subscriptions@^1.1.0: dependencies: iterall "^1.3.0" -graphql-tag@^2.11.0, graphql-tag@^2.12.6, graphql-tag@^2.4.2: +graphql-tag@^2.12.6, graphql-tag@^2.4.2: version "2.12.6" resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== @@ -13829,7 +13666,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.1, json-stable-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== @@ -14100,9 +13937,9 @@ levn@~0.3.0: type-check "~0.3.2" libphonenumber-js@^1.9.43: - version "1.10.47" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.47.tgz#1efdf08306960a222703e575e78eb76458944012" - integrity sha512-b4t7VQDV29xx/ni+58yl9KWPGjnDLDXCeCTLrD4V8vDpObXZRZBrg7uX/HWZ7YXiJKqdBDGgc+barUUTNB6Slw== + version "1.10.48" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.10.48.tgz#3c426b4aa21dfe3210bfbda47d208acffa3631bf" + integrity sha512-Vvcgt4+o8+puIBJZLdMshPYx9nRN3/kTT7HPtOyfYrSQuN9PGBF1KUv0g07fjNzt4E4GuA7FnsLb+WeAMzyRQg== libsodium-wrappers@^0.7.11: version "0.7.13" @@ -14451,11 +14288,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -"lru-cache@7.10.1 - 7.13.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" - integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== - lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -14478,6 +14310,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.10.1, lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + lru_map@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.4.1.tgz#f7b4046283c79fb7370c36f8fca6aee4324b0a98" @@ -15894,7 +15731,7 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -15954,11 +15791,11 @@ next-themes@^0.2.1: integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== next@^13.0.6: - version "13.5.4" - resolved "https://registry.yarnpkg.com/next/-/next-13.5.4.tgz#7e6a93c9c2b9a2c78bf6906a6c5cc73ae02d5b4d" - integrity sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA== + version "13.5.5" + resolved "https://registry.yarnpkg.com/next/-/next-13.5.5.tgz#65addd98a1ae42845d455e08bc491448bb34929b" + integrity sha512-LddFJjpfrtrMMw8Q9VLhIURuSidiCNcMQjRqcPtrKd+Fx07MsG7hYndJb/f2d3I+mTbTotsTJfCnn0eZ/YPk8w== dependencies: - "@next/env" "13.5.4" + "@next/env" "13.5.5" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" @@ -15966,15 +15803,15 @@ next@^13.0.6: styled-jsx "5.1.1" watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "13.5.4" - "@next/swc-darwin-x64" "13.5.4" - "@next/swc-linux-arm64-gnu" "13.5.4" - "@next/swc-linux-arm64-musl" "13.5.4" - "@next/swc-linux-x64-gnu" "13.5.4" - "@next/swc-linux-x64-musl" "13.5.4" - "@next/swc-win32-arm64-msvc" "13.5.4" - "@next/swc-win32-ia32-msvc" "13.5.4" - "@next/swc-win32-x64-msvc" "13.5.4" + "@next/swc-darwin-arm64" "13.5.5" + "@next/swc-darwin-x64" "13.5.5" + "@next/swc-linux-arm64-gnu" "13.5.5" + "@next/swc-linux-arm64-musl" "13.5.5" + "@next/swc-linux-x64-gnu" "13.5.5" + "@next/swc-linux-x64-musl" "13.5.5" + "@next/swc-win32-arm64-msvc" "13.5.5" + "@next/swc-win32-ia32-msvc" "13.5.5" + "@next/swc-win32-x64-msvc" "13.5.5" nextra-theme-docs@latest: version "2.13.2" @@ -16051,7 +15888,7 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-abort-controller@^3.0.1: +node-abort-controller@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== @@ -16950,7 +16787,7 @@ parse5@^7.0.0: dependencies: entities "^4.4.0" -parseurl@^1.3.3, parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -16988,6 +16825,27 @@ patch-package@^6.5.0: tmp "^0.0.33" yaml "^1.10.2" +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -18299,7 +18157,7 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -pvtsutils@^1.3.2: +pvtsutils@^1.3.2, pvtsutils@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== @@ -18533,19 +18391,19 @@ react-refresh@^0.11.0: integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-router-dom@^6.3.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.16.0.tgz#86f24658da35eb66727e75ecbb1a029e33ee39d9" - integrity sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg== + version "6.17.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.17.0.tgz#ea73f89186546c1cf72b10fcb7356d874321b2ad" + integrity sha512-qWHkkbXQX+6li0COUUPKAUkxjNNqPJuiBd27dVwQGDNsuFBdMbrS6UZ0CLYc4CsbdLYTckn4oB4tGDuPZpPhaQ== dependencies: - "@remix-run/router" "1.9.0" - react-router "6.16.0" + "@remix-run/router" "1.10.0" + react-router "6.17.0" -react-router@6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.16.0.tgz#abbf3d5bdc9c108c9b822a18be10ee004096fb81" - integrity sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA== +react-router@6.17.0: + version "6.17.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.17.0.tgz#7b680c4cefbc425b57537eb9c73bedecbdc67c1e" + integrity sha512-YJR3OTJzi3zhqeJYADHANCGPUu9J+6fT5GLv82UWRGSxu6oJYCKVmxUcaBQuGm9udpWmPsvpme/CdHumqgsoaA== dependencies: - "@remix-run/router" "1.9.0" + "@remix-run/router" "1.10.0" react-scripts@^5.0.1: version "5.0.1" @@ -19459,9 +19317,9 @@ sass-loader@^12.3.0: neo-async "^2.6.2" sass@*: - version "1.69.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.3.tgz#f8a0c488697e6419519834a13335e7b65a609c11" - integrity sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ== + version "1.69.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2" + integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -19820,9 +19678,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" sinon@*: - version "16.1.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.0.tgz#645b836563c9bedb21defdbe48831cb2afb687f2" - integrity sha512-ZSgzF0vwmoa8pq0GEynqfdnpEDyP1PkYmEChnkjW0Vyh8IDlyFEJ+fkMhCP0il6d5cJjPl2PUsnUSAuP5sttOQ== + version "16.1.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-16.1.1.tgz#2aee7c0b2ebcf2523b66599e79922e367a907dab" + integrity sha512-tu0DS1g4Rm2xHT9mWK5g5aTogTXWwGGz3fQK/L5fnECPkcAQ3YcbAbJ4XxOkpDDnV4EV5n+lee5neq5QyVxoSg== dependencies: "@sinonjs/commons" "^3.0.0" "@sinonjs/fake-timers" "^10.3.0" @@ -21171,7 +21029,7 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -21988,11 +21846,6 @@ validator@^13.7.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== -value-or-promise@1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" - integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== - value-or-promise@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" @@ -22088,9 +21941,9 @@ vfile@^6.0.0: vfile-message "^4.0.0" vite@^4.0.1, vite@^4.1.1: - version "4.4.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.11.tgz#babdb055b08c69cfc4c468072a2e6c9ca62102b0" - integrity sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A== + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -22761,14 +22614,6 @@ xmlhttprequest@^1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== -xss@^1.0.8: - version "1.0.14" - resolved "https://registry.yarnpkg.com/xss/-/xss-1.0.14.tgz#4f3efbde75ad0d82e9921cc3c95e6590dd336694" - integrity sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw== - dependencies: - commander "^2.20.3" - cssfilter "0.0.10" - xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -22804,7 +22649,7 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.1: +yaml@^2.1.1, yaml@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== From 12b54576f62af1799bb1b70d80643df82385f433 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Wed, 18 Oct 2023 22:37:30 +0530 Subject: [PATCH 73/87] Update get-builtin-test-lang script to work on deno --- tests/js/package.json | 6 +++--- tests/js/scripts/get-builtin-test-langs.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/js/package.json b/tests/js/package.json index d6cb5a226..2a6e071b5 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -14,9 +14,9 @@ "test-auth": "ts-mocha -p tsconfig.json --timeout 1200000 --exit tests/authentication.test.ts", "test-prolog-and-literals": "ts-mocha -p tsconfig.json --timeout 1200000 --exit tests/prolog-and-literals.test.ts", "prepare-test": "run-script-os", - "prepare-test:macos": "./scripts/build-test-language.sh && ./scripts/prepareTestDirectory.sh && node scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", - "prepare-test:linux": "./scripts/build-test-language.sh && ./scripts/prepareTestDirectory.sh && node scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", - "prepare-test:windows": "powershell -ExecutionPolicy Bypass -File ./scripts/build-test-language.ps1 && powershell -ExecutionPolicy Bypass -File ./scripts/prepareTestDirectory.ps1 && node scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", + "prepare-test:macos": "./scripts/build-test-language.sh && ./scripts/prepareTestDirectory.sh && deno run --allow-all scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", + "prepare-test:linux": "./scripts/build-test-language.sh && ./scripts/prepareTestDirectory.sh && deno run --allow-all scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", + "prepare-test:windows": "powershell -ExecutionPolicy Bypass -File ./scripts/build-test-language.ps1 && powershell -ExecutionPolicy Bypass -File ./scripts/prepareTestDirectory.ps1 && deno run --allow-all scripts/get-builtin-test-langs.js && yarn run inject-language-language && yarn run publish-test-languages && yarn run inject-publishing-agent", "inject-language-language": "node scripts/injectLanguageLanguageBundle.js", "inject-publishing-agent": "node scripts/injectPublishingAgent.js", "publish-test-languages": "ts-node-esm --experimental-specifier-resolution=node --files ./utils/publishTestLangs.ts" diff --git a/tests/js/scripts/get-builtin-test-langs.js b/tests/js/scripts/get-builtin-test-langs.js index f1aa09a33..51f2dcf0a 100644 --- a/tests/js/scripts/get-builtin-test-langs.js +++ b/tests/js/scripts/get-builtin-test-langs.js @@ -1,8 +1,8 @@ -import fs from "fs-extra"; +import fs from "https://esm.sh/fs-extra@11.1.1"; import wget from "node-wget-js"; import unzipper from "unzipper"; -import path from "path"; -import os from "os"; +import path from "node:path"; +import os from "node:os"; const languages = { "agent-expression-store": { @@ -37,7 +37,7 @@ async function main() { let dest = dir + "/build/bundle.js"; if (url.slice(0, 8) != "https://" && url.slice(0, 7) != "http://") { if (os.platform() == "win32") url = url.replace(/\//g, "\\"); - fs.copyFileSync(path.join(process.cwd(), url), dest); + fs.copyFileSync(path.join(Deno.cwd(), url), dest); } else { wget({ url, dest }); } From 0c79c2c39b3d776b95a7593b0a46dd5ce610cec1 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Wed, 18 Oct 2023 20:00:35 +0100 Subject: [PATCH 74/87] remove crypto import in tests & have tests/js use link:../core ad4m --- tests/js/package.json | 2 +- tests/js/tests/integration.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/js/package.json b/tests/js/package.json index 2a6e071b5..ea29bade1 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@apollo/client": "3.7.10", "@peculiar/webcrypto": "^1.1.7", - "@perspect3vism/ad4m": "*", + "@perspect3vism/ad4m": "link:../../core", "@types/chai": "*", "@types/chai-as-promised": "*", "@types/expect": "*", diff --git a/tests/js/tests/integration.test.ts b/tests/js/tests/integration.test.ts index 99d526136..fae54ac92 100644 --- a/tests/js/tests/integration.test.ts +++ b/tests/js/tests/integration.test.ts @@ -12,7 +12,7 @@ import languageTests from "./language"; import expressionTests from "./expression"; import neighbourhoodTests from "./neighbourhood"; import runtimeTests from "./runtime"; -import { Crypto } from "@peculiar/webcrypto" +//import { Crypto } from "@peculiar/webcrypto" import directMessageTests from "./direct-messages"; import agentLanguageTests from "./agent-language"; import socialDNATests from "./social-dna-flow"; @@ -25,7 +25,7 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); //@ts-ignore -global.crypto = new Crypto(); +//global.crypto = new Crypto(); const TEST_DIR = `${__dirname}/../tst-tmp` From fba7bf03a1a20479d7da31bf12a7264e18389bb5 Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 19 Oct 2023 14:27:06 +0530 Subject: [PATCH 75/87] Add cmake --- .github/workflows/integration_js.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/publish_staging.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 6d591c6bb..37f60aab0 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -60,7 +60,7 @@ jobs: - name: install system dependencies run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake - name: Install HC run: cargo install holochain_cli --version 0.2.2 || echo "hc already installed" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d8fd1e9ec..aaacbc780 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -76,7 +76,7 @@ jobs: if: matrix.platform == 'GH-hosted-ubuntu' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake - name: install dependencies (macos only) if: matrix.platform == 'macos-latest' diff --git a/.github/workflows/publish_staging.yml b/.github/workflows/publish_staging.yml index 1bc90776f..8d233bcca 100644 --- a/.github/workflows/publish_staging.yml +++ b/.github/workflows/publish_staging.yml @@ -68,7 +68,7 @@ jobs: if: matrix.platform == 'GH-hosted-ubuntu' run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler + sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf protobuf-compiler cmake - name: install dependencies (macos only) if: matrix.platform == 'macos-latest' From 2d55a5728edef194502c9576ccdc6c373d04bd2f Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 19 Oct 2023 16:12:33 +0530 Subject: [PATCH 76/87] Seperated integration tests --- .github/workflows/integration_js.yml | 3 +++ package.json | 1 + tests/js/package.json | 2 +- turbo.json | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 37f60aab0..c7139cec4 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -85,6 +85,9 @@ jobs: - name: Run the tests run: yarn test + - name: Run integration tests + run: yarn test-main + # test-windows: # name: JS Ad4mClient <> AD4M Executor - Windows # runs-on: windows-2019 diff --git a/package.json b/package.json index 97b58bb0f..c2119b6c1 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "test:macos": "turbo run test:macos --concurrency=1", "test:linux": "turbo run test:linux --concurrency=1", "test:windows": "turbo run test:windows --concurrency=1", + "test-main": "turbo run test-main", "package-ad4m": "turbo run package-ad4m", "build-languages": "turbo run build-languages --concurrency=1", "docs": "jsdoc -c jsdoc.json", diff --git a/tests/js/package.json b/tests/js/package.json index ea29bade1..087fb3e69 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -4,7 +4,7 @@ "description": "Node.js package that allows the running/interfacing of AD4M Languages & Perspectives.", "type": "module", "scripts": { - "test": "node scripts/cleanTestingData.js && yarn run prepare-test && yarn run test-all && node scripts/cleanTestingData.js", + "test-main": "node scripts/cleanTestingData.js && yarn run prepare-test && yarn run test-all && node scripts/cleanTestingData.js", "test:windows": "yarn run prepare-test:windows && yarn run test-all:windows && node scripts/cleanTestingData.js", "test-all:windows": "node scripts/cleanup.js && yarn run test-simple && node scripts/cleanup.js && yarn run test-app && node scripts/cleanup.js && yarn run test-auth && node scripts/cleanup.js && yarn run test-integration && node scripts/cleanup.js && yarn run test-prolog-and-literals", "test-all": "yarn run test-simple && yarn run test-app && yarn run test-auth && yarn run test-integration && yarn run test-prolog-and-literals", diff --git a/turbo.json b/turbo.json index 7047c342d..d5fbd57bf 100644 --- a/turbo.json +++ b/turbo.json @@ -31,7 +31,7 @@ "serve": { "cache": false }, - + "test-main": {}, "test": { "dependsOn": ["^test"], "outputs": [] From 727478cd16a517bbb2fb56fd006cc835d529d9af Mon Sep 17 00:00:00 2001 From: Fayeed Pawaskar Date: Thu, 19 Oct 2023 16:34:44 +0530 Subject: [PATCH 77/87] Disable log of test that are just echoing some text --- bootstrap-languages/agent-language/package.json | 2 +- bootstrap-languages/direct-message-language/package.json | 2 +- bootstrap-languages/language-language/package.json | 2 +- bootstrap-languages/neighbourhood-language/package.json | 2 +- bootstrap-languages/perspective-language/package.json | 2 +- test-runner/package.json | 2 +- turbo.json | 1 - 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bootstrap-languages/agent-language/package.json b/bootstrap-languages/agent-language/package.json index ca7264e00..daaeee973 100644 --- a/bootstrap-languages/agent-language/package.json +++ b/bootstrap-languages/agent-language/package.json @@ -4,7 +4,7 @@ "description": "AD4M Language implementation for Holochain profile DNA", "main": "index.js", "scripts": { - "test": "echo \"No agent language integration tests\"", + "test-disabled": "echo \"No agent language integration tests\"", "rollup-icons": "rollup -c rollup.config.icons.js", "rollup-dna": "rollup -c rollup.config.hc-dna.js", "rollup-expression-ui": "rollup -c rollup.config.expression-ui.js", diff --git a/bootstrap-languages/direct-message-language/package.json b/bootstrap-languages/direct-message-language/package.json index 6b4c7df4e..5843e4ae7 100644 --- a/bootstrap-languages/direct-message-language/package.json +++ b/bootstrap-languages/direct-message-language/package.json @@ -5,7 +5,7 @@ "main": "index.js", "type": "module", "scripts": { - "test": "echo \"No direct message integration tests\"", + "test-disabled": "echo \"No direct message integration tests\"", "rollup-dna": "rollup -c rollup.config.hc-dna.js", "compile-dna": "cd hc-dna && ./build.sh && cd ..", "build-nix": "yarn run build-dna && tsc && rollup -c", diff --git a/bootstrap-languages/language-language/package.json b/bootstrap-languages/language-language/package.json index 949497e7d..b5a955314 100644 --- a/bootstrap-languages/language-language/package.json +++ b/bootstrap-languages/language-language/package.json @@ -4,7 +4,7 @@ "description": "An AD4M Language for storing of language bundles on Cloudflare", "main": "index.js", "scripts": { - "test": "echo \"No language language integration tests\"", + "test-disabled": "echo \"No language language integration tests\"", "build": "deno run --allow-all esbuild.ts" }, "author": "joshuadparkin@gmail.com", diff --git a/bootstrap-languages/neighbourhood-language/package.json b/bootstrap-languages/neighbourhood-language/package.json index 489af977e..44d99d595 100644 --- a/bootstrap-languages/neighbourhood-language/package.json +++ b/bootstrap-languages/neighbourhood-language/package.json @@ -4,7 +4,7 @@ "description": "This is a Language for storing AD4M neighbourhood objects", "main": "index.js", "scripts": { - "test": "echo \"No neighbourhood language integration tests\"", + "test-disabled": "echo \"No neighbourhood language integration tests\"", "build": "deno run --allow-all esbuild.ts" }, "author": "joshuadparkin@gmail.com", diff --git a/bootstrap-languages/perspective-language/package.json b/bootstrap-languages/perspective-language/package.json index a9ea2a1f3..6dcc80d2b 100644 --- a/bootstrap-languages/perspective-language/package.json +++ b/bootstrap-languages/perspective-language/package.json @@ -4,7 +4,7 @@ "description": "An AD4M Language for perspective snapshot expressions stored on IPFS", "main": "index.js", "scripts": { - "test": "echo \"No perspective language integration tests\"", + "test-disabled": "echo \"No perspective language integration tests\"", "rollup-icons": "rollup -c rollup.config.icons.js", "rollup-expression-ui": "rollup -c rollup.config.expression-ui.js", "build": "yarn run build:common", diff --git a/test-runner/package.json b/test-runner/package.json index 3cf73b24c..168faae31 100644 --- a/test-runner/package.json +++ b/test-runner/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "tsc", "build:util": "browserify build/client.js --standalone Bundle -p esmify > public/client.js", - "test": "echo \"Test runner integration tests disabled\"", + "test-disable": "echo \"Test runner integration tests disabled\"", "test-expression": "node build/cli.js --test ./example/expression.test.js --bundle \"example/languages/note-ipfs.js\" --meta '{\"name\":\"note-ipfs\",\"description\":\"IPFS based language for storing data\",\"sourceCodeLink\":\"https://github.com/perspect3vism/note-ipfs\",\"possibleTemplateParams\":[\"uid\",\"name\"]}'", "test-link": "node build/cli.js --test ./example/link.test.js --bundle \"example/languages/social-context.js\" --meta '{\"name\":\"social-context\",\"description\":\"Shortform expression for flux application\",\"sourceCodeLink\":\"https://github.com/juntofoundation/ad4m-languages\",\"possibleTemplateParams\":[\"uid\",\"name\"]}'", "test-ui": "node build/cli.js --ui --bundle \"example/languages/note-ipfs.js\" --meta '{\"name\":\"note-ipfs\",\"description\":\"Shortform expression for flux application\",\"sourceCodeLink\":\"https://github.com/juntofoundation/ad4m-languages\",\"possibleTemplateParams\":[\"uid\",\"name\"]}'", diff --git a/turbo.json b/turbo.json index d5fbd57bf..95da21f28 100644 --- a/turbo.json +++ b/turbo.json @@ -33,7 +33,6 @@ }, "test-main": {}, "test": { - "dependsOn": ["^test"], "outputs": [] }, "test:macos": { From d89d675b9187a868d95ee538ab8824f95937a4a6 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 19 Oct 2023 12:58:42 +0100 Subject: [PATCH 78/87] try and run integration tests not through turbo --- .github/workflows/integration_js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index c7139cec4..737628ce0 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -86,7 +86,7 @@ jobs: run: yarn test - name: Run integration tests - run: yarn test-main + run: cd ./tests/js && yarn run test-main # test-windows: # name: JS Ad4mClient <> AD4M Executor - Windows From 98e6518a759c6170ff98c31ac301d86a8679fdb3 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 19 Oct 2023 19:16:38 +0100 Subject: [PATCH 79/87] use new scryer import & disable linux integration tests :( --- .github/workflows/integration_js.yml | 4 ++-- Cargo.lock | 2 +- rust-executor/Cargo.toml | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/integration_js.yml b/.github/workflows/integration_js.yml index 737628ce0..98fd82b3e 100644 --- a/.github/workflows/integration_js.yml +++ b/.github/workflows/integration_js.yml @@ -85,8 +85,8 @@ jobs: - name: Run the tests run: yarn test - - name: Run integration tests - run: cd ./tests/js && yarn run test-main + # - name: Run integration tests + # run: cd ./tests/js && yarn run test-main # test-windows: # name: JS Ad4mClient <> AD4M Executor - Windows diff --git a/Cargo.lock b/Cargo.lock index fdff806ac..3cde04344 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10507,7 +10507,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scryer-prolog" version = "0.9.1" -source = "git+https://github.com/coasys/scryer-prolog?branch=ad4m-compatible#7d78acf2f99b6177fb9a6f14d1021772f1416cf7" +source = "git+https://github.com/coasys/scryer-prolog?rev=0e90381eee2d455bf34be0209ef29996daf51c65#0e90381eee2d455bf34be0209ef29996daf51c65" dependencies = [ "base64 0.12.3", "bit-set", diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index dc9560fb2..1066caadb 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -71,8 +71,7 @@ holochain_cli_bundle = { version = "0.2.2" } holochain_types = { version = "0.2.2" } holochain_cli_run_local_services = { version = "0.2.2" } -scryer-prolog = { version = "0.9.1", git = "https://github.com/coasys/scryer-prolog", branch = "ad4m-compatible", features = ["multi_thread"] } -# scryer-prolog = { version = "0.9.1", git = "https://github.com/coasys/scryer-prolog", rev = "ce1c8aac4ccc0a49ce4816c0870634a703b1fc1f" } +scryer-prolog = { version = "0.9.1", git = "https://github.com/coasys/scryer-prolog", rev = "0e90381eee2d455bf34be0209ef29996daf51c65", features = ["multi_thread"] } # scryer-prolog = { path = "../../scryer-prolog", features = ["multi_thread"] } [dev-dependencies] From 3448f42acb062f0176f8ae0b9b7c74a46d4b3f5b Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 19 Oct 2023 21:09:16 +0100 Subject: [PATCH 80/87] add missing dna.js file in p diff sync socket signaling --- bootstrap-languages/p-diff-sync-socket-signaling/.gitignore | 2 +- bootstrap-languages/p-diff-sync-socket-signaling/dna.js | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 bootstrap-languages/p-diff-sync-socket-signaling/dna.js diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore index 09c11a0c7..1e20edbed 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore +++ b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore @@ -12,7 +12,7 @@ perspect-diff-sync.dna *.js *.js.map !rollup.config* -!.dna.js +!dna.js !integration-test.js !customHttpDownloader.js diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/dna.js b/bootstrap-languages/p-diff-sync-socket-signaling/dna.js new file mode 100644 index 000000000..4bb2f7cf2 --- /dev/null +++ b/bootstrap-languages/p-diff-sync-socket-signaling/dna.js @@ -0,0 +1,5 @@ +import dna from "./hc-dna/workdir/perspective-diff-sync.dna"; + +export const DNA = Buffer.from(dna, "base64"); +export const DNA_NICK = "perspective-diff-sync"; +export const ZOME_NAME = "perspective_diff_sync"; \ No newline at end of file From 20dff3ff0544fb816785dc7ae5eac8ca04c6a887 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Thu, 19 Oct 2023 21:12:40 +0100 Subject: [PATCH 81/87] add dna.js in bundle to .gitignore --- bootstrap-languages/p-diff-sync-socket-signaling/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore index 1e20edbed..fec3181ae 100644 --- a/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore +++ b/bootstrap-languages/p-diff-sync-socket-signaling/.gitignore @@ -13,6 +13,7 @@ perspect-diff-sync.dna *.js.map !rollup.config* !dna.js +build/dna.js !integration-test.js !customHttpDownloader.js From d69d01ba8ca0e0f949f0f76970b0d3d7ecfa8298 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 09:56:27 +0100 Subject: [PATCH 82/87] update juniper dep to specifc commit & lock files --- Cargo.lock | 20 ++++++++++---------- rust-executor/Cargo.toml | 8 ++++---- yarn.lock | 5 ++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3cde04344..21f2eb089 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3887,9 +3887,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "libz-ng-sys", @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "juniper" version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "async-trait", "bson", @@ -6350,7 +6350,7 @@ dependencies = [ [[package]] name = "juniper_codegen" version = "0.16.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "proc-macro-error", "proc-macro2 1.0.66", @@ -6362,7 +6362,7 @@ dependencies = [ [[package]] name = "juniper_graphql_transport_ws" version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "juniper", "juniper_graphql_ws", @@ -6374,7 +6374,7 @@ dependencies = [ [[package]] name = "juniper_graphql_ws" version = "0.4.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "juniper", "juniper_subscriptions", @@ -6385,7 +6385,7 @@ dependencies = [ [[package]] name = "juniper_subscriptions" version = "0.17.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "futures", "juniper", @@ -6394,7 +6394,7 @@ dependencies = [ [[package]] name = "juniper_warp" version = "0.8.0-dev" -source = "git+https://github.com/graphql-rust/juniper#801820a3b67389ee567f0c540a4d6a8a3b8d9fbc" +source = "git+https://github.com/graphql-rust/juniper?rev=57628de8649be071b04a3fedb45c47add7dc5192#57628de8649be071b04a3fedb45c47add7dc5192" dependencies = [ "anyhow", "futures", @@ -12720,9 +12720,9 @@ dependencies = [ [[package]] name = "tokio-metrics" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b2fc67d5dec41db679b9b052eb572269616926040b7831e32c8a152df77b84" +checksum = "eace09241d62c98b7eeb1107d4c5c64ca3bd7da92e8c218c153ab3a78f9be112" dependencies = [ "futures-util", "pin-project-lite", diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index 1066caadb..669987aff 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -58,10 +58,10 @@ hyper-util = { git = "https://github.com/hyperium/hyper-util.git" } rust-embed="8.0.0" dirs = "5.0.1" -juniper = { git = "https://github.com/graphql-rust/juniper", features = ["chrono"] } -juniper_subscriptions = { git = "https://github.com/graphql-rust/juniper" } -juniper_graphql_transport_ws = { git = "https://github.com/graphql-rust/juniper" } -juniper_warp = { git = "https://github.com/graphql-rust/juniper", features = ["subscriptions"] } +juniper = { git = "https://github.com/graphql-rust/juniper", features = ["chrono"], rev = "57628de8649be071b04a3fedb45c47add7dc5192" } +juniper_subscriptions = { git = "https://github.com/graphql-rust/juniper", rev = "57628de8649be071b04a3fedb45c47add7dc5192" } +juniper_graphql_transport_ws = { git = "https://github.com/graphql-rust/juniper", rev = "57628de8649be071b04a3fedb45c47add7dc5192" } +juniper_warp = { git = "https://github.com/graphql-rust/juniper", features = ["subscriptions"], rev = "57628de8649be071b04a3fedb45c47add7dc5192" } warp = "0.3.4" jsonwebtoken = "8.3.0" diff --git a/yarn.lock b/yarn.lock index 7fd733fd1..c796680e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1900,9 +1900,8 @@ lodash-es "^4.17.21" ws "^8.13.0" -"@holochain/client@github:perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b", "@holochain/client@perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b": +"@holochain/client@perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b": version "0.12.5" - uid "2f3a436b6d28344b0aca883ef3dc229cd042c04b" resolved "https://codeload.github.com/perspect3vism/holochain-client-js/tar.gz/2f3a436b6d28344b0aca883ef3dc229cd042c04b" dependencies: "@holochain/serialization" "^0.1.0-beta-rc.3" @@ -5206,7 +5205,7 @@ apollo-utilities@1.3.4, apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: ts-invariant "^0.4.0" tslib "^1.10.0" -"appdata-path@github:perspect3vism/appdata-path", appdata-path@perspect3vism/appdata-path: +appdata-path@perspect3vism/appdata-path: version "1.0.0" resolved "https://codeload.github.com/perspect3vism/appdata-path/tar.gz/6304ea16cbfebc98749c33941d643c3046b45985" From ab1d764eb679f868c405003f166481fe8c278201 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 09:58:16 +0100 Subject: [PATCH 83/87] update to version 0.7.0 --- Cargo.lock | 8 ++++---- bootstrap-languages/agent-language/package.json | 2 +- bootstrap-languages/direct-message-language/package.json | 2 +- bootstrap-languages/neighbourhood-language/package.json | 2 +- bootstrap-languages/p-diff-sync/package.json | 2 +- bootstrap-languages/perspective-language/package.json | 2 +- cli/Cargo.toml | 2 +- connect/package.json | 2 +- core/package.json | 2 +- docs/package.json | 2 +- executor/package.json | 2 +- executor/src/core/Config.ts | 2 +- package.json | 2 +- rust-client/Cargo.toml | 2 +- rust-executor/Cargo.toml | 2 +- rust-executor/package.json | 2 +- rust-executor/src/globals.rs | 4 ++-- test-runner/package.json | 2 +- tests/js/package.json | 2 +- ui/package.json | 2 +- ui/src-tauri/Cargo.toml | 2 +- ui/src-tauri/tauri.conf.json | 2 +- 22 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 21f2eb089..437e00c30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,7 +14,7 @@ dependencies = [ [[package]] name = "ad4m" -version = "0.6.1-prerelease.0" +version = "0.7.0" dependencies = [ "ad4m-client", "anyhow", @@ -38,7 +38,7 @@ dependencies = [ [[package]] name = "ad4m-client" -version = "0.6.1-prerelease" +version = "0.7.0" dependencies = [ "anyhow", "async-tungstenite", @@ -62,7 +62,7 @@ dependencies = [ [[package]] name = "ad4m-launcher" -version = "0.6.1-prerelease.0" +version = "0.7.0" dependencies = [ "ad4m-client", "chrono", @@ -10202,7 +10202,7 @@ dependencies = [ [[package]] name = "rust-executor" -version = "0.6.1-prerelease" +version = "0.7.0" dependencies = [ "argon2", "base64 0.21.3", diff --git a/bootstrap-languages/agent-language/package.json b/bootstrap-languages/agent-language/package.json index daaeee973..035b83fcf 100644 --- a/bootstrap-languages/agent-language/package.json +++ b/bootstrap-languages/agent-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/agent-language", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "AD4M Language implementation for Holochain profile DNA", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/direct-message-language/package.json b/bootstrap-languages/direct-message-language/package.json index 5843e4ae7..58d4a120c 100644 --- a/bootstrap-languages/direct-message-language/package.json +++ b/bootstrap-languages/direct-message-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/direct-message-language", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "A templateable AD4M Language for personal, per-agent direct message Languages", "main": "index.js", "type": "module", diff --git a/bootstrap-languages/neighbourhood-language/package.json b/bootstrap-languages/neighbourhood-language/package.json index 44d99d595..7abde9762 100644 --- a/bootstrap-languages/neighbourhood-language/package.json +++ b/bootstrap-languages/neighbourhood-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/neighbourhood-language", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "This is a Language for storing AD4M neighbourhood objects", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/p-diff-sync/package.json b/bootstrap-languages/p-diff-sync/package.json index b5c18527e..20474f482 100644 --- a/bootstrap-languages/p-diff-sync/package.json +++ b/bootstrap-languages/p-diff-sync/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/perspective-diff-sync", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "An AD4M language for syncing mutations to a share perspective", "main": "index.js", "scripts": { diff --git a/bootstrap-languages/perspective-language/package.json b/bootstrap-languages/perspective-language/package.json index 6dcc80d2b..02036f9ca 100644 --- a/bootstrap-languages/perspective-language/package.json +++ b/bootstrap-languages/perspective-language/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/perspective-language", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "An AD4M Language for perspective snapshot expressions stored on IPFS", "main": "index.js", "scripts": { diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 6d92dccaa..e15fc4d22 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m" -version = "0.6.1-prerelease.0" +version = "0.7.0" edition = "2021" authors = ["Nicolas Luck "] description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" diff --git a/connect/package.json b/connect/package.json index 1ae273f7d..877d4c4dc 100644 --- a/connect/package.json +++ b/connect/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-connect", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Lib for handling everything needed to setup a connection to a local or remote ad4m-executor", "license": "CAL-1.0", "main": "dist/web.js", diff --git a/core/package.json b/core/package.json index 1ee904b48..b7d561c12 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "*The Agent-Centric Distributed Application Meta-ontology* or just: *Agent-Centric DApp Meta-ontology* * A new meta-ontology for interoperable, decentralized application design * A spanning-layer to enable seamless integration between Holochain DNAs, blockchains, linked-data structures/ontologies and centralized back-ends * The basis for turning distinct, monolithic and siloed apps into a global, open and interoperable sense-making network", "main": "lib/index.cjs", "module": "lib/index.js", diff --git a/docs/package.json b/docs/package.json index 5e5d8f626..f7eb239eb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-docs", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Documentation for AD4M", "license": "CAL-1.0", "homepage": "./", diff --git a/executor/package.json b/executor/package.json index 260a97aa7..9c915a77f 100644 --- a/executor/package.json +++ b/executor/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-executor", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Node.js package that allows the running/interfacing of AD4M Languages & Perspectives.", "main": "lib/main.js", "files": [ diff --git a/executor/src/core/Config.ts b/executor/src/core/Config.ts index 11e29622f..2f31099f9 100644 --- a/executor/src/core/Config.ts +++ b/executor/src/core/Config.ts @@ -2,7 +2,7 @@ import * as path from 'node:path'; import * as fs from 'node:fs'; import { Address, Expression } from '@perspect3vism/ad4m'; -export let ad4mExecutorVersion = "0.6.1-prerelease"; +export let ad4mExecutorVersion = "0.7.0"; export let agentLanguageAlias = "did"; export let languageLanguageAlias = "lang"; export let neighbourhoodLanguageAlias = "neighbourhood"; diff --git a/package.json b/package.json index c2119b6c1..31a26fe86 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ad4m-monorepo", - "version": "0.6.1-prerelease", + "version": "0.7.0", "workspaces": [ "core", "docs", diff --git a/rust-client/Cargo.toml b/rust-client/Cargo.toml index 88219f891..755ba6aab 100644 --- a/rust-client/Cargo.toml +++ b/rust-client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-client" -version = "0.6.1-prerelease" +version = "0.7.0" edition = "2021" authors = ["Nicolas Luck "] description = "Client library wrapping AD4M's GraphQL interface" diff --git a/rust-executor/Cargo.toml b/rust-executor/Cargo.toml index 669987aff..afcb05c51 100644 --- a/rust-executor/Cargo.toml +++ b/rust-executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust-executor" -version = "0.6.1-prerelease" +version = "0.7.0" edition = "2021" authors = ["Nicolas Luck "] description = "A command-line interface to AD4M (i.e. the AD4M executor) - https://ad4m.dev" diff --git a/rust-executor/package.json b/rust-executor/package.json index 19a83abf0..4911d074a 100644 --- a/rust-executor/package.json +++ b/rust-executor/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/rust-ad4m-executor", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Rust built version of the ad4m-executor, exposing GraphQL methods for AD4M", "main": "", "files": [], diff --git a/rust-executor/src/globals.rs b/rust-executor/src/globals.rs index de8590c38..8f13e0f51 100644 --- a/rust-executor/src/globals.rs +++ b/rust-executor/src/globals.rs @@ -2,7 +2,7 @@ use lazy_static::lazy_static; lazy_static! { /// The current version of AD4M - pub static ref AD4M_VERSION: String = String::from("0.6.1-prerelease"); + pub static ref AD4M_VERSION: String = String::from("0.7.0"); } /// Struct representing oldest supported version and indicator if state should be cleared if update is required @@ -14,7 +14,7 @@ pub struct OldestVersion { lazy_static! { /// The oldest version of the AD4M protocol that this executor supports pub static ref OLDEST_VERSION: OldestVersion = OldestVersion { - version: String::from("0.6.0"), + version: String::from("0.7.0"), clear_state: true, }; } diff --git a/test-runner/package.json b/test-runner/package.json index 168faae31..a9e5b4f9d 100644 --- a/test-runner/package.json +++ b/test-runner/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-test", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Testing library to test ad4m languages", "license": "MIT", "bin": "./build/cli.js", diff --git a/tests/js/package.json b/tests/js/package.json index 087fb3e69..94b0acaaa 100644 --- a/tests/js/package.json +++ b/tests/js/package.json @@ -1,6 +1,6 @@ { "name": "@perspect3vism/ad4m-integration-tests", - "version": "0.6.1-prerelease", + "version": "0.7.0", "description": "Node.js package that allows the running/interfacing of AD4M Languages & Perspectives.", "type": "module", "scripts": { diff --git a/ui/package.json b/ui/package.json index 721ea810e..98813e83c 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "ad4m-launcher", - "version": "0.6.1-prerelease", + "version": "0.7.0", "private": true, "type": "module", "dependencies": { diff --git a/ui/src-tauri/Cargo.toml b/ui/src-tauri/Cargo.toml index 8b118012e..214002e10 100644 --- a/ui/src-tauri/Cargo.toml +++ b/ui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ad4m-launcher" -version = "0.6.1-prerelease.0" +version = "0.7.0" description = "Administration of ad4m services" authors = ["Kaichao Sun"] license = "" diff --git a/ui/src-tauri/tauri.conf.json b/ui/src-tauri/tauri.conf.json index 078865eb6..6508971af 100644 --- a/ui/src-tauri/tauri.conf.json +++ b/ui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "ADAM Launcher", - "version": "0.6.1-prerelease" + "version": "0.7.0" }, "build": { "distDir": "../dist", From 6c8e253e90596d5bb55632f42d658f6a20735782 Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 10:03:35 +0100 Subject: [PATCH 84/87] 0.7.0 changelog --- CHANGELOG | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 92ee93011..0bb498c63 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -15,6 +15,24 @@ This project _loosely_ adheres to [Semantic Versioning](https://semver.org/spec/ ### Fixed +## [0.7.0] - 20/10/2023 + +### Added + - Tauri auto updates (In app ad4m launcher updates) [#304](https://github.com/coasys/ad4m/pull/304) + - Two new Link Languages! Holochain + Socket Signaling & Pure Centralized implementation [#413](https://github.com/coasys/ad4m/pull/413) + - Pagination Predicate support into Prolog Engine + +### Changed + - Update core Deno engine to latest version (and use Deno core node modules) [#410](https://github.com/coasys/ad4m/pull/410) + +### Deprecated + +### Removed + +### Fixed + - Launcher not working in Windows [#410](https://github.com/coasys/ad4m/pull/410) + - Cargo caching on Linux CI [#410](https://github.com/coasys/ad4m/pull/410) + ## [0.6.0] - 22/09/2023 ### Added From 017db9d056e2655878a6b601105e49a76d7f9f7f Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 10:25:41 +0100 Subject: [PATCH 85/87] fix type-graphql shim --- core/shims/type-graphql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/shims/type-graphql.ts b/core/shims/type-graphql.ts index 9eca10271..f6de0621a 100644 --- a/core/shims/type-graphql.ts +++ b/core/shims/type-graphql.ts @@ -34,7 +34,7 @@ ``` */ -import * as src from "../../node_modules/type-graphql/dist/index.js"; +import * as src from "../node_modules/type-graphql/dist/index.js"; export const dummyValue = ""; export function dummyFn() { From d2e3be0b77983216d99f37e5cc0123f96ef2671c Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 10:42:57 +0100 Subject: [PATCH 86/87] remove types jest from connect tsconfig --- connect/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connect/tsconfig.json b/connect/tsconfig.json index 783169cb5..4d5c78a8a 100644 --- a/connect/tsconfig.json +++ b/connect/tsconfig.json @@ -9,7 +9,7 @@ "moduleResolution": "Node", "resolveJsonModule": true, "allowSyntheticDefaultImports": true, - "types": ["node", "jest"], + "types": ["node"], "skipLibCheck": true }, "include": ["./src"], From 10c35aa62ba162e3af03e8d519b070863e3a131f Mon Sep 17 00:00:00 2001 From: Joshua Parkin Date: Fri, 20 Oct 2023 10:43:35 +0100 Subject: [PATCH 87/87] add @types/glob to test-runner --- test-runner/package.json | 3 +- yarn.lock | 87 +++++----------------------------------- 2 files changed, 13 insertions(+), 77 deletions(-) diff --git a/test-runner/package.json b/test-runner/package.json index a9e5b4f9d..5f3a116f5 100644 --- a/test-runner/package.json +++ b/test-runner/package.json @@ -50,7 +50,8 @@ "devDependencies": { "@types/express": "^4.17.13", "@types/uuid": "^8.3.2", - "browserify": "^17.0.0" + "browserify": "^17.0.0", + "@types/glob": "8.1.0" }, "exports": { ".": "./build/cli.js", diff --git a/yarn.lock b/yarn.lock index c796680e3..7a7a5a1da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2760,31 +2760,8 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" -"@perspect3vism/ad4m-executor@*": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m-executor/-/ad4m-executor-0.6.0.tgz#e1ae599e7ebea06b3a4be53d782504cc93e99021" - integrity sha512-oIVXaXOHEiUyu7yZSXejI4OyZpdPdd7XfGAnSd96pReiRr/NU6gAMSwv9Lw6yz9VCW9TroBUk4VLrlLouhgjdA== - dependencies: - "@holochain/client" perspect3vism/holochain-client-js#2f3a436b6d28344b0aca883ef3dc229cd042c04b - "@msgpack/msgpack" "3.0.0-beta2" - "@noble/secp256k1" "^1.7.0" - "@perspect3vism/ad4m" "*" - "@transmute/did-key.js" "^0.2.1-unstable.29" - "@types/json-stable-stringify" "^1.0.33" - "@types/mocha" "^10.0.0" - aloedb-node "^1.1.1" - async-mutex "^0.3.2" - get-port "5.1.1" - js-yaml "^4.1.0" - json-stable-stringify "^1.0.1" - linkedom "^0.14.26" - lodash "^4.17.21" - sha256 "^0.2.0" - tmp "^0.2.1" - uuid "*" - "@perspect3vism/ad4m-executor@link:core": - version "0.6.1-prerelease" + version "0.7.0" dependencies: "@apollo/client" "3.7.10" "@apollo/server" "^4.9.4" @@ -2796,58 +2773,8 @@ reflect-metadata "^0.1.13" type-graphql "1.1.1" -"@perspect3vism/ad4m-test@*": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m-test/-/ad4m-test-0.6.0.tgz#a295bc414684b00b63c0f16815b0c63a0ec7804f" - integrity sha512-HQS9+P5pPjE7X41wqzjUiXy4VManc6br87jL4YLrXPokp2q9RqgIDUiY/OKVnk3sgSjhGTgAhrl2zK/JbLF98Q== - dependencies: - "@apollo/client" "3.7.10" - "@perspect3vism/ad4m" "*" - "@types/fs-extra" "^9.0.13" - "@types/node" "^18.0.0" - "@types/node-fetch" "^2.6.1" - "@types/unzipper" "^0.10.5" - "@types/ws" "8.5.4" - "@types/yargs" "^17.0.8" - appdata-path perspect3vism/appdata-path - chalk "4.1.2" - esm "^3.2.25" - esmify "^2.1.1" - express "4.18.2" - find-process "^1.4.7" - fs-extra "^10.0.1" - get-port "5.1.1" - glob "^7.2.0" - graphql "15.7.2" - graphql-ws "5.12.0" - node-fetch "2" - node-wget-js "^1.0.1" - subscriptions-transport-ws "^0.11.0" - tree-kill "^1.2.2" - ts-node "^10.5.0" - typescript "^4.6.2" - unzipper "^0.10.11" - uuid "^8.3.2" - wget-improved "^3.3.0" - ws "8.13.0" - yargs "^17.3.1" - -"@perspect3vism/ad4m@*": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@perspect3vism/ad4m/-/ad4m-0.6.0.tgz#594c50189133f6a7becaa7908c146f5e42707fa3" - integrity sha512-E069bVC7WTR7eN6dB5WXN7rc+9TWbd4KkLvJVdHyJty02RxfOyFIbDAGy4C5tgmbg5wTKJI+tka8xZ9QTiXEaQ== - dependencies: - "@apollo/client" "3.7.10" - "@holochain/client" "0.16.0" - "@types/jest" "^26.0.14" - class-validator "^0.13.1" - express "4.18.2" - graphql "15.7.2" - reflect-metadata "^0.1.13" - type-graphql "1.1.1" - "@perspect3vism/ad4m@link:core": - version "0.6.1-prerelease" + version "0.7.0" dependencies: "@apollo/client" "3.7.10" "@apollo/server" "^4.9.4" @@ -4024,6 +3951,14 @@ dependencies: "@types/node" "*" +"@types/glob@8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== + dependencies: + "@types/minimatch" "^5.1.2" + "@types/node" "*" + "@types/glob@^7.1.3": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -4203,7 +4138,7 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== -"@types/minimatch@*": +"@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==